如何创建一个维基百科机器人以向讨论页添加新部分?
我们需要做一个机器人,能够在维基百科的讨论页面上发布新内容。
为了提高效率,我们更倾向于使用Python的HTTP POST请求,通过MediaWiki的API来实现,而不是使用现成的MediaWiki库。
我们还没有申请机器人的批准,现在只是想先做一个试用版,在自己的讨论页面上测试一下这个机器人。
为此,我进行了以下步骤:
1- 根据这个链接的讨论:
为你的机器人创建一个账户。登录后点击这里创建账户,并将其与你的账户关联。(如果你在未登录的情况下创建机器人账户,可能会被认为是恶意账户或未授权的机器人,直到你验证所有权)
为你的机器人创建一个用户页面。机器人的编辑不能在你的个人账户下进行。你的机器人需要有自己的账户,拥有自己的用户名和密码。
所以,我先登录了自己的维基百科账户,然后为机器人创建了一个新账户。
2- 根据“API:Login”页面的讨论:(抱歉,由于声望不足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:Edit_-_Create%26Edit_pages”页面的讨论:
注意:在这个例子中,所有参数都是通过GET请求传递的,仅仅是为了简单。然而,action=edit需要使用POST请求;使用GET请求会导致错误。别忘了将请求的Content-Type头设置为application/x-www-form-urlencoded。你收到的令牌以+\,结尾,这需要进行URL编码(所以它会以%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头的用户代理(浏览器或脚本)现在可能会遇到这样的错误信息:
脚本应该使用一个包含联系信息的User-Agent字符串,否则可能会在没有通知的情况下被IP封锁。发送被列入黑名单的User-Agent头的用户代理(例如,任何以“lwp”开头的User-Agent字符串,无论其是否有用)可能会遇到这样的不太有帮助的错误信息:
我们的服务器目前遇到技术问题。这可能是暂时的,应该很快就会修复。请几分钟后再试。
这个变化很可能会影响自动访问维基媒体网站(如维基百科)的脚本(机器人),无论是通过api.php还是其他方式,以及命令行程序。如果你在运行一个机器人,请发送一个User-Agent头,标识这个机器人并提供一些联系方式,例如:
User-Agent: MyCoolTool/1.1 (http://example.com/MyCoolTool/; MyCoolTool@example.com) BasedOnSuperLib/1.4
不要为你的机器人复制浏览器的用户代理,因为使用浏览器的用户代理表现出的机器人行为会被认为是恶意的。有关更多信息,请参考MediaWiki API文档。
因此,我也尝试在我的脚本中添加了以下参数,但错误响应没有改变:
request['User-Agent'] = "MyCoolTool/1.1 (http://example.com/MyCoolTool/; MyCoolTool@example.com) BasedOnSuperLib/1.4"
你觉得问题可能与我们还没有申请机器人的批准有关吗?因为我们只是想先实现一个试用版,在自己的讨论页面上测试一下,确保一切正常后再申请批准。
1 个回答
我觉得问题出在这一行:
request['lgtoken'] = '%2B%5C'
你提到的这个登录API在第一次登录时并没有包含一个叫lgtoken
的东西;它只是在第二步(“确认令牌”)时发送,那个时候会用到NeedToken
响应中的token
值。
而且+
看起来并不是一个有效的令牌。
所以你遇到错误也不奇怪。
同时,当我用我的维基百科账号测试这个时,如果我包含那一行就会出错,不包含就成功,这让我更加确认这是问题所在。