mirai
mirai copied to clipboard
支持 MarketFace 的构造
我发现了这个API
https://gxh.vip.qq.com/qqshow/admindata/comdata/vipEmoji_item_${itemid}/xydata.json
可以查看指定表情相关信息,比较关键的是,可以获取表情的md5
表情原图
https://gxh.vip.qq.com/club/item/parcel/item/9f/9f56b8605ec9739c019df342e4a8694a/300x300.png
对于MarketFaceImpl
的构造参数delegate(ImMsgBody.MarketFace
)
// 表情文件的md5 比特数组表示
faceId: ab1624acabe1e94f84cf0e0dc0741f93
// 默认 1
faceInfo: 1
// faceName 从电脑发送的face,faceName 是空的,会影响mirai判断消息内容是否为空
faceName: [哭哭]
// 默认 200 但是 填入 0还是 300都不影响 实际显示大小
imageHeight: 200
imageWidth: 200
// 默认 6
itemType: 6
// 64位hash 字符串表示 估计是访问权限相关,因为存在付费表情,应该存在某种构造免费表情KEY的方式
// 免费表情KEY 可以使用 骰子 的 key填进去,也可以发送成功
key: d0f95a43b4b9185c
// 默认 0
mediaType: 0
// 非特殊表情 置空
mobileParam:
// 非特殊表情 置空
param:
// 不定长,比特数组 未知 但是貌似可以和mobileParam param 一样可以置空,不影响表情发送
pbReserve: 0a0608ac0210ac020a0608c80110c8014001
// 默认 3
subType: 3
// 上述API的itemid
tabId: 209578
我觉得即使支持了,也不太好管理。不如发图片
我觉得即使支持了,也不太好管理。不如发图片
的确,不过我觉得至少 支持收到的表情 的序列化,只能留存在运行过程中有点鸡肋
最新发现 key 的 构造方式为 timestamp (只取到秒位) 的 md5 的前 64 位
例如 1657008872945
, 取 1657008872
的 md5 bcba57b0f826fe45ec742df5ed968963
, 再取 前 64 位 bcba57b0f826fe45
timestamp 可以在
https://gxh.vip.qq.com/qqshow/admindata/comdata/vipEmoji_item_${itemid}/xydata.json
返回的数据中获得(但不是100%有,有一定几率没有)
草
怎么逆出来的 天才
最新发现,商城表情的表情包API还有两个
分别是https://i.gtimg.cn/club/item/parcel/{itemid % 10}/{itemid}_android.json
和https://gxh.vip.qq.com/club/item/parcel/{itemid % 10}/{itemid}_android.json
如 itemid 为233001
即https://i.gtimg.cn/club/item/parcel/1/233001_android.json
获取商城表情资源可以使用https://i.gtimg.cn/club/item/parcel/item/{emote_hash[:2]}/{emote_hash}/{h}x{w}.png
或https://gxh.vip.qq.com/club/item/parcel/item/{emote_hash[:2]}/{emote_hash}/{h}x{w}.png
这样只能获取 png 格式的表情图,即使该表情为动态表情,也只能获取第一帧
如 emote_hash 为3f407e9807da0896d83831e9a4dc5f66
即https://i.gtimg.cn/club/item/parcel/item/3f/3f407e9807da0896d83831e9a4dc5f66/300x300.png
这个资源 url 同时存在一个加密的资源,只需把 url 末尾的{h}x{w}.png
改为{h}_{w}
即可,加密算法是 TEA 密钥为上面提到的 key,解密成功后识别到动态表情为 GIF 格式