From 59556cb703ce424d1e6105b857479a1594b0c4cc Mon Sep 17 00:00:00 2001 From: hugy <504650082@qq.com> Date: Wed, 31 May 2023 14:58:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=91=E9=80=81=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=96=87=E7=AB=A0=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/3.9.2.26.md | 53 ++++++++++++++++++++++++++++++++++++++++ src/api_route.h | 1 + src/http_handler.cc | 13 ++++++++++ src/send_message_mgr.cc | 54 +++++++++++++++++++++++++++++++++++++++++ src/send_message_mgr.h | 1 + src/wechat_function.h | 7 ++++++ 6 files changed, 129 insertions(+) diff --git a/doc/3.9.2.26.md b/doc/3.9.2.26.md index da7518a..eca19bb 100644 --- a/doc/3.9.2.26.md +++ b/doc/3.9.2.26.md @@ -37,6 +37,9 @@ 58.登录二维码 59.邀请入群 60.获取群/群成员详情 +61.撤回消息 +62.发送公众号消息 + ### 接口文档: @@ -1782,4 +1785,54 @@ 响应: ``` javascript {"code":1,"result":"OK"} +``` + + +#### 62.发送公众号消息** +###### 接口功能 +> 公众号文章分享/转发的功能 + +###### 接口地址 +> [/api/?type=60](/api/?type=61) + +###### HTTP请求方式 +> POST JSON + +###### 请求参数 +|参数|必选|类型|说明| +|---|---|---|---| +|appname|string|消息xml中的appname| +|username|string|消息xml中的username| +|title|string|消息xml中的title,文章的title| +|url|string|消息xml中的url,文章的uerl| +|thumburl|string|消息xml中的thumburl,缩略图| +|digest|string|消息xml中的digest| +|wxid|string|接收人wxid| + +###### 返回字段 +|返回字段|字段类型|说明 | +|---|---|---| +|code|int|返回状态,1成功, 非0失败| +|result|string|成功提示| + + + + +###### 接口示例 +入参: +``` javascript +{ + "appname": "电手", + "username": "gh_271633b4f577", + "title": "PC硬件、数码产品彻底反转,搞机佬春天回来了", + "url": "http://mp.weixin.qq.com/s?__biz=Mzg3MzY2MjgxMg==&mid=2247712540&idx=1&sn=bd8e8b0d9f2753f3c34a2bfc01770510&chksm=ced16f2ff9a6e639cc9bb76631ff03487f86486f0f29fcf9f8bed754354cb20eda31cc894a56&scene=0&xtrack=1#rd", + "thumburl": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/tpzwaqMCicQyEkBtLgibrKXVKD5gGUEtL00rJ2pxmpmmP9KgoBHiciamYhqZ0ff4kNlnPpnATqozxgRq4AtEzibo4iaw/640?wxtype=jpeg&wxfrom=0", + "digest": "这谁顶得住?", + "wxid": "filehelper" +} + +``` +响应: +``` javascript +{"code":0,"result":"OK"} ``` \ No newline at end of file diff --git a/src/api_route.h b/src/api_route.h index 0f39b0c..a40da7f 100644 --- a/src/api_route.h +++ b/src/api_route.h @@ -75,6 +75,7 @@ typedef enum HTTP_API_ROUTE { WECHAT_INVITE_MEMBERS, WECHAT_GET_MEMBER_PROFILE, WECHAT_REVOKE_MSG, + WECHAT_FORWARD_PUBLIC_MSG, } WECHAT_HTTP_APIS, *PWECHAT_HTTP_APIS; diff --git a/src/http_handler.cc b/src/http_handler.cc index 569310e..7cb7d45 100644 --- a/src/http_handler.cc +++ b/src/http_handler.cc @@ -621,6 +621,19 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) { ret = ret_data.dump(); break; } + case WECHAT_FORWARD_PUBLIC_MSG:{ + wstring wxid = GetWStringParam(j_param, "wxid"); + wstring appname = GetWStringParam(j_param, "appname"); + wstring username = GetWStringParam(j_param, "username"); + wstring title = GetWStringParam(j_param, "title"); + wstring url = GetWStringParam(j_param, "url"); + wstring thumburl = GetWStringParam(j_param, "thumburl"); + wstring digest = GetWStringParam(j_param, "digest"); + int success = g_context.send_mgr->ForwardPublicMsg(WS2LPWS(wxid), WS2LPWS(title), WS2LPWS(url) , WS2LPWS(thumburl) ,WS2LPWS(username),WS2LPWS(appname),WS2LPWS(digest)); + json ret_data = {{"code", success}, {"result", "OK"}}; + ret = ret_data.dump(); + break; + } default: json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}}; ret = ret_data.dump(); diff --git a/src/send_message_mgr.cc b/src/send_message_mgr.cc index 09f53eb..ee1ef5c 100644 --- a/src/send_message_mgr.cc +++ b/src/send_message_mgr.cc @@ -235,4 +235,58 @@ int SendMessageMgr::ForwardMsg(wchar_t* wxid, unsigned long long msgid) { } return success; } + +int SendMessageMgr::ForwardPublicMsg(wchar_t* wxid, wchar_t* title, wchar_t* url, wchar_t* thumburl,wchar_t* senderId,wchar_t* senderName,wchar_t* digest) { + int success = -1; + char buff[0x238] = {0}; + DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET; + DWORD app_msg_mgr_addr = base_addr_ + WX_APP_MSG_MGR_OFFSET; + DWORD new_item_addr = base_addr_ + NEW_MM_READ_ITEM_OFFSET; + DWORD free_item_2_addr = base_addr_ + FREE_MM_READ_ITEM_2_OFFSET; + DWORD forward_public_msg_addr = base_addr_ + FORWARD_PUBLIC_MSG_OFFSET; + __asm { + PUSHAD + PUSHFD + LEA ECX,buff + CALL new_item_addr + POPFD + POPAD + } + WeChatString to_user(wxid); + WeChatString wtitle(title); + WeChatString wurl(url); + WeChatString wthumburl(thumburl); + WeChatString wsender(senderId); + WeChatString wname(senderName); + WeChatString wdigest(digest); + memcpy(&buff[0x4], &wtitle, sizeof(wtitle)); + memcpy(&buff[0x2c], &wurl, sizeof(wurl)); + memcpy(&buff[0x6c], &wthumburl, sizeof(wthumburl)); + memcpy(&buff[0x94], &wdigest, sizeof(wdigest)); + memcpy(&buff[0x1A0], &wsender, sizeof(wsender)); + memcpy(&buff[0x1B4], &wname, sizeof(wname)); + __asm { + PUSHAD + PUSHFD + CALL app_msg_mgr_addr + LEA ECX,buff + PUSH ECX + SUB ESP,0x14 + MOV EDI,EAX + MOV ECX,ESP + LEA EBX,to_user + PUSH EBX + CALL init_chat_msg_addr + MOV ECX,EDI + CALL forward_public_msg_addr + MOV success,EAX + ADD EBX,0x14 + LEA ECX,buff + PUSH 0x0 + CALL free_item_2_addr + POPFD + POPAD + } + return success; +} } // namespace wxhelper \ No newline at end of file diff --git a/src/send_message_mgr.h b/src/send_message_mgr.h index 7e34db5..55783dd 100644 --- a/src/send_message_mgr.h +++ b/src/send_message_mgr.h @@ -11,6 +11,7 @@ class SendMessageMgr:public BaseMgr { int SendImage(wchar_t *wxid, wchar_t *image_path); int SendFile(wchar_t *wxid, wchar_t *file_path); int ForwardMsg(wchar_t *wxid, unsigned long long msgid); + int ForwardPublicMsg(wchar_t* wxid, wchar_t* title, wchar_t* url, wchar_t* thumburl,wchar_t* senderId,wchar_t* senderName,wchar_t* digest); private: }; diff --git a/src/wechat_function.h b/src/wechat_function.h index e94ece5..19c2e6b 100644 --- a/src/wechat_function.h +++ b/src/wechat_function.h @@ -188,6 +188,13 @@ +// public msg forward + +#define NEW_MM_READ_ITEM_OFFSET 0x76f0d0 +#define FREE_MM_READ_ITEM_OFFSET 0x76e4d0 +#define FREE_MM_READ_ITEM_2_OFFSET 0x76edf0 +#define FORWARD_PUBLIC_MSG_OFFSET 0xb73de0 + /*******************hook*********************************************/