MediaWiki API上传图片至Commons遇错及相关技术咨询
问题解决方案
1. 上传JSON解码错误修复
1.1 修正CSRF Token获取逻辑
你提到Commons返回的CSRF Token仅为"+",这说明获取Token的请求无效,核心原因是未维持登录会话。获取有效Token的正确逻辑:
# 确保已通过action=login接口完成登录,保留会话cookie PARAMS_TOKEN = { "action": "query", "meta": "tokens", "type": "csrf", "format": "json" } # 使用登录后的会话cookie发送请求 response = requests.get(url="https://commons.wikipedia.org/w/api.php", params=PARAMS_TOKEN, cookies=SESSION_COOKIES) CSRF_TOKEN = response.json()["query"]["tokens"]["csrftoken"]
- 必须携带登录后的会话cookie,否则服务器会返回无效的"+" Token。
1.2 修正上传请求格式
MediaWiki上传文件要求使用multipart/form-data格式提交,且必须包含文件内容字段,你的现有参数缺少文件内容,导致服务器返回空响应。修正后的上传代码:
import requests # 假设已获取有效CSRF_TOKEN和登录会话cookie PARAMS_4 = { "action": "upload", "filename": "file_11a.jpg", "format": "json", "token": CSRF_TOKEN, "ignorewarnings": 1 } # 构造文件上传字段 files = { "file": open("file_11a.jpg", "rb") # 替换为你的本地文件路径 } # 发送上传请求,携带登录cookie response = requests.post( url="https://commons.wikipedia.org/w/api.php", data=PARAMS_4, files=files, cookies=SESSION_COOKIES ) # 正常解析响应 result = response.json() if "upload" in result and result["upload"]["result"] == "Success": # 获取公开URL public_url = result["upload"]["imageinfo"][0]["url"] print("上传成功,公开URL:", public_url)
2. 获取上传图片的公开URL
有两种可靠方式:
- 上传成功后,直接从API响应的
upload->imageinfo->url字段提取(如上代码所示)。 - 已知文件名时,通过查询API获取:
PARAMS_QUERY_URL = { "action": "query", "titles": "File:file_11a.jpg", "prop": "imageinfo", "iiprop": "url", "format": "json" } response = requests.get("https://commons.wikipedia.org/w/api.php", params=PARAMS_QUERY_URL) data = response.json() page_id = next(iter(data["query"]["pages"].keys())) public_url = data["query"]["pages"][page_id]["imageinfo"][0]["url"]
3. test与commons存储路径的差异
- 存储机制:
- test是测试环境,数据会定期自动清理,不提供永久存储,仅用于功能测试。
- commons是正式生产环境,符合版权要求的文件永久存储,且有多副本冗余备份。
- 访问范围:
- test的文件仅能在测试维基项目内访问,正式维基百科等项目不会引用。
- commons的文件可被所有维基媒体项目直接引用,且通过全球CDN加速,访问速度更快。
- 稳定性:
- test环境无服务保障,可能随时停机维护或重置数据。
- commons是核心服务,具备高可用架构,稳定性极强,服务中断概率极低。
4. 其他上传方式
除直接调用原生API外,可使用更简便的第三方工具:
- Pywikibot:维基官方维护的Python工具包,封装所有MediaWiki API操作,支持批量上传、自动处理版权声明等。
- mwclient:轻量级MediaWiki API客户端,适合快速开发,上传逻辑更直观。
5. 查询账号上传的图片列表
通过API的usercontribs列表查询,指定文件命名空间(编号为6)即可:
PARAMS_UPLOAD_LIST = { "action": "query", "list": "usercontribs", "ucuser": "你的维基用户名", "ucnamespace": 6, "ucprop": "title|timestamp", "uclimit": "max", "format": "json" } response = requests.get("https://commons.wikipedia.org/w/api.php", params=PARAMS_UPLOAD_LIST) upload_list = response.json()["query"]["usercontribs"] # 遍历输出上传记录 for item in upload_list: print(item["title"], item["timestamp"])
内容的提问来源于stack exchange,提问作者Daksh Rawal
相关产品推荐
相关产品推荐

