From db5051ae2f2c14e01c447e140f5c3e93ed008100 Mon Sep 17 00:00:00 2001 From: hugy <504650082@qq.com> Date: Fri, 17 Feb 2023 08:44:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B7=BB=E5=8A=A0=E5=A5=BD?= =?UTF-8?q?=E5=8F=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 44 ++++++++++++++++++++++++++++++++++++++-- src/api.cc | 4 ++++ src/contact.cc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/contact.h | 2 ++ 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f78068..4096ab6 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,9 @@ vcpkg 2023-02-09 : 新增3.9.0.28版本基础功能。 -2023-02-13 : 新增查询联系人昵称功能。 +2023-02-13 : 新增查询联系人昵称功能。 + +2023-02-17 : 新增通过wxid添加好友。 #### 功能预览: 0.检查是否登录 @@ -113,7 +115,8 @@ vcpkg 10.取消hook消息 11.hook图片 12.取消hook图片 -17.删除好友 +17.删除好友 +20.通过wxid添加好友 25.获取群成员 26.获取群成员昵称 27.删除群成员 @@ -507,6 +510,43 @@ vcpkg + +#### 20.通过wxid添加好友** +###### 接口功能 +> 添加好友 + +###### 接口地址 +> [/api/?type=20](/api/?type=20) + +###### HTTP请求方式 +> POST JSON + +###### 请求参数 +|参数|必选|类型|说明| +|---|---|---|---| +|wxid |true |string| 好友wxid | + + +###### 返回字段 +|返回字段|字段类型|说明 | +|---|---|---| +|code|int|返回状态,1成功, -1失败| +|result|string|成功提示| + + +###### 接口示例 +入参: +``` javascript +{ + "wxid":"wxid_o1112222" +} +``` +响应: +``` javascript +{"code":1,"result":"OK"} +``` + + #### 25.获取群成员** ###### 接口功能 > 获取群成员 diff --git a/src/api.cc b/src/api.cc index 8e6a5c0..434827c 100644 --- a/src/api.cc +++ b/src/api.cc @@ -324,6 +324,10 @@ void api_handle(mg_http_message *hm, struct mg_connection *c, string &ret) { break; } case WECHAT_CONTACT_ADD_BY_WXID: { + wstring user_id = get_http_req_param(hm, j_param, "wxid", is_post); + int success = AddFriendByWxid(WS2LW(user_id)); + json ret_data = {{"code", success}, {"result", "OK"}}; + ret = ret_data.dump(); break; } case WECHAT_CONTACT_ADD_BY_V3: { diff --git a/src/contact.cc b/src/contact.cc index 0bf39fe..c37edbc 100644 --- a/src/contact.cc +++ b/src/contact.cc @@ -13,6 +13,7 @@ using namespace std; #define WX_DO_DEL_CONTACT_OFFSET 0xca6480 #define WX_FREE_CONTACT_OFFSET 0xe23690 #define WX_GET_CONTACT_OFFSET 0xb93b20 +#define WX_DO_VERIFY_USER_OFFSET 0xB91160 int GetAllContact(vector &vec) { DWORD base = GetWeChatWinBase(); @@ -136,3 +137,56 @@ std::wstring GetContactOrChatRoomNickname(wchar_t *id) { } return name; } + + +int AddFriendByWxid(wchar_t *wxid){ + int success = -1; + DWORD base = GetWeChatWinBase(); + DWORD contact_mgr_addr = base + WX_CONTACT_MGR_INSTANCE_OFFSET; + DWORD set_group_addr = base + 0x746E20; + DWORD fn2_addr = base + 0x285D968; + DWORD fn3_addr = base + 0x6F6050; + DWORD fn4_addr = base + 0xED3BE0; + DWORD do_verify_user_addr = base + WX_DO_VERIFY_USER_OFFSET; + + DWORD instance =0; + WeChatString chat_room(NULL); + WeChatString user_id(wxid); + __asm{ + PUSHAD + PUSHFD + CALL contact_mgr_addr + SUB ESP,0x18 + MOV dword ptr [instance],EAX + MOV ECX,ESP + PUSH ECX + LEA ECX,chat_room + CALL set_group_addr + MOV EAX,fn2_addr + SUB ESP,0x18 + MOV ECX,ESP + PUSH EAX + CALL fn3_addr + PUSH 0x0 + PUSH 0XE + SUB ESP,0x14 + MOV ESI,ESP + MOV dword ptr [ESI],0x0 + MOV dword ptr [ESI+0x4],0x0 + MOV dword ptr [ESI+0x8],0x0 + MOV dword ptr [ESI+0xC],0x0 + MOV dword ptr [ESI+0x10],0x0 + PUSH 0x1 + SUB ESP,0x14 + MOV ECX,ESP + LEA EAX,user_id + PUSH EAX + CALL fn4_addr + MOV ECX,dword ptr [instance] + CALL do_verify_user_addr + MOV success,EAX + POPFD + POPAD + } + return success; +} \ No newline at end of file diff --git a/src/contact.h b/src/contact.h index 0c1f981..924ee70 100644 --- a/src/contact.h +++ b/src/contact.h @@ -10,4 +10,6 @@ int GetAllContact(std::vector &vec); int DelContact(wchar_t* wxid); std::wstring GetContactOrChatRoomNickname(wchar_t* id); + +int AddFriendByWxid(wchar_t *wxid); #endif \ No newline at end of file