mirror of
https://github.com/ttttupup/wxhelper.git
synced 2024-11-05 18:09:24 +08:00
feat: 语音转换
This commit is contained in:
parent
1207eb6fc8
commit
28db38b45e
3
app/3rdparty/CMakeLists.txt
vendored
3
app/3rdparty/CMakeLists.txt
vendored
@ -3,4 +3,5 @@ cmake_minimum_required(VERSION 3.10...3.27)
|
|||||||
add_subdirectory(base64)
|
add_subdirectory(base64)
|
||||||
add_subdirectory(lz4)
|
add_subdirectory(lz4)
|
||||||
add_subdirectory(mongoose)
|
add_subdirectory(mongoose)
|
||||||
add_subdirectory(spdlog)
|
add_subdirectory(spdlog)
|
||||||
|
add_subdirectory(tinyxml2)
|
15
app/3rdparty/tinyxml2/CMakeLists.txt
vendored
Normal file
15
app/3rdparty/tinyxml2/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10...3.27)
|
||||||
|
aux_source_directory(. TINYXML2_SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||||
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
|
||||||
|
|
||||||
|
#add_library(tinyxml2 tinyxml2.cpp tinyxml2.h)
|
||||||
|
|
||||||
|
|
||||||
|
add_library(tinyxml2 ${TINYXML2_SOURCE})
|
||||||
|
add_library(tinyxml2::tinyxml2 ALIAS tinyxml2)
|
||||||
|
|
||||||
|
|
||||||
|
target_include_directories(tinyxml2 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
|
2994
app/3rdparty/tinyxml2/tinyxml2.cpp
vendored
Normal file
2994
app/3rdparty/tinyxml2/tinyxml2.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2380
app/3rdparty/tinyxml2/tinyxml2.h
vendored
Normal file
2380
app/3rdparty/tinyxml2/tinyxml2.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -38,6 +38,7 @@ target_include_directories(wxhelper
|
|||||||
PRIVATE ../3rdparty/base64
|
PRIVATE ../3rdparty/base64
|
||||||
PRIVATE ../3rdparty/lz4
|
PRIVATE ../3rdparty/lz4
|
||||||
PRIVATE ../3rdparty/mongoose
|
PRIVATE ../3rdparty/mongoose
|
||||||
|
PRIVATE ../3rdparty/tinyxml2
|
||||||
PRIVATE ../base/src/include
|
PRIVATE ../base/src/include
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -49,6 +50,7 @@ target_link_libraries(wxhelper
|
|||||||
PRIVATE mongoose
|
PRIVATE mongoose
|
||||||
PRIVATE nlohmann_json::nlohmann_json
|
PRIVATE nlohmann_json::nlohmann_json
|
||||||
PRIVATE base
|
PRIVATE base
|
||||||
|
PRIVATE tinyxml2
|
||||||
)
|
)
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(wxhelper PROPERTIES LINKER_LANGUAGE C
|
SET_TARGET_PROPERTIES(wxhelper PROPERTIES LINKER_LANGUAGE C
|
||||||
|
@ -492,4 +492,22 @@ std::string DB::GetPublicMsgCompressContentByMsgId(ULONG64 msgid) {
|
|||||||
return result[1][0];
|
return result[1][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string DB::GetChatMsgStrContentByMsgId(ULONG64 msgid) {
|
||||||
|
char sql[260] = {0};
|
||||||
|
sprintf_s(sql, "select StrContent from MSG where MsgSvrID=%llu;", msgid);
|
||||||
|
wchar_t dbname[20] = {0};
|
||||||
|
for (int i = 0;; i++) {
|
||||||
|
swprintf_s(dbname, L"MSG%d.db", i);
|
||||||
|
UINT64 handle = GetDbHandleByDbName(dbname);
|
||||||
|
if (handle == 0) {
|
||||||
|
SPDLOG_INFO("MSG db handle is null");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
std::vector<std::vector<std::string>> result;
|
||||||
|
int ret = Select(handle, (const char *)sql, result);
|
||||||
|
if (result.size() == 0) continue;
|
||||||
|
return result[1][0];
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
@ -24,6 +24,8 @@ class DB : public base::Singleton<DB> {
|
|||||||
|
|
||||||
std::string GetPublicMsgCompressContentByMsgId(ULONG64 msgid);
|
std::string GetPublicMsgCompressContentByMsgId(ULONG64 msgid);
|
||||||
|
|
||||||
|
std::string GetChatMsgStrContentByMsgId(ULONG64 msgid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int ExecSelect(UINT64 db, const char *sql,
|
int ExecSelect(UINT64 db, const char *sql,
|
||||||
std::vector<std::vector<common::SqlResult>> &data);
|
std::vector<std::vector<common::SqlResult>> &data);
|
||||||
|
@ -41,6 +41,9 @@ void GlobalManager::initialize(HMODULE module) {
|
|||||||
http_server->AddHttpApiUrl("/api/sendAtText", SendAtText);
|
http_server->AddHttpApiUrl("/api/sendAtText", SendAtText);
|
||||||
http_server->AddHttpApiUrl("/api/sendMultiAtText", SendMultiAtText);
|
http_server->AddHttpApiUrl("/api/sendMultiAtText", SendMultiAtText);
|
||||||
http_server->AddHttpApiUrl("/api/getLoginUrl", GetLoginUrl);
|
http_server->AddHttpApiUrl("/api/getLoginUrl", GetLoginUrl);
|
||||||
|
http_server->AddHttpApiUrl("/api/translateVoice", TranslateVoice);
|
||||||
|
http_server->AddHttpApiUrl("/api/getTranslateVoiceText", GetTranslateVoiceText);
|
||||||
|
|
||||||
|
|
||||||
http_server->Start();
|
http_server->Start();
|
||||||
base::ThreadPool::GetInstance().Create(2, 8);
|
base::ThreadPool::GetInstance().Create(2, 8);
|
||||||
|
@ -301,4 +301,24 @@ std::string GetLoginUrl(struct mg_http_message* hm) {
|
|||||||
return ret_data.dump();
|
return ret_data.dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string TranslateVoice(struct mg_http_message* hm) {
|
||||||
|
nlohmann::json j_param = nlohmann::json::parse(
|
||||||
|
hm->body.ptr, hm->body.ptr + hm->body.len, nullptr, false);
|
||||||
|
INT64 msg_id = GetInt64Param(j_param, "msgId");
|
||||||
|
INT64 success = wxhelper::WechatService::GetInstance().TranslateVoice(msg_id);
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
|
return ret_data.dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetTranslateVoiceText(struct mg_http_message* hm) {
|
||||||
|
nlohmann::json j_param = nlohmann::json::parse(
|
||||||
|
hm->body.ptr, hm->body.ptr + hm->body.len, nullptr, false);
|
||||||
|
INT64 msg_id = GetInt64Param(j_param, "msgId");
|
||||||
|
std::string content =
|
||||||
|
wxhelper::WechatService::GetInstance().GetTranslateVoiceText(msg_id);
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", 1}, {"msg", "success"}, {"data", {{"transtext", content}}}};
|
||||||
|
return ret_data.dump();
|
||||||
|
}
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
@ -21,6 +21,8 @@ std::string SendFileMsg(struct mg_http_message* hm);
|
|||||||
std::string SendAtText(struct mg_http_message* hm);
|
std::string SendAtText(struct mg_http_message* hm);
|
||||||
std::string SendMultiAtText(struct mg_http_message* hm);
|
std::string SendMultiAtText(struct mg_http_message* hm);
|
||||||
std::string GetLoginUrl(struct mg_http_message* hm);
|
std::string GetLoginUrl(struct mg_http_message* hm);
|
||||||
|
std::string TranslateVoice(struct mg_http_message* hm);
|
||||||
|
std::string GetTranslateVoiceText(struct mg_http_message* hm);
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -292,6 +292,10 @@ typedef UINT64 (*__RequestLockWechat)(UINT64);
|
|||||||
typedef UINT64 (*__RequestUnLockWechat)(UINT64);
|
typedef UINT64 (*__RequestUnLockWechat)(UINT64);
|
||||||
typedef UINT64 (*__OnLoginBtnClick)(UINT64);
|
typedef UINT64 (*__OnLoginBtnClick)(UINT64);
|
||||||
typedef UINT64 (*__GetQRCodeLoginMgr)();
|
typedef UINT64 (*__GetQRCodeLoginMgr)();
|
||||||
|
typedef UINT64 (*__UpdateMsg)(UINT64,UINT64,UINT64);
|
||||||
|
typedef UINT64 (*__GetVoiceMgr)();
|
||||||
|
typedef UINT64 (*__ChatMsg2NetSceneSendMsg)(UINT64,UINT64);
|
||||||
|
typedef UINT64 (*__TranslateVoice)(UINT64,UINT64,UINT64);
|
||||||
|
|
||||||
} // namespace function
|
} // namespace function
|
||||||
namespace prototype {
|
namespace prototype {
|
||||||
@ -420,9 +424,9 @@ const UINT64 kSNSGetFirstPage = 0x1a51dd0;
|
|||||||
const UINT64 kSNSGetNextPageScene = 0x1a77240;
|
const UINT64 kSNSGetNextPageScene = 0x1a77240;
|
||||||
const UINT64 kSNSDataMgr = 0xeebda0;
|
const UINT64 kSNSDataMgr = 0xeebda0;
|
||||||
const UINT64 kSNSTimeLineMgr = 0x19e83a0;
|
const UINT64 kSNSTimeLineMgr = 0x19e83a0;
|
||||||
const UINT64 kGetMgrByPrefixLocalId = 0xe4add0;
|
const UINT64 kGetMgrByPrefixLocalId = 0xf0ea60;
|
||||||
const UINT64 kAddFavFromMsg = 0x1601520;
|
const UINT64 kAddFavFromMsg = 0x1601520;
|
||||||
const UINT64 kGetChatMgr = 0x8f0400;
|
const UINT64 kGetChatMgr = 0x97e4d0;
|
||||||
const UINT64 kGetFavoriteMgr = 0x8c69b0;
|
const UINT64 kGetFavoriteMgr = 0x8c69b0;
|
||||||
const UINT64 kAddFavFromImage = 0x160b920;
|
const UINT64 kAddFavFromImage = 0x160b920;
|
||||||
const UINT64 kGetContact = 0xf67060;
|
const UINT64 kGetContact = 0xf67060;
|
||||||
@ -458,6 +462,11 @@ const UINT64 kOnLoginBtnClick = 0xe0cf70;
|
|||||||
|
|
||||||
const UINT64 kGetQRCodeLoginMgr = 0xdff6d0;
|
const UINT64 kGetQRCodeLoginMgr = 0xdff6d0;
|
||||||
|
|
||||||
|
const UINT64 kUpdateMsg = 0xf15c40;
|
||||||
|
const UINT64 kGetVoiceMgr = 0xbf78f0;
|
||||||
|
const UINT64 kChatMsg2NetSceneSendMsg = 0x96e8d0;
|
||||||
|
const UINT64 kTranslateVoice = 0x11217e0;
|
||||||
|
|
||||||
} // namespace offset
|
} // namespace offset
|
||||||
} // namespace V3_9_8_15
|
} // namespace V3_9_8_15
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
#include "tinyxml2.h"
|
||||||
|
#include "spdlog/spdlog.h"
|
||||||
namespace offset = wxhelper::V3_9_8_25::offset;
|
namespace offset = wxhelper::V3_9_8_25::offset;
|
||||||
namespace prototype = wxhelper::V3_9_8_25::prototype;
|
namespace prototype = wxhelper::V3_9_8_25::prototype;
|
||||||
namespace func = wxhelper::V3_9_8_25::function;
|
namespace func = wxhelper::V3_9_8_25::function;
|
||||||
@ -671,5 +673,79 @@ void WechatService::SetBaseAddr(UINT64 addr) { base_addr_ = addr; }
|
|||||||
|
|
||||||
void WechatService::SetJsApiAddr(UINT64 addr) { js_api_addr_ = addr; }
|
void WechatService::SetJsApiAddr(UINT64 addr) { js_api_addr_ = addr; }
|
||||||
|
|
||||||
|
INT64 WechatService::TranslateVoice(UINT64 msg_id){
|
||||||
|
INT64 success = -1;
|
||||||
|
UINT64 get_by_local_id_addr = base_addr_ + offset::kGetMgrByPrefixLocalId;
|
||||||
|
func::__GetMgrByPrefixLocalId get_by_local_id =
|
||||||
|
(func::__GetMgrByPrefixLocalId)get_by_local_id_addr;
|
||||||
|
|
||||||
|
UINT64 get_chat_mgr_addr = base_addr_ + offset::kGetChatMgr;
|
||||||
|
func::__GetChatMgr get_chat_mgr = (func::__GetChatMgr)get_chat_mgr_addr;
|
||||||
|
|
||||||
|
UINT64 free_chat_msg_addr = base_addr_ + offset::kFreeChatMsg;
|
||||||
|
func::__FreeChatMsg free_chat_msg = (func::__FreeChatMsg)free_chat_msg_addr;
|
||||||
|
|
||||||
|
UINT64 new_chat_msg_addr = base_addr_ + offset::kChatMsgInstanceCounter;
|
||||||
|
func::__NewChatMsg new_chat_msg = (func::__NewChatMsg)new_chat_msg_addr;
|
||||||
|
|
||||||
|
UINT64 update_addr = base_addr_ + offset::kUpdateMsg;
|
||||||
|
func::__UpdateMsg update = (func::__UpdateMsg)update_addr;
|
||||||
|
|
||||||
|
UINT64 get_voice_mgr_addr = base_addr_ + offset::kGetVoiceMgr;
|
||||||
|
func::__GetVoiceMgr get_voice_mgr = (func::__GetVoiceMgr)get_voice_mgr_addr;
|
||||||
|
|
||||||
|
UINT64 to_msg_addr = base_addr_ + offset::kChatMsg2NetSceneSendMsg;
|
||||||
|
func::__ChatMsg2NetSceneSendMsg to_msg =
|
||||||
|
(func::__ChatMsg2NetSceneSendMsg)to_msg_addr;
|
||||||
|
|
||||||
|
UINT64 trans_addr = base_addr_ + offset::kTranslateVoice;
|
||||||
|
func::__TranslateVoice translate_voice = (func::__TranslateVoice)trans_addr;
|
||||||
|
|
||||||
|
char temp_msg[0x460] = {0};
|
||||||
|
|
||||||
|
char *chat_msg = base::utils::WxHeapAlloc<char>(0x460);
|
||||||
|
INT64 index = 0;
|
||||||
|
INT64 local_id = DB::GetInstance().GetLocalIdByMsgId(msg_id, index);
|
||||||
|
if (local_id <= 0 || index >> 32 == 0) {
|
||||||
|
success = -2;
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
LARGE_INTEGER l;
|
||||||
|
l.HighPart = index >> 32;
|
||||||
|
l.LowPart = (DWORD)local_id;
|
||||||
|
UINT64 p_chat_msg = new_chat_msg(reinterpret_cast<UINT64>(chat_msg));
|
||||||
|
get_chat_mgr();
|
||||||
|
get_by_local_id(l.QuadPart, p_chat_msg);
|
||||||
|
UINT64 mgr = get_chat_mgr();
|
||||||
|
update(mgr, p_chat_msg, 0);
|
||||||
|
|
||||||
|
UINT64 voice_mgr = get_voice_mgr();
|
||||||
|
UINT64 msg = to_msg(reinterpret_cast<UINT64>(&temp_msg), p_chat_msg);
|
||||||
|
|
||||||
|
success = translate_voice(voice_mgr, msg, 0);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string WechatService::GetTranslateVoiceText(UINT64 msg_id) {
|
||||||
|
std::string content = DB::GetInstance().GetChatMsgStrContentByMsgId(msg_id);
|
||||||
|
if (content.empty()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
tinyxml2::XMLDocument doc;
|
||||||
|
if (doc.Parse(content.c_str(), content.size()) != 0) {
|
||||||
|
SPDLOG_INFO("tinyxml2 parse error");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
tinyxml2::XMLElement *msg = doc.FirstChildElement("msg");
|
||||||
|
if (msg != nullptr) {
|
||||||
|
tinyxml2::XMLElement *voicetrans = msg->FirstChildElement("voicetrans");
|
||||||
|
if (voicetrans != nullptr) {
|
||||||
|
const char *value = voicetrans->Attribute("transtext",nullptr);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
@ -79,6 +79,8 @@ class WechatService : public base::Singleton<WechatService> {
|
|||||||
std::string GetLoginUrl();
|
std::string GetLoginUrl();
|
||||||
void SetBaseAddr(UINT64 addr);
|
void SetBaseAddr(UINT64 addr);
|
||||||
void SetJsApiAddr(UINT64 addr);
|
void SetJsApiAddr(UINT64 addr);
|
||||||
|
INT64 TranslateVoice(UINT64 msg_id);
|
||||||
|
std::string GetTranslateVoiceText(UINT64 msg_id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UINT64 base_addr_;
|
UINT64 base_addr_;
|
||||||
|
@ -862,4 +862,90 @@ enableHttp=0时,使用ip,port的tcp服务回传消息。
|
|||||||
},
|
},
|
||||||
"msg": "success"
|
"msg": "success"
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 17.语音转文本**
|
||||||
|
###### 接口功能
|
||||||
|
> 语音消息转换文本
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/translateVoice](/api/translateVoice)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|msgId|string|消息id|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,大于0成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|返回内容|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"msgId":"23206240123137465"
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": null,
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 18.获取语音转文本结果**
|
||||||
|
###### 接口功能
|
||||||
|
> 获取语音转文本结果 (可以使用数据库查询功能查询,该接口只是为了方便减少hook)
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/getTranslateVoiceText](/api/getTranslateVoiceText)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|msgId|string|消息id|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,大于0成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|返回内容|
|
||||||
|
|  transtext|string|转换文本|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"msgId":"23206212223137465"
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": {
|
||||||
|
"transtext": "冲冲,冲冲。"
|
||||||
|
},
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
```
|
```
|
Loading…
Reference in New Issue
Block a user