社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103

全站通知:

基于Python的API示例/requests

阅读

    

2023-05-31更新

    

最新编辑:Lu_23333

阅读:

  

更新日期:2023-05-31

  

最新编辑:Lu_23333

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

相比于requests,我们更推荐使用mwclient。因为手动操作MWAPI有大量需要注意的细节,这需要非常熟悉MWAPI文档。 目前的MW Action API(api.php)的设计思想意外的为使用API增加了很多麻烦。使用meclient能减少很多麻烦。

如果你一定要用requests,我们提供了一个小例子。

介绍

例子中的main函数负责实例化MiniWikiTool,以此编辑了一个wiki页面,并判断编辑是否成功。

MiniWikiTool类最小化实现了基本的编辑操作,可以参考此结构拓展功能。

其中的get/post直接操作http请求,其他方法基于它实现以关注功能实现,避免到处关注请求细节。 这里也告知API以JSON格式返回数据。

query是API中常用的action,几乎所有的信息获取都依赖此action。

token可以直接获取一个token,方便需要token的方法获取token。

edit方法用于编辑页面,是第一个「对外」的接口(上述几个底层操作理应位于另外的类)。除了指定的参数,还通过**kwargs支持其他可用于edit api的参数,如「createonly」、「nocreate」等。

注意

示例代码是为了演示API操作,没有进行任何参数检查、异常处理,也没有自动获取cookie,没有为查询操作增加缓存……

这是为了突出相关API必要的信息和操作,便于参考。

警告:代码中涉及你的浏览器Cookies,事关账号安全,请不要泄露给任何人。

警告:示例代码仅供参考,不适合用于生产环境。

代码

""" A minimal implementation for editing wiki pages using requests

Author: Lu
License: CC0
Warning: The code involves your browser cookies, DO NOT send them to anyone.
"""
from requests import Session


def main():
    """ main func """
    api_url = "https://wiki.biligame.com/tools/api.php"

    wiki = MiniWikiTool(api_url, cookies={
        'SESSDATA': 'your SESSDATA value'  # TODO your cookies
    })
    res = wiki.edit("页面名称", "页面内容", "编辑说明")
    print(res)
    if "edit" in res and res["edit"]["result"] == "Success":
        print("编辑成功")
    if "error" in res:
        print("编辑失败")
        print("错误代号:"+res["error"]["code"])
        print("错误信息:"+res["error"]["info"])


class MiniWikiTool:
    """ a demo
    Minimally implemented wiki editing tool
    * No parameter checking
    * No exception handling
    * Limited features
    """
    def __init__(self, api_url: str, cookies: dict):
        self.api_url = api_url
        self.session = Session()
        self.session.cookies.update(cookies)

    def edit(self, title, content, summary, minor=False, **kwargs) -> dict:
        """ edit page by page title"""
        data = {
            'title': title,
            'text': content,
            'summary': summary,
            'minor': minor,
            'action': "edit",
            'token': self.token(),
        }
        data.update(kwargs)
        return self.post(data)

    def token(self) -> str:
        """ get token, for edit and check login """
        res_data = self.query({}, meta="tokens")
        return res_data["query"]["tokens"]["csrftoken"]

    def query(self, params: dict, **kwargs) -> dict:
        """ api in action query """
        params["action"] = "query"  # add default params
        params.update(kwargs)  # other params
        return self.get(params)

    def get(self, params: dict) -> dict:
        """ http get, set res format as json """
        params["format"] = "json"
        response = self.session.get(url=self.api_url, params=params)
        return response.json()

    def post(self, data: dict) -> dict:
        """ http post, set res format as json """
        data["format"] = "json"
        response = self.session.post(url=self.api_url, data=data)
        return response.json()


if __name__ == '__main__':
    main()