pandolia / qqbot

QQBot: A conversation robot base on Tencent's SmartQQ
Other
3.68k stars 876 forks source link

群名片不完整 #88

Closed waylonwang closed 7 years ago

waylonwang commented 7 years ago

当用户群名片较长时,通过当前方法获取到的群名片是不完整的,因为web qq协议返回的群名片是超长截断的,即便http://qun.qq.com中所有的群名片也都是被截断的

http://qun.qzone.qq.com中查看的群名片却是完整,虽然web界面中会折叠超长部分,但是实际内容是完整的,因此可以考虑获取群名片的方法使用下面这个接口:

http://qun.qzone.qq.com/cgi-bin/get_group_member?uin=[用户QQ号]&groupid=[群号]&neednum=1&r=0.9828503488543949&g_tk=229651109

此接口返回的数据格式是:

_Callback({"code":0,"data":{"alpha":0,"bbscount":0,"class":0,"create_time":1056935499,"filecount":0,"finger_memo":"","group_memo":"","group_name":"xxx","item":[{"iscreator":0,"ismanager":0,"nick":"yyyyy","uin":xxx},....],"level":0,"nick":"xxx","option":3,"total":4},"default":0,"message":"","subcode":0});

其中的"nick":"yyyyy"是完整的群名片信息,我尝试了将这部分代码在qqbot中加入,但是由于不懂如何处理登录问题(实际在浏览器中与web qq使用的是相同的二维码方式并自动登录呢)返回的是错误,请看看能否调试一下,谢谢!

pandolia commented 7 years ago

你可以扩展 qsession.py 中的 QSession 类实现这个功能。用这个对象的 smartRequest 方法就可以。 这个接口一次只能获取一个成员的名片,效率太低,对于那种1000多个人的大群肯定不合适。整个的获取完估计超过3分钟了。

pandolia commented 7 years ago

我现在用的是 qun.qq.com 的接口,一个群请求一次就可以将全部成员的 QQ 、 昵称 和 名片 获取到。

waylonwang commented 7 years ago

这个接口获取到的是全部群成员的名片,效率不低的,qun.qq.com 的接口关键问题是群名片不完整

waylonwang commented 7 years ago

我用的就是smartRequest这个方法来获取,但是返回了错误: _Callback({"code":-3000,"default":0,"message":"no login","subcode":-4001});

正确接口返回的是这样的,所有的群成员名片都会有

_Callback(
{
    "code": 0,
    "data": {
        "alpha": 0,
        "bbscount": 0,
        "class": 0,
        "create_time": 1056935499,
        "filecount": 0,
        "finger_memo": "",
        "group_memo": "",
        "group_name": "群名片测试",
        "item": [
            {
                "iscreator": 0,
                "ismanager": 0,
                "nick": "我是超长群名片0我是超长群名片0我是超长群0",
                "uin": aaaaa
            },
            {
                "iscreator": 1,
                "ismanager": 0,
                "nick": "我是超长群名片1我是超长群名片1我是超长群1",
                "uin": xxxxx
            },
            {
                "iscreator": 0,
                "ismanager": 1,
                "nick": "我是超长群名片2我是超长群名片2我是超长群2",
                "uin": yyyyy
            },
            {
                "iscreator": 0,
                "ismanager": 0,
                "nick": "我是超长群名片3我是超长群名片3我是超长群3",
                "uin": zzzzz
            }
        ],
        "level": 0,
        "nick": "xxxxx",
        "option": 3,
        "total": 4
    },
    "default": 0,
    "message": "",
    "subcode": 0
});

完整的群名片是 “我是超长群名片1我是超长群名片1我是超长群1” ,用qun.qq.com获取的群名片只有“我是超长群名片”。

如果用你的qq group-set-card命令设置一个超长的群名片是可以成功的,在手机QQ上确认的确已经修改成功,然后用qq list group-member查询,可能是读缓存的原因显示的群名片也是超长的,但是重新启动qqbot后,再执行qq list group-member查询,得到的就是新拉取的被截断的群名片了