Giter VIP home page Giter VIP logo

nb2-wiki's Introduction

nonebot-plugin-wiki

license pypi python wakatime

基于 wikipedia,适用于 Nonebot2 的 mediawiki搜索 插件,同时你的Nonebot版本应不低于Nonebot2.0b1。

关于

  • 本项目作为 AXbot/mws.py 的重构 nonebot2 适配版,代码逻辑已然完全不同,并且功能得到了更大的拓展,但仍旨在能于即时通讯平台中快速引用wiki条目,让由各大wiki中所整合的知识为更多人所用。

  • 不止步于mediawiki api,本项目正在尝试兼容Bilibili wiki。依托于 XZhouQD/nonebot-plugin-bwiki-navigator ,已具备部分兼容性,同时,基于网页解析的简介获取正在优化。

  • 新的条目卡片已被纳入规划。

  • 该项目目前仍未发布正式版,可能并不适合立即投入生产环境,请务必于测试环境中进行调试后再投入生产环境。

关于贡献者

此仓库原Fork自仓库 wikipedia,但因为当初并不熟练使用git,直接在原仓库中进行了修改,制作了本插件,最后导致原仓库的贡献者也出现在了本仓库内,如果对你产生了误导,望见谅。wikipedia 仓库的贡献者们提供了开放的优质项目,也在此表示鸣谢。你也可以在此本项目实际贡献者,同时,如果你有较好的移除显示原始贡献者的方法,欢迎致邮赐教。

安装

通过 nb-cli 安装(推荐)

nb plugin install nonebot-plugin-wiki

通过 pip 安装

pip install nonebot_plugin_wiki

从 github 仓库克隆

克隆此仓库至 nonebot 生成的目录中对应的存放插件的文件夹内。

git clone https://github.com/ZombieFly/nb2-wiki.git

配置

本插件默认使用 中文 Minecraft Wiki 作为 RAW_MWIKI 记录,如需更改 ,可依照 nonebot 的 配置方法 对插件进行定制,以下配置项为可选配置:

  • PROXIES:代理地址,默认值为 {},当所使用的MWiki的 need_proxyTrue时使用;

  • REFER_MAX:相关搜索结果最大返回值,默认值为 10

  • RETRY_TIMES:api返回错误时最大重试次数,默认值为 1

  • RAW_MWIKI: 默认MWiki对象,在直接使用/wiki <关键词>命令时会使用此wiki记录,默认值为 {"name": "mc","api_url": "https://minecraft.fandom.com/zh/api.php","curid_url": "https://minecraft.fandom.com/zh/index.php?curid=","user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit 537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36","need_proxy": false}

  • CMD_START:命令触发头,默认值为["wiki", "维基"]

使用

以下命令实例中,假定bot配置的命令头为 ./,请依据实际情况替换。

  • /wiki <关键词>

    通过 raw_MWiki 发起搜索,一个可用实例:

    /wiki 绵羊
    
  • /wiki.add <自定义wiki简称> <wiki地址> <-d/D (可选)>(限群管理员权限)
    • 其中,wiki地址 应为 /api.php/index.php?curid= 前部分,链接开头的http协议可省略,(如 minecraft.fandom.com/zh/ )。当需要使用的api与curid链接前部分不相同时,可在记录后,使用set子命令进行修改;
    • 此外,命令中两处的 /. 可替换为任一被定义的命令头,例如在本文档假设的环境中, .wiki/add/wiki/add 等的皆可触发此子命令,下文将不再赘述此特征;
    • 末尾可选参数 -D-d,添加后,将跳过wiki api可用性检查,直接记录wiki。
    • 一个可用的实例:
      .wiki.add mc minecraft.fandom.com/zh/ -D
      
  • .wiki.set <已记录wiki名> <属性> <值> (限群管理员权限)

    修改已记录的wiki的对应属性,属性应该为 nameapi_urlcurid_url 等的MWiki属性, 为所需要更改后的值。

  • .wiki.rm <已记录wiki名>(限群管理员权限)

    从本群记录中移除指定已记录wiki。

  • .wiki.<已记录wiki名> <关键词>

    指定使用一个已记录的wiki发起搜索。一个可能的实例:

    .wiki.moe 别当欧尼酱了
    
  • .wiki.ls

    列出本群所有已记录wiki。

  • .wiki.lsl <已记录wiki名>(限群管理员权限)

    以json形式返回目标已记录wiki的完全记录内容,当不追加参数指定wiki时将返回配置文件中的 RAW_MWIKI

待办

  • add子命令判断wiki api是否可用,以及是否可直接生成简介
  • 默认UA储存问题
  • bilibili minecraft wiki适配器
  • add子命令添加的wiki名称已被使用,阻止注册
  • rm子命令删除时无论是否存在目标wiki都是返回“删除成功”,应当增加wiki存在性判定
  • 优化BWiki简介生成
  • 搜索时返回内容不是合规的json时的异常处理
  • 优化搜索流程,减少请求数,亦或是提高网络I/O利用率
  • 优化api检查机制
  • 搜索结果缓存
  • 条目卡片生成
  • 重构子命令权限部分

nb2-wiki's People

Contributors

zombiefly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

nb2-wiki's Issues

我想在我的插件里面调用nb-wiki

起因是我想在mc(可以直接在服务器里调用命令)里写个wiki,
发现有现成的,那就直接抄吧XD(我调用output里的代码)
但是写完之后发现出来了些莫名其妙的东西,
我也看到了注释# ! 目前重定向可能会出现完全不相干的结果返回
没看明白怎么处理的,请问怎么解决

这是网络的问题吗

08-06 16:48:53 [SUCCESS] nonebot | OneBot V11 3373930780 | [message.group.normal]: Message 184346806 from 2922126903@[:874410613] ".wiki 水"
08-06 16:48:53 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.nonebot_plugin_permission)
08-06 16:48:53 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.nonebot_plugin_permission)
08-06 16:48:53 [INFO] nonebot | Matcher(type='message', module=src.plugins.nonebot_plugin_permission) running complete
08-06 16:48:53 [INFO] nonebot | Matcher(type='message', module=src.plugins.nonebot_plugin_permission) running complete
08-06 16:48:53 [INFO] nonebot | Event will be handled by Matcher(type='message', module=nonebot_plugin_wiki)
08-06 16:48:56 [INFO] nonebot | Matcher(type='message', module=nonebot_plugin_wiki) running complete
08-06 16:48:56 [ERROR] nonebot | Running Matcher(type='message', module=nonebot_plugin_wiki) failed.
Traceback (most recent call last):
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\anyio\streams\tls.py", line 130, in _call_sslobject_method
    result = func(*args)
  File "C:\Python311\Lib\ssl.py", line 979, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLSyscallError: Some I/O error occurred (_ssl.c:1002)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_exceptions.py", line 10, in map_exceptions
    yield
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\backends\asyncio.py", line 78, in start_tls
    raise exc
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\backends\asyncio.py", line 69, in start_tls
    ssl_stream = await anyio.streams.tls.TLSStream.wrap(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\anyio\streams\tls.py", line 122, in wrap
    await wrapper._call_sslobject_method(ssl_object.do_handshake)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\anyio\streams\tls.py", line 151, in _call_sslobject_method
    raise BrokenResourceError from exc
anyio.BrokenResourceError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_transports\default.py", line 60, in map_httpcore_exceptions
    yield
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_transports\default.py", line 353, in handle_async_request
    resp = await self._pool.handle_async_request(req)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_async\connection_pool.py", line 253, in handle_async_request
    raise exc
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_async\connection_pool.py", line 237, in handle_async_request
    response = await connection.handle_async_request(request)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_async\connection.py", line 86, in handle_async_request
    raise exc
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_async\connection.py", line 63, in handle_async_request
    stream = await self._connect(request)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_async\connection.py", line 150, in _connect
    stream = await stream.start_tls(**kwargs)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\backends\asyncio.py", line 66, in start_tls
    with map_exceptions(exc_map):
  File "C:\Python311\Lib\contextlib.py", line 155, in __exit__
    self.gen.throw(typ, value, traceback)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpcore\_exceptions.py", line 14, in map_exceptions
    raise to_exc(exc)
httpcore.ConnectError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\BOT\CirnoBot\bot.py", line 28, in <module>
    nonebot.run()
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\__init__.py", line 273, in run
    get_driver().run(*args, **kwargs)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\drivers\fastapi.py", line 172, in run
    uvicorn.run(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\uvicorn\main.py", line 569, in run
    server.run()
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\uvicorn\server.py", line 60, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "C:\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
  File "C:\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
  File "C:\Python311\Lib\asyncio\base_events.py", line 640, in run_until_complete
    self.run_forever()
  File "C:\Python311\Lib\asyncio\windows_events.py", line 321, in run_forever
    super().run_forever()
  File "C:\Python311\Lib\asyncio\base_events.py", line 607, in run_forever
    self._run_once()
  File "C:\Python311\Lib\asyncio\base_events.py", line 1922, in _run_once
    handle._run()
  File "C:\Python311\Lib\asyncio\events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\message.py", line 142, in _check_matcher
    await _run_matcher(Matcher, bot, event, state, stack, dependency_cache)
> File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\message.py", line 188, in _run_matcher
    await matcher.run(bot, event, state, stack, dependency_cache)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 727, in run
    await self.simple_run(bot, event, state, stack, dependency_cache)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 702, in simple_run
    await handler(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot\dependencies\__init__.py", line 108, in __call__
    return await cast(Callable[..., Awaitable[R]], self.call)(**values)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\__init__.py", line 95, in _search
    outstr = await output(title=keywd, mwiki=state['mwiki'] if state.__contains__('mwiki') else RAW_MWIKI, redirect=True, msg_id=msg_id)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\utils.py", line 66, in output
    curid, _summary = await wiki.summary(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\mediawiki\wikipedia.py", line 314, in summary
    page_info: WikipediaPage = await page(title, auto_suggest=auto_suggest, redirect=redirect)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\mediawiki\wikipedia.py", line 359, in page
    results, suggestion = await search(title, results=1, suggestion=True)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\mediawiki\wikipedia.py", line 153, in search
    raw_results = await _wiki_request(search_params)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\nonebot_plugin_wiki\mediawiki\wikipedia.py", line 843, in _wiki_request
    r = await client.get(API_URL, params=params, headers=headers)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1757, in get
    return await self.request(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1533, in request
    return await self.send(request, auth=auth, follow_redirects=follow_redirects)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1620, in send
    response = await self._send_handling_auth(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1648, in _send_handling_auth
    response = await self._send_handling_redirects(
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1685, in _send_handling_redirects
    response = await self._send_single_request(request)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_client.py", line 1722, in _send_single_request
    response = await transport.handle_async_request(request)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_transports\default.py", line 352, in handle_async_request
    with map_httpcore_exceptions():
  File "C:\Python311\Lib\contextlib.py", line 155, in __exit__
    self.gen.throw(typ, value, traceback)
  File "D:\BOT\CirnoBot\venv\Lib\site-packages\httpx\_transports\default.py", line 77, in map_httpcore_exceptions
    raise mapped_exc(message) from exc
httpx.ConnectError

image

关于一些建议

能否分开设置单个群的wiki列表以及默认wiki和全局的wiki列表默认wiki,还有是否可以不设置全局默认/禁用全局wiki以仅让插件在需要群内生效。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.