社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544

全站通知:

基于Python的API示例

阅读

    

2024-07-17更新

    

最新编辑:本森级7号舰拉菲

阅读:

  

更新日期:2024-07-17

  

最新编辑:本森级7号舰拉菲

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
Lu_23333
卡拉彼丘WIKI拉菲

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的示例

登录

获取Cookie中的SESSDATA

BWiki的API使用biligame.com的Cookie鉴权,不提供密码登录。

必须的Cookie是SESSDATA,获取它可以如右图所示:

  1. 打开开发者工具(F12)
  2. 在网络栏左下列表中点击一个请求
  3. 查看右侧携带的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社区文档

比如可用于显示用户B站昵称、用户头像。(因为BWiki的用户名实际上是bid)

Python入门推荐

JS入门推荐