前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >微信机器人发 @消息没有 @效果

微信机器人发 @消息没有 @效果

作者头像
查克
发布2025-02-21 15:29:32
发布2025-02-21 15:29:32
4000
代码可运行
举报
文章被收录于专栏:碲矿碲矿
运行总次数:0
代码可运行

假设你用法正确,但你在群里发送 @人的消息,却只有消息没有 @效果,是哪里出问题了呢?

可能 @一个人有效果,@多个人没效果,又是哪里出问题了呢? 先上调试结果

发送函数的第四个参数(即 R9 寄存器),为要 @的 wxid 的 vector 地址,正常如下:

代码语言:javascript
代码运行次数:0
复制

0000018A9F612C60 0000018A9A304610  ÝÚ..... &L"wxid1"
0000018A9F612C68 0000018A9A304630 ÀÝÚ.....
0000018A9F612C70 0000018A9A304630 ÀÝÚ.....

# 跳转过去如下:
0000018A9A304610 0000018A9A304760 `G0..... L"wxid1"
0000018A9A304618 0000001300000013 ........
0000018A9A304620 0000000000000000 ........
0000018A9A304628 0000FF6000000000 ....`ÿ..
0000018A9A304630 00000202FFFFFFFF ÿÿÿÿ....
0000018A9A304638 9003C628BC17D9C5 ÅÙ.¼(Æ..
0000018A9A304640 F8FC804080208020  . .@.üø
0000018A9A304648 8884088608850885 ........
0000018A9A304650 08840884488448FC üH.H....
0000018A9A304658 2000508408FC0884 ..ü..P.
0000018A9A304660 0000000100000000 ........

但存在可能:

代码语言:javascript
代码运行次数:0
复制

0000018A9F612C60 0000018A9ECF6550  ÝÚ..... &L"wxid1"
0000018A9F612C68 0000018A9ECF6590 ÀÝÚ.....
0000018A9F612C70 0000018A9ECF6590 ÀÝÚ.....

# 跳转过去如下:
0000018A9ECF6550 0000018A9A60AED0 Ю`..... L"wxid1"
0000018A9ECF6558 0000001700000013 ........
0000018A9ECF6560 0000000000000000 ........
0000018A9ECF6568 2C35363200000000 ....265,
0000018A9ECF6570 0000018A9A60AED0 Ю`..... L"wxid1"
0000018A9ECF6578 00007FFDED0F0075 u..íý... spy_debug.__718D4FDD_streambuf
0000018A9ECF6580 0000000000000013 ........
0000018A9ECF6588 0000000000000017 ........
0000018A9ECF6590 0000002028BC0000 ..¼( ...
0000018A9ECF6598 90018F49B0EB2BFF ÿ+ë°I...
0000018A9ECF65A0 0000018A9ED43700 .7Ô..... L"黏鄷Ɗ"
0000018A9ECF65A8 0000018A9ED41900 ..Ô..... L"斠폰Ɗ"
0000018A9ECF65B0 0000000000002331 1#......

当然了,这种情况在已经发布的版本里是不会出现的。这是查克耍酷的时候折腾出来的——他想优化一下代码,结果优化出来个 BUG。不过查克已经解了,不必惊慌。

再看看代码

代码语言:javascript
代码运行次数:0
复制

void SendTextMessage(string wxid, string msg, string atWxids)
{
    QWORD success  = 0;
    wstring wsWxid = String2Wstring(wxid);
    wstring wsMsg  = String2Wstring(msg);
    WxString wxMsg(wsMsg);
    WxString wxWxid(wsWxid);

    vector<wstring> vAtWxids;
    vector<WxString> vWxAtWxids;
    if (!atWxids.empty()) {
        wstringstream wss(String2Wstring(atWxids));
        while (wss.good()) {
            wstring wstr;
            getline(wss, wstr, L',');
            vAtWxids.push_back(wstr);
            WxString wxAtWxid(vAtWxids.back());
            vWxAtWxids.push_back(wxAtWxid);
        }
    } else {
        WxString wxEmpty = WxString();
        vWxAtWxids.push_back(wxEmpty);
    }

    QWORD wxAters = (QWORD) & ((RawVector_t *)&vWxAtWxids)->start;

    char buffer[0x460]            = { 0 };
    SendMsgMgr_t funcSendMsgMgr   = (SendMsgMgr_t)(g_WeChatWinDllAddr + OS_SEND_MSG_MGR);
    SendTextMsg_t funcSendTextMsg = (SendTextMsg_t)(g_WeChatWinDllAddr + OS_SEND_TEXT);
    Free_t funcFree               = (Free_t)(g_WeChatWinDllAddr + OS_FREE);
    funcSendMsgMgr();
    success = funcSendTextMsg((QWORD)(&buffer), (QWORD)(&wxWxid), (QWORD)(&wxMsg), wxAters, 1, 1, 0, 0);
    funcFree((QWORD)(&buffer));
}

这是优化前的代码,虽然没优化,但却是没问题的喔。

有 2 个地方挺有意思的。

第一个地方:

代码语言:javascript
代码运行次数:0
复制

    wstring wsWxid = String2Wstring(wxid);
    wstring wsMsg  = String2Wstring(msg);
    WxString wxMsg(wsMsg);
    WxString wxWxid(wsWxid);

这里,为什么要先定义一个 wstring,再定义 WxString 呢?

代码语言:javascript
代码运行次数:0
复制

// 这样不行吗?
WxString wxMsg(String2Wstring(wxid));

第二个地方:

代码语言:javascript
代码运行次数:0
复制

    vector<wstring> vAtWxids;
    vector<WxString> vWxAtWxids;
    if (!atWxids.empty()) {
        wstringstream wss(String2Wstring(atWxids));
        while (wss.good()) {
            wstring wstr;
            getline(wss, wstr, L',');
            vAtWxids.push_back(wstr);
            WxString wxAtWxid(vAtWxids.back());
            vWxAtWxids.push_back(wxAtWxid);
        }
    }

为什么要搞一个 vAtWxids?不是很多余吗?

想搞清楚这两个问题,需要看一下 WxString。代码挺长的,这里不贴,有兴趣的伙伴自己去看吧。

当然了,这里的代码也是没有问题的。 问题在哪里?

那么,问题在哪里呢?

问题在你的假设:用法正确

显然,是你的用法不正确啊!

正确的用法? 见 【FAQ】WeChatFerry 机器人常见问题 v39.0.14 Q7。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 碲矿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 再看看代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档