You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:45:07