社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544
基于Python的API示例
阅读
2024-07-17更新
最新编辑:本森级7号舰拉菲
阅读:
更新日期:2024-07-17
最新编辑:本森级7号舰拉菲
Mediawiki API允许用户通过程序操作Wiki,比如编辑页面、上传图片等。
Wiki页面上能进行的操作几乎都能通过API自动化完成,详见API文档:api.php。
这需要你构造特定的HTTP请求,不难但是麻烦。因此更推荐使用各编程语言中的Wiki操作库。
比如在Python中,想要获取一个页面的内容非常简单:
from mwclient import Site
wiki = Site("wiki.biligame.com/skyrim", path="/")
page = wiki.pages["元气满满的亚龙人女仆,卷一"]
print(page.text())
几乎所有编程语言都能用MW API。如果你使用Python、Javascript或PHP,可以访问MW提供的代码示例。Java、C#等也容易找到开源示例。
其中,Python非常容易上手,可以避免复杂的配置和教程。因此,本文假设你用Python,并使用开源库mwclient
,它支持通过Cookie登录,便于操作BWiki API。关于mwclient,可以使用 pip install mwclient
安装。更多信息请参阅文档。
如果你不想用mwclient, 可以参考基于requests的示例
登录
BWiki的API使用biligame.com
的Cookie鉴权,不提供密码登录。
必须的Cookie是SESSDATA
,获取它可以如右图所示:
- 打开开发者工具(F12)
- 在网络栏左下列表中点击一个请求
- 查看右侧携带的Cookie,复制
SESSDATA
的值。
警告:Cookie事关账号安全,请勿泄露给任何人。截屏务必打码(如右图示)。
当然,可以用Python直接从浏览器存储数据库中读取,自动读取cookie。
基于 mwclient
请注意替换SESSDATA的值
from mwclient import Site
site = Site("wiki.biligame.com/skyrim", path="/", scheme="https")
site.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
# site.users用于批量获取用户信息,此处只获取一个
user_info = next(site.users([site.username]))
print("你的用户id:", site.username)
print("你的用户组:", user_info["groups"])
基于 requests
请注意替换SESSDATA的值。更多信息:基于requests的示例
import requests
api_url = "https://wiki.biligame.com/skyrim/api.php"
# 发送 API 请求。cookies用于登录,params参数指定细节
response = requests.get(api_url, cookies={
'SESSDATA': 'your SESSDATA value'
}, params={
"action": "query",
"format": "json",
"meta": "userinfo",
"uiprop": "groups",
})
data = response.json()
print("你的用户id", data["query"]["userinfo"]["name"])
print("你的用户组", data["query"]["userinfo"]["groups"])
示例
使用request的编辑示例:基于requests的示例
编辑页面示例1
注意,如果你没有自动版主化用户以上的权限,对页面的编辑可能会出发审核,需要wiki管理团队通过
请注意替换SESSDATA的值
from mwclient import Site
site = Site("wiki.biligame.com/tools", path="/", scheme="https")
site.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 登录
page_name = "用户:"+site.username+"/test" # 编辑页面 用户:39886146/test
print("编辑页面 " + page_name)
page = site.pages[page_name]
result = page.edit(text="根据教程代码测试增加内容", summary="edit by mwclient bot")
print(result)
编辑页面示例2
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
wiki.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
page = wiki.pages["沙盒"]
wikitext = page.text()
wikitext = wikitext + "\n后续增加一段话\n和另一段话"
result = page.edit(text=wikitext, summary="这里是修改说明,本次修改增加了一段话")
print(result)
获取skyrim wiki所有分类为图书的页面
from mwclient import Site
wiki = Site("wiki.biligame.com/skyrim", path="/")
wiki.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
for page in wiki.categories["图书"]:
print(page.name)
requests 获取分类为图书的页面
如果你不想用 mwclient
,可以按照API的文档手动进行HTTP请求。
import requests
api_url = "https://wiki.biligame.com/skyrim/api.php"
response = requests.get(api_url, params={ # 发送 API 请求,获取页面列表。params参数指定细节
"action": "query",
"format": "json",
"list": "categorymembers",
"cmtitle": "Category:图书",
"cmlimit": "20"
})
data = response.json()
for page in data["query"]["categorymembers"]: # 输出页面标题
print(page["title"])
获取指定日期范围的编辑记录
from mwclient import Site
from datetime import datetime
wiki = Site("wiki.biligame.com/tools", path="/")
wiki.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
start_date = datetime(2023, 4, 30)
end_date = datetime(2023, 4, 1)
changes = wiki.recentchanges(start=start_date, end=end_date)
for change in changes:
print(dict(change))
展开模板
如果使用统计魔术字,就可以获取一个wiki的编辑数、页面数等信息。比如第五人格wiki在2023年累计编辑超过十万次,是第七个超过十万编辑的wiki。
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
wiki.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
wikitext = wiki.expandtemplates("{{悬浮框|显示的内容123|悬浮内容567}}")
print(wikitext)
wikitext = wiki.expandtemplates("页面数量{{NUMBEROFPAGES}}、今年{{{{CURRENTYEAR}}}}")
print(wikitext)
解析wikitext为html
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
result = wiki.parse("==标题==\n'''加粗'''")
print(result["text"]["*"])
获取所有分类
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
result = wiki.allcategories()
for x in result:
print(x.name)
获取所有页面
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
for page in wiki.allpages():
print(page.name)
所有页面 / 所有模板
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
for page in wiki.allpages():
print(page.name, page.pageid)
for page in wiki.allpages(namespace=10): # 模板
print(page.name, page.pageid)
获取所有图片信息
from mwclient import Site
wiki = Site("wiki.biligame.com/tools", path="/")
for page in wiki.allimages():
print(page.name, f'{page.imageinfo["width"]} x {page.imageinfo["height"]}', page.imageinfo["url"])
上传文件
import mwclient
site = mwclient.Site("wiki.biligame.com/klbq", path="/") # WIKI
site.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
with open('要上传的文件名', 'rb') as f:
site.upload(f, filename='WIKI上的文件名', description='文件页要添加的内容', comment='编辑摘要') # 文件页内容和编辑摘要可省略
批量上传文件
import os
import mwclient
site = mwclient.Site("wiki.biligame.com/klbq", path="/") # WIKI
site.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
folder_path = 'Z:/卡拉彼丘/自由意志' # 要上传的文件所在目录
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
with open(file_path, 'rb') as f:
site.upload(f, filename=filename, description='文件页要添加的内容', comment='编辑摘要') # 文件页内容和编辑摘要可省略
覆盖更新数据json页
import mwclient
import json
site = mwclient.Site("wiki.biligame.com/klbq", path="/") # WIKI
site.login(cookies={'SESSDATA': 'your SESSDATA value'}) # 记得替换
with open('成就.json', 'r', encoding='utf-8') as file: # 要覆盖到WIKI的json文件
data = file.read()
page = site.pages['模块:成就/Data.json'] # 要覆盖数据页面
summary = '更新成就数据' # 编辑摘要
page.save(data, summary=summary, contentmodel="json")
print('页面更新成功!')
API礼仪和注意事项
- 批量编辑前务必测试,以免出现大规模页面错误。
- API支持批量操作,因此请使用批量操作代替数十次单独请求。这可以显著提升效率,并降低服务器负载。
- 适量缓存数据,避免短时间内多次请求相同内容。这可以显著提升效率,并降低服务器负载。
- 手动HTTP请求时,可以为HTTP请求启用GZip压缩,减小服务器带宽消耗。
- 长期、大量操作应当为HTTP请求设置UserAgent,并提供操作人的信息(如站长群/编辑群昵称)。便于BWiki分析和沟通。
- 数据格式使用JSON(因为XML、YAML等已被标记为弃用或删除,未来某次更新后将不支持这些格式)。
B站API社区文档
- 哔哩哔哩-API收集整理 https://github.com/SocialSisterYi/bilibili-API-collect
- 哔哩哔哩常用API调用 https://github.com/nemo2011/bilibili-api
比如可用于显示用户B站昵称、用户头像。(因为BWiki的用户名实际上是bid)
Python入门推荐
- 廖雪峰的Python教程
- 开发工具: PyCharm 、 VS Code
JS入门推荐
- 现代javascript教程
- 开发工具: WebStorm