MediaWiki API返回HTTP响应对象而非JSON,请求排查原因
问题分析与解决
首先明确:你看到的<Response [200]>是Python requests库返回的Response对象的默认打印结果,不是API返回的JSON内容。要获取实际的响应数据,必须调用Response对象的.json()方法。
核心问题:没正确解析响应
如果你的代码只是直接打印了response变量,就会得到这个输出。修正方式很简单:
# 错误写法:直接打印Response对象 response = requests.post(api_url, data=payload) print(response) # 输出 <Response [200]> # 正确写法:解析为JSON login_result = response.json() print(login_result)
MediaWiki 1.17.0的适配问题
你的示例代码大概率是针对新版MediaWiki写的,1.17.0是2011年的老版本,API登录流程和参数有差异,属于代码过时:
- 1.17.0不支持一步登录,必须分两步:先获取登录token,再用token提交登录请求
- 必须显式指定
format=json参数,否则API默认返回XML - 登录参数用
lgname、lgpassword、lgtoken,而非新版的username、password、csrf_token - 必须用Session保持会话cookie,否则登录状态无法维持
适配1.17.0的完整示例代码
import requests # 初始化会话,自动维持cookie session = requests.Session() api_base = "http://你的维基域名/w/api.php" # 第一步:获取登录token token_params = { "action": "query", "meta": "tokens", "type": "login", "format": "json" } token_res = session.get(api_base, params=token_params) token_data = token_res.json() login_token = token_data["query"]["tokens"]["logintoken"] # 第二步:提交登录请求 login_params = { "action": "login", "lgname": "你的用户名", "lgpassword": "你的密码", "lgtoken": login_token, "format": "json" } login_res = session.post(api_base, data=login_params) login_result = login_res.json() # 打印登录结果 print(login_result)
额外检查点
- 确认API地址正确:必须指向维基根目录下的
w/api.php - 检查用户名密码是否正确,1.17.0对部分特殊字符密码的支持有限,必要时需转义
- 如果返回XML而非JSON,肯定是漏加了
format=json参数
内容的提问来源于stack exchange,提问作者lolololol ol
相关产品推荐
相关产品推荐

