我如何从mediawiki获取数据

时间:2011-05-24 14:45:33

标签: php mediawiki-api

您好我正在使用以下api从mediawiki获取数据。当我复制此URL并将其粘贴到浏览器中时,会出现xml响应。 http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=API|Main_Page&rvprop=timestamp|user|comment|content

但是当我尝试使用curl时,它会给出错误“脚本应该使用带有联系信息的信息性用户代理字符串,否则它们可能会被IP阻止,恕不另行通知。”。

我正在使用以下代码。任何人都可以追踪我的错误吗?

$url='http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=API|Main_Page&rvprop=timestamp|user|comment|content';
$curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url); 
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
        $objResponse = curl_exec($curl);
        curl_close($curl);

        echo $objResponse;die;

2 个答案:

答案 0 :(得分:0)

这将绕过引用者用户代理检查:

    <?php


    function getwiki($url="", $referer="", $userAgent="") {
        if($url==""||$referer==""||$userAgent=="") { return false;};
        $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
        $headers[] = 'Connection: Keep-Alive';
        $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
        $user_agent = $userAgent;
        $process = curl_init($url);
        curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_USERAGENT, $user_agent);
        curl_setopt($process, CURLOPT_REFERER, $referer);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $return = curl_exec($process);
        curl_close($process);
        return $return;
    }

    //edited to include Adam Backstrom's sound advice
    echo getwiki('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=API|Main_Page&rvprop=timestamp|user|comment|content', 'http://en.wikipedia.org/', 'Mozilla/5.0 (compatible; YourCoolBot/1.0; +http://yoursite.com/botinfo)');

    ?>

答案 1 :(得分:0)

来自MediaWiki API:Quick start guide

  

传递正确标识客户端的User-Agent标头:不要使用客户端库中的默认User-Agent,而是使用自定义的User-Agent,包括客户端名称和版本号,如MyCuteBot / 0.1

     

在维基媒体wiki上,如果未提供User-Agent标头或提供空标头或通用标头,将导致请求失败,并显示HTTP 403错误。见meta:User-Agent policy。其他MediaWiki wiki可能有类似的政策。

来自meta:User-Agent policy

  

如果你运行机器人,请发送一个用户代理标题,标识机器人并提供一些联系方式,例如:User-Agent:MyCoolTool(+ http://example.com/MyCoolToolPage/)