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

如何通过API向commons.wikimedia.org批量上传文件及完成授权?

维基共享资源批量文件上传的程序化实现方法

一、授权方式:OAuth 2.0

程序化操作维基媒体资源首选OAuth 2.0授权,比直接用账号密码更安全,也符合平台规范:

  • 登录维基共享资源账号,进入特殊版本:OAuth消费者注册页面创建新消费者
  • 填写应用名称、描述等必要信息,授权类型选"仅读取和写入"或"高级权限"(按需选择),回调URL填http://localhost即可(本地调试用)
  • 创建完成后记录消费者令牌和消费者密钥,再通过授权流程获取访问令牌和访问密钥,后续所有API请求用这两组令牌完成鉴权

二、批量上传实现

方法1:使用Pywikibot(推荐)

Pywikibot是维基媒体官方维护的Python库,封装了所有API操作,批量上传上手快:

  • 先安装库:pip install pywikibot
  • 生成配置文件:运行python -m pywikibot generate_user_files,选择commons.wikimedia.org站点,填入之前获取的OAuth令牌信息
  • 编写上传脚本示例:
import pywikibot
from pywikibot import UploadRobot

# 连接维基共享资源站点
site = pywikibot.Site('commons', 'commons')
site.login()  # 自动用配置的OAuth信息完成登录

# 批量文件列表,每个元素是(本地文件路径, 维基文件名, 描述文本)
upload_tasks = [
    ('/home/user/photos/mountain.jpg', 'File:Alpine_Mountain_2024.jpg', '{{cc-by-sa-4.0}}\n描述:2024年拍摄的阿尔卑斯山风景'),
    ('/home/user/vectors/icon.svg', 'File:Custom_App_Icon.svg', '{{cc0}}\n描述:原创开源应用图标')
]

# 循环处理每个上传任务
for local_path, wiki_filename, desc in upload_tasks:
    uploader = UploadRobot(
        [local_path],
        description=desc,
        use_filename=wiki_filename,
        keep_filename=True,
        site=site
    )
    uploader.run()
  • 注意:描述文本必须包含符合维基共享要求的许可证模板,比如{{cc-by-sa-4.0}}、{{cc0}}等,否则文件会被标记为版权违规

方法2:直接调用MediaWiki API

如果需要完全自定义上传流程,可以直接通过HTTP请求调用API:

  1. 获取编辑令牌:发送GET请求到https://commons.wikimedia.org/w/api.php,参数如下:
    action=query&meta=tokens&type=csrf&format=json
    
    从返回的JSON结果中提取csrftoken字段
  2. 发送上传请求:用POST请求提交,核心参数包括:
    • action=upload
    • filename=目标维基文件名
    • file=本地文件的二进制内容
    • text=包含许可证和描述的维基文本
    • token=刚才获取的csrftoken
    • 同时在请求头中携带OAuth令牌的鉴权信息
  3. 批量上传时建议加入1-2秒的请求间隔,避免触发平台限流机制

注意事项

  • 上传的文件必须符合维基共享资源的版权要求,确保你拥有文件的分发授权
  • 上传前可通过API查询是否存在同名文件,避免覆盖或重复上传
  • 若上传数百甚至上千个文件,建议分批次处理,并添加错误重试逻辑,防止因网络波动导致任务中断

内容的提问来源于stack exchange,提问作者Podbrushkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:19:57