xiyuesaves / LiteLoaderQQNT-lite_tools

LiteLoaderQQNT 插件 - 轻量工具箱 —— 轻量 · 优雅 · 高效
GNU General Public License v3.0
1.12k stars 36 forks source link

[Bug]: getRkey出错导致无法获取 #263

Closed jhqwqmc closed 5 months ago

jhqwqmc commented 5 months ago

请确保您已阅读以上注意事项,并勾选下方的确认框。

QQNT 版本

9.9.11.24402

LiteLoaderQQNT 版本

1.1.1

轻量工具箱 版本

2.30.0

运行环境

Windows

已安装插件列表

No response

重现步骤

调用搜索图片功能

期望的结果是什么?

可以正常调用getRkey

实际的结果是什么?

https://github.com/xiyuesaves/LiteLoaderQQNT-lite_tools/blob/118f68c60be58dc140d2981087408acc8e9bcd4f/src/main_modules/getRkey.js#L12 这一行的rkey.expired_time会获取失败,rkey打印出来是undefined导致报错

补充说明(可选)

No response

xiyuesaves commented 5 months ago

有报错日志吗?

jhqwqmc commented 5 months ago

有报错日志吗?

Uncaught Error: Error invoking remote method 'LiteLoader.lite_tools.getRkey': TypeError: Cannot read properties of undefined (reading 'expired_time')
jhqwqmc commented 5 months ago

和我上面描述的是一样的

xiyuesaves commented 5 months ago

已修复

jhqwqmc commented 5 months ago

已修复

有点小问题,请求接口http://127.0.0.1:9814/get_rkey返回的是

{
    "status": "ok",
    "retcode": 0,
    "data": {
        "private_rkey": "&rkey=xxx1xxx",
        "group_rkey": "&rkey=xxx2xxx"
    },
    "echo": null
}

然后插件读取的时候是直接把返回值当作

{
    "private_rkey": "&rkey=xxx1xxx",
    "group_rkey": "&rkey=xxx2xxx"
}

来读取的,这一段 https://github.com/xiyuesaves/LiteLoaderQQNT-lite_tools/blob/63182c07e88fbb204e1d45cccb0bb02022cf513c/src/main_modules/getRkey.js#L27-L32 改成

    const newRkey = await fetch(config.rkeyAPI).then((res) => res.json());
    const rkeyData = newRkey.data;
    if (typeof rkeyData.group_rkey === "string" && typeof rkeyData.private_rkey === "string") {
      rkey = rkeyData;
      log2("成功更新rkey", rkey);
    } else {
      log2("数据返回格式错误", rkeyData);

就完全没问题了

xiyuesaves commented 5 months ago

我用的接口套了一层转发还没注意到这个问题,建议是给返回添加一个 expired_time 字段避免请求过于频繁,下面是 Mlikiowa 写的实现

import time
import requests
from flask import Flask, request

HTTP_RKEY_SEVER_URL = "http://127.0.0.1:8083/get_rkey"

def client_getRkey(url):
    result = requests.get(url).json()
    private_rkey = result['data']['private_rkey']
    group_rkey = result['data']['group_rkey']
    return {"private_rkey": private_rkey, "group_rkey": group_rkey}

create_time = int(time.time())  # 当前10位时间戳
rkey = client_getRkey(HTTP_RKEY_SEVER_URL)
rkey["expired_time"] = create_time + 60*60

app = Flask(__name__)

@app.route('/get_rkey', methods=['POST', 'GET'])
def server_rkey():
    global create_time, rkey
    if int(time.time()) - create_time > 60 * 60:
        rkey = client_getRkey(HTTP_RKEY_SEVER_URL)
        rkey["expired_time"] = create_time + 60 * 60
        create_time = int(time.time())
    return rkey

app.run(host='0.0.0.0', port=8068, debug=True)
jhqwqmc commented 5 months ago

貌似在对表情包这种特殊图片进行搜索的时候,会出现非法请求的问题,需要把api换成 https://gchat.qpic.cn 才能解决,但是在配置文件中替换,会在下次启动时重新恢复默认,不过如果把 https://multimedia.nt.qq.com.cn 全换成 https://gchat.qpic.cn 也没问题

xiyuesaves commented 5 months ago

和表情包无关,是对方使用的版本过低导致的,2.30.1理论上我应该已经修复了两个图片地址的拼接问题了啊

jhqwqmc commented 5 months ago

和表情包无关,是对方使用的版本过低导致的,2.30.1理论上我应该已经修复了两个图片地址的拼接问题了啊

要不还是先全用 https://gchat.qpic.cn/ 接口?这个貌似没什么兼容性问题

jhqwqmc commented 5 months ago

我用的接口套了一层转发还没注意到这个问题,建议是给返回添加一个 expired_time 字段避免请求过于频繁,下面是 Mlikiowa 写的实现

话说这个为什么不在 FetchRkeyOperation.cs 里实现呢?

using System.Text.Json.Nodes;
using Lagrange.Core;
using Lagrange.Core.Common.Interface.Api;
using Lagrange.OneBot.Core.Entity.Action;

namespace Lagrange.OneBot.Core.Operation.Generic;

[Operation("get_rkey")]
public class FetchRkeyOperation : IOperation
{
    public async Task<OneBotResult> HandleOperation(BotContext context, JsonNode? payload)
    {
        long expiredTime = (long)(DateTime.UtcNow.AddMinutes(10) - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
        var rkeys = await context.FetchRkey();
        return new OneBotResult(new JsonObject { { "private_rkey", rkeys[0] }, { "group_rkey", rkeys[1] }, { "expired_time", expiredTime} }, 0, "ok");
    }
}

https://github.com/jhqwqmc/Lagrange.Core/actions/runs/9557782455

xiyuesaves commented 5 months ago

和表情包无关,是对方使用的版本过低导致的,2.30.1理论上我应该已经修复了两个图片地址的拼接问题了啊

要不还是先全用 https://gchat.qpic.cn/ 接口?这个貌似没什么兼容性问题

部分新版客户端发送的图片用旧接口无法获取

jhqwqmc commented 5 months ago

部分新版客户端发送的图片用旧接口无法获取

那可以先在跳转浏览器前,先请求这个url的头部返回是否为200,如果不是就回退旧接口

xiyuesaves commented 5 months ago

我用的接口套了一层转发还没注意到这个问题,建议是给返回添加一个 expired_time 字段避免请求过于频繁,下面是 Mlikiowa 写的实现

话说这个为什么不在 FetchRkeyOperation.cs 里实现呢?

因为这个项目不是为了这个功能写的,更主要的原因是我不会C#

xiyuesaves commented 5 months ago

部分新版客户端发送的图片用旧接口无法获取

那可以先在跳转浏览器前,先请求这个url的头部返回是否为200,如果不是就回退旧接口

倒也不用,只需要判断链接中的特殊格式就行了,我是没预判到他会返回使用旧接口的标记的同时返回新接口的路径

xiyuesaves commented 5 months ago

已修复

有点小问题,请求接口http://127.0.0.1:9814/get_rkey返回的是

{
    "status": "ok",
    "retcode": 0,
    "data": {
        "private_rkey": "&rkey=xxx1xxx",
        "group_rkey": "&rkey=xxx2xxx"
    },
    "echo": null
}

然后插件读取的时候是直接把返回值当作

{
    "private_rkey": "&rkey=xxx1xxx",
    "group_rkey": "&rkey=xxx2xxx"
}

现已兼容两种接口返回的数据