如何通过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:
- 获取编辑令牌:发送GET请求到
https://commons.wikimedia.org/w/api.php,参数如下:
从返回的JSON结果中提取action=query&meta=tokens&type=csrf&format=jsoncsrftoken字段 - 发送上传请求:用POST请求提交,核心参数包括:
action=uploadfilename=目标维基文件名file=本地文件的二进制内容text=包含许可证和描述的维基文本token=刚才获取的csrftoken- 同时在请求头中携带OAuth令牌的鉴权信息
- 批量上传时建议加入1-2秒的请求间隔,避免触发平台限流机制
注意事项
- 上传的文件必须符合维基共享资源的版权要求,确保你拥有文件的分发授权
- 上传前可通过API查询是否存在同名文件,避免覆盖或重复上传
- 若上传数百甚至上千个文件,建议分批次处理,并添加错误重试逻辑,防止因网络波动导致任务中断
内容的提问来源于stack exchange,提问作者Podbrushkin
相关产品推荐
相关产品推荐

