我们需要实现一个在Wikipedia Talk页面上发布新部分的机器人。
为了提高效率,我们更倾向于使用MediaWiki API而不是可用的MediaWiki库来使用python HTTP POST请求。
我们没有要求批准机器人,我们只是试图在我们自己的Talk页面上实施试用版来测试机器人。
为此,我完成了以下步骤:
1-正如https://en.wikipedia.org/wiki/Wikipedia:Creating_a_bot所讨论的那样:
为您的机器人创建一个帐户。登录后单击此处以创建帐户,将其链接到您的帐户。 (如果您在登录时未创建僵尸程序帐户,则可能会在您验证所有权之前将其作为可能的sockpuppet或未经授权的僵尸程序阻止)
为您的机器人创建用户页面。您的机器人编辑不得在您自己的帐户下进行。您的机器人将需要自己的帐户和自己的用户名和密码。
所以,我登录了自己的维基百科帐户,并创建了一个新帐户(针对机器人)。
2-如“API:登录”页面所述:(抱歉,由于声誉低于10,我无法添加超过2个链接) 通过API登录需要两个请求。对于第一个请求,我在python中编写了以下代码:
def logInRequestToWikipedia():
# Add required parameters to the request.
request = { 'action' : 'login' }
request['lgname'] = 'BotName'
request['lgpassword'] = '*************'
url = 'https://en.wikipedia.org/w/api.php'
headers = { 'content-type' : 'application/x-www-form-urlencoded' }
r = requests.post(url, data = json.dumps(request), headers=headers)
响应以错误开头,如下所示:
<error code="help" info="" xml:space="preserve">
继续使用API文档。
3-如“API:编辑_-_创建%26Edit_pages”页面所述:
注意:在此示例中,仅为了简单起见,所有参数都在GET请求中传递。但是,action = edit需要POST请求; GET请求将导致错误。不要忘记将请求的Content-Type标头设置为application / x-www-form-urlencoded。您收到的令牌以+ \结尾,这需要在传回之前进行urlencoded(因此它将以%2B%5C结尾)。
我在请求数据中分别添加了以下每个参数,并尝试了所有三种情况,但它返回相同的响应。
request['lgtoken'] = '%2B%5C'
request['Content-Type'] = 'application/x-www-form-urlencoded'
4-此外,我在请求数据中尝试了以下各项,但它返回相同的响应:
request['format'] = 'json'
request['format'] = 'xml'
5-此外,我在“User-Agent_policy”页面找到了以下说明:
不发送User-Agent标头的用户代理(浏览器或脚本)现在可能会遇到如下错误消息:
脚本应使用带有联系信息的信息性用户代理字符串,否则它们可能会被IP阻止,恕不另行通知。 发送列入黑名单的User-Agent标头的用户代理(例如,任何以“lwp”开头的用户代理字符串,无论是否提供信息)都可能会遇到一个不太有用的错误消息(谎言),如下所示:
我们的服务器目前遇到技术问题。这可能是暂时的,应尽快解决。请在几分钟后再试一次。
此更改最有可能影响通过api.php或其他方式自动访问Wikipedia等维基媒体网站(如维基百科)和命令行程序的脚本(机器人)。[3]如果你运行机器人,请发送一个用户代理标题来识别机器人并提供一些联系方式,例如:
User-Agent:MyCoolTool / 1.1(http://example.com/MyCoolTool/; MyCoolTool@example.com)BasedOnSuperLib / 1.4
不要为浏览器复制浏览器的用户代理,因为浏览器的用户代理的类似bot的行为将被视为恶意。[4]有关更多信息,请参阅MediaWiki API文档
这就是为什么我也尝试使用以下参数编写脚本,但错误响应没有改变:
request['User-Agent'] = "MyCoolTool/1.1 (http://example.com/MyCoolTool/; MyCoolTool@example.com) BasedOnSuperLib/1.4"
您认为问题可能与我们尚未要求批准机器人这一事实有关吗?因为我们只是试图在我们自己的谈话页面上实施试用版来测试机器人,并在确保一切正常后申请批准。
答案 0 :(得分:3)
我很确定问题就在这一行:
request['lgtoken'] = '%2B%5C'
您链接的Login API在初始登录尝试时不包含lgtoken
;它仅使用token
响应中的NeedToken
值在第二个(&#34;确认令牌&#34;)步骤发送。
并且+\
看起来不像是有效令牌。
因此,您收到错误并不奇怪。
与此同时,当我用我的维基百科帐户对此进行测试时,如果我包含该行,则会出现错误,如果不包含该行,则会出现错误,这会使我怀疑这是否是问题。