如何在Wiki扩展(WPMW)中使用Wiki Media API工具来编写/添加内容到页面

时间:2015-02-10 19:37:33

标签: php wordpress mediawiki mediawiki-api

嘿那里!

以下是场景:

我正在开发 Wordpress 网站,该网站应将其用户集成到 Media Wiki 设置中。使用名为WPMW的Media Wiki扩展程序,一切都运行良好。当来自Wordpress的用户登录时,他们会自动添加到Media Wiki用户数据库,并且他们也会加入Wiki。 到目前为止成功。

以下是我需要做的事情:

我需要在Wordpress + Media Wiki用户登录(通过WPMW扩展)后,找到一种方法来根据我从流程中当前用户收集的信息更新单个特定的Media Wiki页面。例如:当Wordpress用户调用 Olaf 编辑角色)时,连接到Media Wiki,我想简单地写(追加)到一个特殊的Wiki页面(称为编辑)名称 Olaf ,将与其他现有名称一起使用。

所以我研究了 Media Wiki API ,然后按照一些例子,我能够创建一个PHP文件,在服务器上访问后,它找到一个特定的代码并附加文本到它(甚至使用之前构建的Media Wiki模板)。 再次成功,但仅限于独立使用......我需要访问example.com/my-script.php才能使其正常运行。

以下是问题:

我试图在WPMW扩展中插入我的API代码,但很明显事情并不简单,所有内容都停止工作。所以,我想知道,正确的方法是,在Media Wiki扩展中,调用Media Wiki API 并指示它将文本附加到Media Wiki页面,基于在WPMW登录执行时出现PHP变量

例如:当Olaf(编辑)登录Wordpress并进入Wiki时,WPMW扩展将变为活动并建立桥梁 - 通过自动注册Olaf到Wiki数据库(如果这是他第一次) - 或者只需将Olaf记录到Media Wiki网站即可。

此时,我可以从Wordpress获取所有与我相关的数据,用户名用户角色。但是如何使用它们追加 Olaf 名称到名为编辑 Wiki页面

以下是我的API代码,基于我找到的示例:

<?php
$settings['wikiroot'] = "http://example.com/wiki";
$settings['user'] =  "shangchi";
$settings['pass'] =  "my-password";
$settings['domain'] = 'Windows';
$settings['cookiefile'] = "cookies.tmp";

// Test: use a Wiki template to append to page
$prepend = "{{test}}\n\n";


function httpRequest($url, $post="") {
        global $settings;

        $ch = curl_init();
        //Change the user agent below suitably
        curl_setopt($ch, CURLOPT_USERAGENT, 'application/x-www-form-urlencoded');
        curl_setopt($ch, CURLOPT_URL, ($url));
        curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        if (!empty($post)) curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
        #UNCOMMENT TO DEBUG TO output.tmp
        curl_setopt($ch, CURLOPT_VERBOSE, true); // Display communication with server
        $fp = fopen("output.tmp", "w");
        curl_setopt($ch, CURLOPT_STDERR, $fp); // Display communication with server

        $xml = curl_exec($ch);

        if (!$xml) {
                throw new Exception("Error getting data from server ($url): " . curl_error($ch));
        }

        //var_dump($xml);

        curl_close($ch);

        return $xml;
}


function login ($user, $pass, $token='') {
        global $settings;

        $url = $settings['wikiroot'] . "/api.php?action=login&format=xml";

        $params = "action=login&lgname=$user&lgpassword=$pass";
        if (!empty($settings['domain'])) {
            $params .= "&lgdomain=" . $settings['domain'];
        }
        if (!empty($token)) {
                $params .= "&lgtoken=$token";
        }

        $data = httpRequest($url, $params);

        if (empty($data)) {
                throw new Exception("No data received from server. Check that API is enabled.");
        }

        $xml = simplexml_load_string($data);

        if (!empty($token)) {
                //Check for successful login
                $expr = "/api/login[@result='Success']";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login failed");
                }
        } else {
                $expr = "/api/login[@token]";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login token not found in XML");
                }
        }

        return $result[0]->attributes()->token;
}


try {
        global $settings;
        $token = login($settings['user'], $settings['pass']);
        login($settings['user'], $settings['pass'], $token);

        // get edit token
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&format=json&meta=tokens");

        $result = json_decode($result);
        $editToken = $result->query->tokens->csrftoken;

        // Get a specific wiki page: Main Page for testing
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&titles=Main%20Page&format=json&aplimit=500");
        $result = json_decode($result);
        $allpages = $result->query->pages;

        foreach ($allpages as $page) {
            echo "Fetching '{$page->title}' ({$page->pageid})...\n";
            $revisions = httpRequest(sprintf($settings['wikiroot'] . "/api.php?action=query&prop=revisions&rvlimit=1&format=json&rvprop=content&titles=%s", urlencode($page->title)));
            $revisions = json_decode($revisions);
            if (isset($revisions->error)) {
                echo "ERROR: " . $revisions->error->info . "\n";
                continue;
            }
            $content = $revisions->query->pages->{$page->pageid}->revisions[0]->$star;
            if (preg_match("/\{\{migration_/", $content)) {
                echo "Already marked ... skipping.\n";
                continue;
            }
            echo "Updating...";
            // add text to content and edit page
            $content = $prepend . $content;
            $post = sprintf("title=%s&text=%s&token=%s", urlencode($page->title), urlencode($content), urlencode($editToken));
            $result = httpRequest($settings['wikiroot'] . "/api.php?action=edit&format=json", $post);
            echo "done\n";
        }
        echo ("Finished (".sizeof($allpages)." pages).\n");
} catch (Exception $e) {
        die("FAILED: " . $e->getMessage());
}

?>

1 个答案:

答案 0 :(得分:0)

首先,请参阅this article了解内部调用API的正确方法。

其次,对事件做出反应的正确方法是使用hook(在您的情况下,可能是AddNewAccount)。

第三,你确定要通过编辑普通页面来做到这一点吗?创建一个只生成用户列表的特殊页面对我来说就不那么麻烦了。