Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59556cb703 | ||
|
|
303ed1ade0 | ||
|
|
3da32cce12 | ||
|
|
d1ce40c216 | ||
|
|
3cd6953920 | ||
|
|
83886fe464 | ||
|
|
826e504fb3 |
+141
@@ -36,6 +36,10 @@
|
||||
57.获取消息语音文件
|
||||
58.登录二维码
|
||||
59.邀请入群
|
||||
60.获取群/群成员详情
|
||||
61.撤回消息
|
||||
62.发送公众号消息
|
||||
|
||||
|
||||
|
||||
### 接口文档:
|
||||
@@ -1694,4 +1698,141 @@
|
||||
响应:
|
||||
``` javascript
|
||||
{"code":1,"result":"OK"}
|
||||
```
|
||||
|
||||
|
||||
#### 60.群/群成员详情**
|
||||
###### 接口功能
|
||||
> 邀请入群
|
||||
|
||||
###### 接口地址
|
||||
> [/api/?type=60](/api/?type=60)
|
||||
|
||||
###### HTTP请求方式
|
||||
> POST JSON
|
||||
|
||||
###### 请求参数
|
||||
|参数|必选|类型|说明|
|
||||
|---|---|---|---|
|
||||
|wxid|string|wxid|
|
||||
|
||||
|
||||
|
||||
###### 返回字段
|
||||
|返回字段|字段类型|说明 |
|
||||
|---|---|---|
|
||||
|code|int|返回状态,1成功, 非0失败|
|
||||
|result|string|成功提示|
|
||||
|
||||
|
||||
|
||||
|
||||
###### 接口示例
|
||||
入参:
|
||||
``` javascript
|
||||
{
|
||||
"wxid":"wxid_8888"
|
||||
}
|
||||
|
||||
```
|
||||
响应:
|
||||
``` javascript
|
||||
{
|
||||
"account": "lllla",
|
||||
"code": 1,
|
||||
"headImage": "",
|
||||
"nickname": "昵称",
|
||||
"result": "OK",
|
||||
"v3": "v3_020b3sssd031xxxxx05@stranger",
|
||||
"wxid": "wxid_888888"
|
||||
}
|
||||
```
|
||||
|
||||
#### 61.撤回消息**
|
||||
###### 接口功能
|
||||
> 撤回消息,有时间限制。
|
||||
|
||||
###### 接口地址
|
||||
> [/api/?type=60](/api/?type=61)
|
||||
|
||||
###### HTTP请求方式
|
||||
> POST JSON
|
||||
|
||||
###### 请求参数
|
||||
|参数|必选|类型|说明|
|
||||
|---|---|---|---|
|
||||
|msgId|string|消息id|
|
||||
|
||||
|
||||
|
||||
###### 返回字段
|
||||
|返回字段|字段类型|说明 |
|
||||
|---|---|---|
|
||||
|code|int|返回状态,1成功, 非0失败|
|
||||
|result|string|成功提示|
|
||||
|
||||
|
||||
|
||||
|
||||
###### 接口示例
|
||||
入参:
|
||||
``` javascript
|
||||
{
|
||||
"msgId":45645454654654874548888
|
||||
}
|
||||
|
||||
```
|
||||
响应:
|
||||
``` 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"}
|
||||
```
|
||||
@@ -526,7 +526,7 @@ DWORD GetPIDForProcess(wchar_t* process)
|
||||
if (!hSnapshot) {
|
||||
return 0;
|
||||
}
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32W);
|
||||
for (working = Process32FirstW(hSnapshot, &pe32); working; working = Process32NextW(hSnapshot, &pe32))
|
||||
{
|
||||
if (!wcscmp(pe32.szExeFile, process))
|
||||
|
||||
+1
-1
@@ -186,7 +186,7 @@ int AccountMgr::CheckLogin() {
|
||||
POPAD
|
||||
}
|
||||
if (service_addr) {
|
||||
success = *(DWORD *)(service_addr + 0x4C8);
|
||||
success = *(DWORD *)(service_addr + 0x4E0);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -73,6 +73,9 @@ typedef enum HTTP_API_ROUTE {
|
||||
WECHAT_GET_VOICE,
|
||||
WECHAT_GET_QRCODE,
|
||||
WECHAT_INVITE_MEMBERS,
|
||||
WECHAT_GET_MEMBER_PROFILE,
|
||||
WECHAT_REVOKE_MSG,
|
||||
WECHAT_FORWARD_PUBLIC_MSG,
|
||||
} WECHAT_HTTP_APIS,
|
||||
*PWECHAT_HTTP_APIS;
|
||||
|
||||
|
||||
@@ -217,4 +217,42 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
int ContactMgr::GetContactByWxid(wchar_t *wxid,ContactProfile& profile){
|
||||
int success = -1;
|
||||
char buff[0x440] = {0};
|
||||
WeChatString pri(wxid);
|
||||
DWORD contact_mgr_addr = base_addr_ + WX_CONTACT_MGR_OFFSET;
|
||||
DWORD get_contact_addr = base_addr_ + WX_GET_CONTACT_OFFSET;
|
||||
DWORD free_contact_addr = base_addr_ + WX_FREE_CONTACT_OFFSET;
|
||||
__asm {
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
CALL contact_mgr_addr
|
||||
LEA ECX,buff
|
||||
PUSH ECX
|
||||
LEA ECX,pri
|
||||
PUSH ECX
|
||||
MOV ECX,EAX
|
||||
CALL get_contact_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
success = 0;
|
||||
profile.wxid = READ_WSTRING(buff, 0x10);
|
||||
profile.account = READ_WSTRING(buff, 0x24);
|
||||
profile.v3 = READ_WSTRING(buff, 0x38);
|
||||
profile.nickname = READ_WSTRING(buff, 0x6C);
|
||||
profile.head_image = READ_WSTRING(buff, 0x110);
|
||||
__asm {
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
LEA ECX,buff
|
||||
CALL free_contact_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
success = 1;
|
||||
return success;
|
||||
}
|
||||
} // namespace wxhelper
|
||||
@@ -15,6 +15,7 @@ class ContactMgr : public BaseMgr {
|
||||
std::wstring GetContactOrChatRoomNickname(wchar_t* id);
|
||||
int AddFriendByWxid(wchar_t* wxid,wchar_t* msg);
|
||||
int VerifyApply(wchar_t *v3, wchar_t *v4,int permission);
|
||||
int GetContactByWxid(wchar_t* wxid,ContactProfile& profile);
|
||||
};
|
||||
} // namespace wxhelper
|
||||
|
||||
|
||||
@@ -591,7 +591,52 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
case WECHAT_GET_MEMBER_PROFILE: {
|
||||
wstring pri_id = GetWStringParam(j_param, "wxid");
|
||||
ContactProfile profile;
|
||||
int success =
|
||||
g_context.contact_mgr->GetContactByWxid(WS2LPWS(pri_id),profile);
|
||||
if(success==1){
|
||||
json ret_data = {
|
||||
{"code", success},
|
||||
{"result", "OK"},
|
||||
{"account", Utils::WstringToUTF8(profile.account)},
|
||||
{"headImage", Utils::WstringToUTF8(profile.head_image)},
|
||||
{"nickname", Utils::WstringToUTF8(profile.nickname)},
|
||||
{"v3", Utils::WstringToUTF8(profile.v3)},
|
||||
{"wxid", Utils::WstringToUTF8(profile.wxid)},
|
||||
};
|
||||
ret = ret_data.dump();
|
||||
} else {
|
||||
json ret_data = {{"result", "ok"}, {"code", success}};
|
||||
ret = ret_data.dump();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case WECHAT_REVOKE_MSG:{
|
||||
ULONG64 msg_id = GetULong64Param(j_param, "msgId");
|
||||
int success = g_context.misc_mgr->RevokeMsg(msg_id);
|
||||
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||
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();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -415,4 +415,45 @@ int MiscMgr::SearchContactNetScene(wchar_t *keyword,UserInfo ** user) {
|
||||
return success;
|
||||
}
|
||||
|
||||
int MiscMgr::RevokeMsg(ULONG64 msg_id){
|
||||
int success = -1;
|
||||
char chat_msg[0x2D8] = {0};
|
||||
DWORD new_chat_msg_addr = base_addr_ + WX_NEW_CHAT_MSG_OFFSET;
|
||||
DWORD free_addr = base_addr_ + WX_FREE_CHAT_MSG_INSTANCE_COUNTER_OFFSET;
|
||||
DWORD get_chat_mgr_addr = base_addr_ + WX_CHAT_MGR_OFFSET;
|
||||
DWORD get_by_local_Id_addr = base_addr_ + WX_GET_MGR_BY_PREFIX_LOCAL_ID_OFFSET;
|
||||
DWORD revoke_msg_addr = base_addr_ + WX_REVOKE_MSG_OFFSET;
|
||||
|
||||
int db_index = 0;
|
||||
int local_id = DB::GetInstance().GetLocalIdByMsgId(msg_id, db_index);
|
||||
if (local_id < 1) {
|
||||
return -2;
|
||||
}
|
||||
__asm{
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
LEA ECX,chat_msg
|
||||
CALL new_chat_msg_addr
|
||||
CALL get_chat_mgr_addr
|
||||
PUSH dword ptr [db_index]
|
||||
LEA ECX,chat_msg
|
||||
PUSH dword ptr [local_id]
|
||||
CALL get_by_local_Id_addr
|
||||
ADD ESP,0x8
|
||||
CALL get_chat_mgr_addr
|
||||
LEA ECX,chat_msg
|
||||
PUSH ECX
|
||||
MOV ECX,EAX
|
||||
CALL revoke_msg_addr
|
||||
MOV success,EAX
|
||||
LEA ECX,chat_msg
|
||||
PUSH 0x0
|
||||
CALL free_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
|
||||
return success;
|
||||
|
||||
}
|
||||
} // namespace wxhelper
|
||||
@@ -18,6 +18,7 @@ class MiscMgr :public BaseMgr{
|
||||
int GetVoice(ULONG64 msg_id, wchar_t* dir);
|
||||
int GetImgByName(wchar_t* file_path,wchar_t* save_dir);
|
||||
int SearchContactNetScene(wchar_t *keyword,UserInfo ** user);
|
||||
int RevokeMsg(ULONG64 msg_id);
|
||||
};
|
||||
} // namespace wxhelper
|
||||
|
||||
|
||||
+54
-2
@@ -37,8 +37,6 @@ int SendMessageMgr::SendText(wchar_t* wxid, wchar_t* msg) {
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
SPDLOG_INFO("SendText code = {}",success);
|
||||
SPDLOG_INFO("global log with source info");
|
||||
return success;
|
||||
}
|
||||
int SendMessageMgr::SendAtText(wchar_t* chat_room_id, wchar_t** wxids, int len,
|
||||
@@ -237,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
|
||||
@@ -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:
|
||||
};
|
||||
|
||||
+17
-1
@@ -98,7 +98,8 @@
|
||||
#define WX_DOWNLOAD_VIDEO_IMG_OFFSET 0xd46c30
|
||||
|
||||
|
||||
|
||||
// revoke
|
||||
#define WX_REVOKE_MSG_OFFSET 0xbb6dc0
|
||||
|
||||
|
||||
// pat
|
||||
@@ -187,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*********************************************/
|
||||
|
||||
|
||||
@@ -778,4 +786,12 @@ struct Unkown{
|
||||
DWORD field5= 0;
|
||||
DWORD field6= 0;
|
||||
};
|
||||
|
||||
struct ContactProfile{
|
||||
std::wstring wxid;
|
||||
std::wstring account;
|
||||
std::wstring v3;
|
||||
std::wstring nickname;
|
||||
std::wstring head_image;
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user