社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544
基于Python的API示例/requests
阅读
2023-05-31更新
最新编辑:Lu_23333
阅读:
更新日期:2023-05-31
最新编辑: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()