如何创建一个维基百科机器人以向讨论页添加新部分?

0 投票
1 回答
1341 浏览
提问于 2025-04-18 15:07

我们需要做一个机器人,能够在维基百科的讨论页面上发布新内容。

为了提高效率,我们更倾向于使用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 个回答

3

我觉得问题出在这一行:

request['lgtoken'] = '%2B%5C'

你提到的这个登录API在第一次登录时并没有包含一个叫lgtoken的东西;它只是在第二步(“确认令牌”)时发送,那个时候会用到NeedToken响应中的token值。

而且+看起来并不是一个有效的令牌。

所以你遇到错误也不奇怪。

同时,当我用我的维基百科账号测试这个时,如果我包含那一行就会出错,不包含就成功,这让我更加确认这是问题所在。

撰写回答