Compare commits

..
Author SHA1 Message Date
hugy 64a603c96b fix: close socket 2023-06-02 23:18:05 +08:00
hugy 63ac97c864 feat: 头像 2023-06-02 14:28:25 +08:00
10 changed files with 110 additions and 89 deletions
+43 -1
View File
@@ -41,6 +41,8 @@
62.发送公众号消息
63.转发公众号消息
64.发送小程序
65.退款
66.下载头像
### 接口文档:
@@ -1923,7 +1925,7 @@
> 收到转账消息后,自动退款。type=49 即是转账消息。
###### 接口地址
> [/api/?type=45](/api/?type=65)
> [/api/?type=65](/api/?type=65)
###### HTTP请求方式
> POST JSON
@@ -1956,4 +1958,44 @@
响应:
``` javascript
{"code":1,"result":"OK"}
```
#### 66.查询或下载头像**
###### 接口功能
> 暂时没用的功能
###### 接口地址
> [/api/?type=66](/api/?type=66)
###### HTTP请求方式
> POST JSON
###### 请求参数
|参数|必选|类型|说明|
|---|---|---|---|
|wxid|string|微信id|
|imageUrl|string|头像地址|
###### 返回字段
|返回字段|字段类型|说明 |
|---|---|---|
|code|int|返回状态,1成功|
|result|string|成功提示|
###### 接口示例
入参:
``` javascript
{
"wxid":"wxid_agz5q76f11112",
"imageUrl":""
}
```
响应:
``` javascript
{"code":1,"result":"OK"}
```
+1
View File
@@ -79,6 +79,7 @@ typedef enum HTTP_API_ROUTE {
WECHAT_FORWARD_PUBLIC_MSG_BY_SVRID,
WECHAT_SEND_APP_MSG,
WECHAT_REFUSE,
WECHAT_GET_HEAD_IMG,
} WECHAT_HTTP_APIS,
*PWECHAT_HTTP_APIS;
+26
View File
@@ -255,4 +255,30 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
success = 1;
return success;
}
int ContactMgr::GetHeadImage(wchar_t* wxid,wchar_t* url){
int success = -1;
WeChatString contact(wxid);
WeChatString img_url(url);
DWORD head_image_mgr_addr = base_addr_ + WX_HEAD_IMAGE_MGR_OFFSET;
DWORD get_img_download_addr = base_addr_ + QUERY_THEN_DOWNLOAD_OFFSET;
char temp[0x8] ={0};
__asm{
PUSHAD
PUSHFD
CALL head_image_mgr_addr
LEA ECX,img_url
PUSH ECX
LEA ECX,contact
PUSH ECX
LEA ECX,temp
PUSH ECX
MOV ECX,EAX
CALL get_img_download_addr
POPFD
POPAD
}
success = 1;
return success;
}
} // namespace wxhelper
+1
View File
@@ -16,6 +16,7 @@ class ContactMgr : public BaseMgr {
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);
int GetHeadImage(wchar_t* wxid,wchar_t* url);
};
} // namespace wxhelper
+1 -2
View File
@@ -18,7 +18,7 @@ void GlobalContext::initialize(HMODULE module) {
#ifndef _DEBUG
hide_module->Hide(module_);
#endif
ThreadPool::GetInstance().Create(2,8);
HttpServer::GetInstance().Init(config->GetPort());
HttpServer::GetInstance().HttpStart();
DB::GetInstance().init(base);
@@ -28,7 +28,6 @@ void GlobalContext::initialize(HMODULE module) {
account_mgr.emplace(AccountMgr{base});
chat_room_mgr.emplace(ChatRoomMgr{base});
sns_mgr.emplace(SNSMgr{base});
ThreadPool::GetInstance().Create(1,512);
}
void GlobalContext::finally() {
+11 -75
View File
@@ -43,54 +43,6 @@ static DWORD user_info_next_addr_ = 0;
UserInfo userinfo = {};
void SendSocketMessage(InnerMessageStruct *msg) {
if (msg == NULL) {
return;
}
unique_ptr<InnerMessageStruct> sms(msg);
json j_msg =
json::parse(msg->buffer, msg->buffer + msg->length, nullptr, false);
if (j_msg.is_discarded() == true) {
return;
}
string jstr = j_msg.dump() + "\n";
if (server_port_ == 0) {
SPDLOG_ERROR("http server port error :{}",server_port_);
return;
}
SOCKET client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client_socket < 0) {
SPDLOG_ERROR("socket init fail");
return;
}
BOOL status = false;
sockaddr_in client_addr;
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons((u_short)server_port_);
InetPtonA(AF_INET, server_ip_, &client_addr.sin_addr.s_addr);
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
sizeof(sockaddr)) < 0) {
SPDLOG_ERROR("socket connect fail");
return;
}
char recv_buf[1024] = {0};
int ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
if (ret == -1 || ret == 0) {
SPDLOG_ERROR("socket send fail ,ret::{}",ret);
closesocket(client_socket);
return;
}
memset(recv_buf, 0, sizeof(recv_buf));
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
closesocket(client_socket);
if (ret == -1 || ret == 0) {
SPDLOG_ERROR("socket recv fail ,ret:{}",ret);
return;
}
}
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
PTP_WORK Work) {
InnerMessageStruct *msg = (InnerMessageStruct *)context;
@@ -131,34 +83,26 @@ VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
sizeof(sockaddr)) < 0) {
SPDLOG_ERROR("socket connect fail");
closesocket(client_socket);
WSACleanup();
return ;
goto clean;
}
char recv_buf[1024] = {0};
ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
if (ret == -1 || ret == 0) {
if (ret < 0) {
SPDLOG_ERROR("socket send fail ,ret:{}", ret);
closesocket(client_socket);
WSACleanup();
return;
goto clean;
}
ret = shutdown(client_socket, SD_SEND);
if (ret == SOCKET_ERROR) {
SPDLOG_ERROR("shutdown failed with erro:{}", ret);
closesocket(client_socket);
WSACleanup();
return ;
goto clean;
}
memset(recv_buf, 0, sizeof(recv_buf));
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
closesocket(client_socket);
if (ret == -1 || ret == 0) {
if (ret < 0) {
SPDLOG_ERROR("socket recv fail ,ret:{}", ret);
WSACleanup();
return;
goto clean;
}
clean:
closesocket(client_socket);
WSACleanup();
return;
}
@@ -211,12 +155,7 @@ void __cdecl OnRecvMsg(DWORD msg_addr) {
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
inner_msg->length = jstr.size();
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
SPDLOG_INFO("add work:{}",add);
// HANDLE thread = CreateThread(
// NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
// if (thread) {
// CloseHandle(thread);
// }
SPDLOG_INFO("add msg work:{}",add);
}
@@ -263,11 +202,8 @@ void __cdecl OnSnsTimeLineMsg(DWORD msg_addr) {
inner_msg->buffer = new char[jstr.size() + 1];
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
inner_msg->length = jstr.size();
HANDLE thread = CreateThread(
NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
if (thread) {
CloseHandle(thread);
}
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
SPDLOG_INFO("add sns work:{}",add);
}
/// @brief hook sns msg implement
+12 -4
View File
@@ -429,9 +429,9 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
wstring wxid = GetWStringParam(j_param, "wxid");
wstring transcationid = GetWStringParam(j_param, "transcationId");
wstring transferid = GetWStringParam(j_param, "transferId");
BOOL response =g_context.misc_mgr->DoConfirmReceipt(
int success =g_context.misc_mgr->DoConfirmReceipt(
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
json ret_data = {{"msg", response}, {"result", "OK"}};
json ret_data = {{"code", success}, {"result", "OK"}};
ret = ret_data.dump();
break;
}
@@ -654,9 +654,17 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
wstring wxid = GetWStringParam(j_param, "wxid");
wstring transcationid = GetWStringParam(j_param, "transcationId");
wstring transferid = GetWStringParam(j_param, "transferId");
BOOL response =g_context.misc_mgr->DoRefuseReceipt(
int success =g_context.misc_mgr->DoRefuseReceipt(
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
json ret_data = {{"msg", response}, {"result", "OK"}};
json ret_data = {{"code", success}, {"result", "OK"}};
ret = ret_data.dump();
break;
}
case WECHAT_GET_HEAD_IMG:{
wstring wxid = GetWStringParam(j_param, "wxid");
wstring url = GetWStringParam(j_param, "imageUrl");
int success =g_context.contact_mgr->GetHeadImage(WS2LPWS(wxid), WS2LPWS(url));
json ret_data = {{"code", success}, {"result", "OK"}};
ret = ret_data.dump();
break;
}
+10 -3
View File
@@ -6,10 +6,16 @@
namespace wxhelper {
ThreadPool::~ThreadPool() {
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
CloseThreadpoolCleanupGroup(cleanup_group_);
CloseThreadpool(pool_);
if(cleanup_group_){
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
CloseThreadpoolCleanupGroup(cleanup_group_);
}
DestroyThreadpoolEnvironment(&env_);
if (pool_){
CloseThreadpool(pool_);
}
}
bool ThreadPool::Create(unsigned long min, unsigned long max) {
InitializeThreadpoolEnvironment(&env_);
pool_ = CreateThreadpool(NULL);
@@ -38,4 +44,5 @@ bool ThreadPool::AddWork(PTP_WORK_CALLBACK callback,PVOID opt) {
SubmitThreadpoolWork(work);
return true;
}
} // namespace wxhelper
-3
View File
@@ -13,9 +13,6 @@ class ThreadPool :public Singleton<ThreadPool>{
bool AddWork(PTP_WORK_CALLBACK callback,PVOID opt);
private:
void operator=(const ThreadPool&) = delete;
void operator=(ThreadPool&&) = delete;
PTP_POOL pool_;
PTP_CLEANUP_GROUP cleanup_group_;
TP_CALLBACK_ENVIRON env_;
+5 -1
View File
@@ -26,7 +26,9 @@
// sendMessageMgr
#define WX_SEND_MESSAGE_MGR_OFFSET 0x768be0
// shareRecordMgr
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
// headImageMgr
#define WX_HEAD_IMAGE_MGR_OFFSET 0x808850
// setChatMsgValue
@@ -203,6 +205,8 @@
#define FREE_WA_UPDATABLE_MSG_INFO_OFFSET 0x79d4c0
#define SEND_APP_MSG_OFFSET 0xfe8e40
// query head image then download
#define QUERY_THEN_DOWNLOAD_OFFSET 0xc642f0
/*******************hook*********************************************/