我想使用 MediaWiki API 使用简单的 Python 脚本在本地 MediaWiki 中创建新的用户帐户。
根据文档,我的理解是我必须首先以管理员身份登录才能拥有创建用户所需的权限。
我使用这样的代码来登录:
import requests
def login(base_url: str):
session = requests.Session()
url = base_url + "/api.php"
# Retrieve login token first
print(f"Get login token...")
response = session.get(url=url, params={
'action':"query",
'meta':"tokens",
'type':"login",
'format':"json"
})
data = response.json()
login_token = data['query']['tokens']['logintoken']
print(f"login_token={login_token}")
print(f"Login...")
response = requests.post(url, data={
'action': 'login',
'lgname': 'admin',
'lgpassword': 'admin_password',
'lgtoken': login_token,
'format': 'json',
})
login_data = response.json()
print(login_data)
其中
admin
是我在 MediaWiki 原始配置期间指定的管理员帐户。
不幸的是结果是
{'login': {'result': 'Failed', 'reason': 'Unable to continue login. Your session most likely timed out.'}}
。
我缺少什么或者如何调试这个问题?
您遇到的问题可能是由于多种原因造成的,调试它可能涉及检查代码和配置的各个方面。您可以采取以下一些步骤来解决问题:
Session 使用:大多数请求都使用 Session 对象,但在登录步骤中,您直接使用 requests 模块。确保在整个代码中一致地使用会话对象。更新登录请求以使用 session.post() 方法而不是 requests.post()。
会话和 Cookie:MediaWiki API 依赖 cookie 来维护会话状态。确保您对所有请求使用相同的会话,以便正确维护 cookie。这可能涉及对所有请求使用会话对象。
基本 URL:确保您使用的 base_url 正确并指向 MediaWiki 实例的正确位置。
登录令牌:仔细检查您是否正确获取登录令牌并将其传递给登录请求。看来您在代码中正确处理了它,但最好验证一下。
时间同步:有时,如果客户端和服务器之间存在显着的时间差异,可能会导致令牌验证出现问题。确保本地机器和服务器的系统时钟同步。
管理员凭据:仔细检查您用于登录请求的管理员用户名和密码。确保它们正确并具有必要的权限。
安全设置:检查您的 MediaWiki 安装是否有任何可能影响登录过程的安全设置。这可能包括与 cookie、身份验证或会话处理相关的设置。
错误消息:在服务器日志或 API 响应中查找任何错误消息。他们可能会提供有关登录尝试期间出现的问题的更具体信息。
API端点:确认API端点URL正确。它应该是您的 MediaWiki 安装的 URL,后跟 /api.php。
调试输出:考虑在 MediaWiki 配置中启用调试输出,以获取有关登录过程的更多信息。这可以帮助您识别任何具体问题。
CORS 或同站点策略:检查是否存在任何可能影响您的 API 请求的跨源资源共享 (CORS) 或同站点策略。确保您的请求不会因安全限制而被阻止。