Giter VIP home page Giter VIP logo

nonebot-plugin-gachalogs's Introduction

NoneBot Plugin GachaLogs


🤖 用于分析与管理原神祈愿记录的 NoneBot2 插件


license pypi python QQ Chat Group
Code style: black Imports: isort Lint: flake8 pre-commit


祈愿统计图 成就示意图

安装方法

如果你正在使用 2.0.0.beta1 以上版本 NoneBot2,推荐使用以下命令安装:

# 从 nb_cli 安装
nb plugin install nonebot-plugin-gachalogs

# 或从 PyPI 安装
pip install nonebot-plugin-gachalogs

使用须知

  • 初次使用 抽卡记录 命令时,要求输入祈愿历史记录链接或米哈游通行证 Cookie。如果初次使用输入链接(只要回复的内容中含有即可,不必手动截取准确的链接),在该链接的 AuthKey 过期(24 小时)后需要重新输入链接或 Cookie 才能刷新数据。如果初次使用输入 Cookie,只要 Cookie 有效,后续使用时祈愿历史记录链接将自动更新,无需再次输入。

  • 插件使用米哈游通行证 Cookie 来自动更新祈愿历史记录链接,该 Cookie 可在 米哈游通行证 登陆获取,并非一些教程中使用的 米游社 BBS Cookie,其中需要包含 stoken stuidlogin_ticket

    你可以参考 KimigaiiWuyi/GenshinUID#255 等教程获取米哈游通行证 Cookie。此处提供一种获取该 Cookie 的简便方法:

    1. 在桌面端浏览器新建 隐身标签页,后面均在此隐身标签页内操作
    2. 进入 https://www.miyoushe.com/ys/ 并正常登录
    3. 进入 http://user.mihoyo.com/ 并正常登录
    4. 按下 F12 键,切换至「Console / 控制台」页面,在输入处(通常由蓝色「>」符号示意)输入 document.cookie 回车,控制台中出现的字符串即为插件需要的 Cookie
  • 一般来说,插件安装完成后无需设置环境变量,只需重启 Bot 即可开始使用。你也可以在 NoneBot2 当前使用的 .env 文件中参考 .env.example 添加下表给出的环境变量,对插件进行更多配置。环境变量修改后需要重启 Bot 才能生效。

    环境变量 必需 默认 说明
    gachalogs_safe_group [] 安全群组,只有在安全群组内才允许输入链接、Cookie 等内容
    gacha_expire_sec 3600 祈愿历史记录本地缓存过期秒数
    resources_dir /path/to/bot/data/ 插件缓存目录的父文件夹,包含 gachalogs 文件夹的上级文件夹路径
    gachalogs_font /path/to/bot/data/gachalogs/LXGW-Bold.ttf 祈愿历史记录绘制字体
    gachalogs_pie_font /path/to/bot/data/gachalogs/LXGW-Bold-minipie.ttf 祈愿历史记录绘制饼图字体
    gachalogs_achieve_font /path/to/bot/data/gachalogs/HYWH-85W.ttf 祈愿历史记录绘制成就字体
  • 在群组中发送米哈游通行证 Cookie 等内容存在安全隐患,因此即使某些命令在群组中触发,处理结果最终也会通过私聊发送。如果用户未添加 Bot 为好友,私聊消息将发送失败。添加安全群组环境变量,即可允许在这些群组中直接发送敏感消息,如果大家不在意的话。

  • commit e2f38f3 之后插件私聊文件发送功能不再依赖腾讯云 COS 转存,只需 go-cqhttp 支持 上传私聊文件 接口。因此如果有私聊文件发送需求,务必保证 go-cqhttp 版本不低于 v1.0.0-rc3

  • 使用 抽卡记录导出 命令生成的表格与 JSON 文件均符合 统一可交换祈愿记录标准(UIGF)格式,你可以尝试在其他支持此标准的工具中导入。导出的祈愿历史记录链接、米哈游通行证 Cookie 在某些地方也许有用。

  • 插件运行后,用户的基本配置信息会写入 config.json 文件,祈愿历史记录数据缓存于 gachalogs-{uid}.json 文件。

命令说明

  • 抽卡记录 / ckjl

    返回一张祈愿历史记录统计图,样式与 https://genshin.voderl.cn/ 一致。

    可选附带参数 默认 说明
    刷新 / -f / --force 要求强制刷新最新祈愿历史记录,即使本地缓存未过期(结果默认缓存 1 小时)
    祈愿历史记录链接 指定祈愿历史记录链接(仅初次使用、无法自动更新祈愿历史记录链接时生效)
    米哈游通行证 Cookie 指定米哈游通行证 Cookie(仅初次使用、无法自动更新祈愿历史记录链接时生效)
  • 抽卡成就 / ckcj

    返回一张祈愿历史记录成就图,样式与 https://genshin.voderl.cn/ 一致。

  • 抽卡记录导入(在私聊或群聊中上传抽卡记录文件)

    返回导入结果及一张祈愿历史记录统计图。

    普通用户只允许导入与本地记录(如果有)归属 UID 相同的抽卡记录。超级用户在普通用户规则基础上,还允许为拥有本地记录的其他用户导入 UID 相同的抽卡记录。

    目前支持导入的文件格式有:

    • 程序内部缓存格式。导入后执行恢复,即将本地记录直接替换为该文件的记录
    • UIGF v2.2 格式,并且每条记录必须拥有 time rank_type 等 UIGF v2.2 标准中定义为非必需的字段。导入后执行合并,即尝试将本地记录与该文件的记录合并

    如果导入前 被导入者 有本地记录,插件会创建一个本地记录备份文件用于意外恢复,并尝试通过私聊将此文件发送给 被导入者(如果发送成功则 Bot 在服务器上创建的备份文件会被删除)。一旦发现插件导入后记录异常,被导入者 可以直接发送此文件给 Bot 来触发记录恢复。

  • 抽卡记录导出 / logexp / ckjldc

    导出祈愿历史记录表格,通过可选附带参数指定导出祈愿历史记录 JSON 文件、祈愿历史记录链接或米哈游通行证 Cookie。

    可选附带参数 默认 说明
    @某人 @自己 指定导出记录用户,仅 Bot 管理员 可导出其他用户的记录
    统一 / 标准 / uigf / json 指定导出祈愿历史记录为 JSON 文件
    链接 / 地址 / url 指定导出祈愿历史记录链接
    饼干 / ck / cookie 指定导出米哈游通行证 Cookie

    导出示意图

  • 抽卡记录删除 / logdel / ckjldc

    默认只删除本地祈愿历史记录缓存(不会影响 Cookie 等配置数据),即只删除 gachalogs-{uid}.json 文件。

    如果需要连同指定用户在 config.json 文件中的配置一起删除,请使用附带参数 全部 等。

    记录、配置一旦删除将无法恢复,所以只有输入中附带了 确认 等附带参数时,命令才会真正对本地文件执行删除动作。

    可选附带参数 默认 说明
    @某人 @自己 指定删除记录或配置的用户,仅 Bot 管理员 可删除其他用户的记录或配置
    强制 / 确认 / force / -f / -y 删除操作确认
    全部 / 所有 / 配置 / all / -a / config / -c 指定删除用户的 配置和记录 全部数据

特别鸣谢

@nonebot/nonebot2 | @Mrs4s/go-cqhttp | @sunfkny/genshin-gacha-export | @voderl/genshin-gacha-analyzer | @vikiboss/genshin-helper | @DGP-Studio/Snap.Metadata

nonebot-plugin-gachalogs's People

Contributors

monsterxcn avatar pre-commit-ci[bot] avatar

Stargazers

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

Watchers

 avatar

nonebot-plugin-gachalogs's Issues

功能改进

  • 抽卡记录导入 完成于 4604c89
  • 限定五星标记 完成于 e9afaf9
  • 限定五星花费分析 完成于 e9afaf9
  • 卡池运势标记 完成于 6ace13e
  • 出货之最分析 完成于 e9afaf9
  • 物品图片绘制
  • 抽卡成就 完成于 0f27711
  • 适配 UIGF v2.3 完成于 68ca1d2

* 欢迎在此 issue 下方提出功能改进建议,尽可能实现,感谢喵💕

关于生成 AuthKey 接口

您好,关于这个更新链接的功能我尝试在 ts 中实现,但是在生成 authKey 的地方遇到了难题,目前提示我 角色还未绑定通行证账号。请问您知道这是哪种原因造成的吗?

{
  "data": null,
  "message": "角色还未绑定通行证账号",
  "retcode": 1016
}

请求参数中的header信息,body 参数中也传入了 game_uid 等信息。

{
    "auth_appid": "webview_gacha",
    "game_biz": "hk4e_cn",
    "game_uid": 18******82,
    "region": "cn_gf01"
}
{
    accept: [ 'Accept', 'application/json, text/plain, */*' ],
    'content-type': [ 'Content-Type', 'application/json' ],
    cookie: [
      'cookie',
      '_MHYUUID=147da997-3189-4fb7-8dfc-cca4bd53b033; ltuid=28*****600; mi18nLang=zh-cn; DEVICEFP_SEED_ID=7e860152c2d12622; DEVICEFP_SEED_TIME=1660707891339; account_id=28*****600; _ga_75FBFDLZKM=GS1.1.1660707892.1.1.1660708662.0.0.0; DEVICEFP=38d7eb252c8cc; _ga=GA1.2.2030340896.1652349741; _ga_9TTX3TE5YL=GS1.1.1663422069.9.1.1663423171.0.0.0; _gid=GA1.2.582532231.1663514587; ltoken=fI2euI****************oSAPfi3M; cookie_token=BAG***********************4jFFm; login_uid=28*****600; login_ticket=Kh****************4qISXaG7BeJi;stuid=28*****600;stoken=CSi******************o7o2gXnlDqvCAmrcJ'
    ],
    ds: [ 'ds', '1663598803,Pwvz5Y,fb71762d8fdd7a545fe71df1c9825422' ],
    host: [ 'host', 'api-takumi.mihoyo.com' ],
    referer: [ 'referer', 'https://app.mihoyo.com' ],
    'user-agent': [ 'user-agent', 'okhttp/4.8.0' ],
    'x-rpc-app_version': [ 'x-rpc-app_version', '2.28.1' ],
    'x-rpc-channel': [ 'x-rpc-channel', 'mihoyo' ],
    'x-rpc-client_type': [ 'x-rpc-client_type', '2' ],
    'x-rpc-device_id': [ 'x-rpc-device_id', '21eae5b6-bb97-4bc6-a4ef-180f607e2374' ],
    'x-rpc-device_model': [ 'x-rpc-device_model', 'SM-977N' ],
    'x-rpc-device_name': [ 'x-rpc-device_name', 'Samsung SM-G977N' ],
    'x-rpc-sys_version': [ 'x-rpc-sys_version', '12' ],
    'content-length': [ 'Content-Length', 97 ]
  }

尚不明晰成因的饼图黑底问题

已经有两位朋友出现绘图结果中饼图为黑底的情况了,如下图:

Q`G9 ~)G8R_MW}JI7Q8Y81M

我尚不清楚这是哪里导致的问题,在自己的 Windows、Linux 上尝试多次均未能复现,因此修复仍需时日。

饼图是由 matplotlib 绘制的,画完之后仅利用 pillow 进行了简单的裁剪、缩放、粘贴处理,我不理解何处会导致此问题。

欢迎在此 issue 下回复任何你认为对解决此问题有帮助的信息,感谢!有条件的话也欢迎测试下面代码在问题机器上的效果:

测试代码
import asyncio
from base64 import b64encode
from io import BytesIO
from typing import Dict, Literal, Tuple, Union

import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
from PIL import Image

PIE_FONT = "/home/ubuntu/Service/nonebot/data/gachalogs/LXGW-Bold-minipie.ttf"  # 修改此处为自己的字体路径
stat = {
    "total": 1266,
    "cntNot5": 8,
    "cntStar3": 1068,
    "cntChar4": 123,
    "cntWeapon4": 55,
    "cntChar5": 20,
    "cntWeapon5": 0,
}


# https://github.com/monsterxcn/nonebot-plugin-gachalogs/blob/c231ab667872b10789e7f12afa6f4707dbb41b20/nonebot_plugin_gachalogs/data_render.py#L291-L344
async def drawPie(
    stat: Dict, rt: Literal["base64", "image"] = "base64"
) -> Tuple[Union[str, Image.Image], bool]:
    """
    单个饼图绘制

    * ``param stat: Dict`` 统计数据,由 ``calcStat()`` 生成
    * ``param rt: Literal["base64", "image"] = "base64"`` 返回结果类型,默认为 Base64 编码字符串,传入 ``image`` 则返回 ``PIL.Image.Image`` 对象
    - ``return: Tuple[Union[str, Image.Image], bool]`` 返回结果、是否展示三星物品数据
    """
    partMap = [
        {"label": "三星武器", "color": "#73c0de", "total": stat["cntStar3"]},
        {"label": "四星武器", "color": "#91cc75", "total": stat["cntWeapon4"]},
        {"label": "四星角色", "color": "#5470c6", "total": stat["cntChar4"]},
        {"label": "五星武器", "color": "#ee6666", "total": stat["cntWeapon5"]},
        {"label": "五星角色", "color": "#fac858", "total": stat["cntChar5"]},
    ]
    # 如果可显示项目多于 4 项,考虑隐藏三星数据
    showStar3 = True
    if len([p for p in partMap if p["total"]]) > 4:
        partMap = [p for p in partMap if p["label"] != "三星武器"]
        showStar3 = False
    # 提取数据
    labels = [p["label"] for p in partMap if p["total"]]
    colors = [p["color"] for p in partMap if p["total"]]
    sizes = [p["total"] for p in partMap if p["total"]]
    explode = [(0.05 if "五星" in p["label"] else 0) for p in partMap if p["total"]]
    # 绘制饼图
    textprops = {"fontproperties": fm.FontProperties(fname=PIE_FONT, size=18)}  # type: ignore
    fig, ax = plt.subplots()
    fig.set_facecolor("#f9f9f9")  # 这里应该可以任意调整图片底色
    ax.set_facecolor("#f9f9f9")
    ax.pie(
        sizes,
        labels=labels,
        colors=colors,
        autopct="%0.2f%%",
        labeldistance=1.1,
        pctdistance=0.7,
        startangle=60,
        radius=0.7,
        explode=explode,
        shadow=False,
        textprops=textprops,
    )
    ax.axis("equal")
    # 生成图片
    ioBytes = BytesIO()
    plt.savefig(ioBytes, format="png")
    ioBytes.seek(0)
    Image.open(ioBytes).convert("RGBA").save("pie.png")
    if rt == "base64":
        b64Code = b64encode(ioBytes.read()).decode()
        return b64Code, showStar3
    else:
        return Image.open(ioBytes), showStar3


asyncio.run(drawPie(stat, "image"))

感谢 @AquamarineCyan 已经帮我测试了几遍,但似乎单独拎出来测都没问题,一旦在 Bot 插件内运行就会出问题:在 data_render.py L340 附近与测试代码一样,手动加一条 Image.open(ioBytes).convert("RGBA").save("pie.png"),随后保存出来的图片便为黑底图片。

F7DM3T1$)BAJESTOW%KG@X

😫那咋回事呀..

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.