怎麼把mp3轉發微信語音發出去,從技術角度分析可行性
有什麼需要幫助的,看不明白的 ,可以加微信 258032791
做微信營銷的朋友,很多喜歡做群營銷,個人營銷,
這個時候,如果人工一句句話去說,肯定能累個半死,如果每天應付幾百人
能把你累虛脫,那麼從技術角度上來講,能不能實現把事先準備的文字,語音,視訊轉發到微信裡面 ,
代替人工操作的 ??
答案當然是可以的,從技術角度上來講,一點問題都沒有,接下來我和大家分析下怎麼做!
我通過技術手段實現了一個簡單的例子,有興趣的 ,可以學習下 ,
首先我們先看下效果
接下來給大家上幾個圖
這是我寫的一個小例子,實現準備需要轉發的文字,mp3音訊,mp4視訊
文章轉發功能
視訊轉發功能
要實現微信多開和音視訊傳送的方法很多,
這個案例所用到的技術點 ,在這裡列舉下
1:雷電模擬器,可以多開,可以一臺機器開 無數個,根據機器效能不一樣,數量有所不同
2:需要用到按鍵精靈指令碼,這個主要是接收主控程式指令
3:主控程式需要用到 api 攔截技術 ,C++通常使用detour api攔截庫
接下來大家大概講講原理 ,因為篇幅有限,在我的微信 有對應的教材
模擬器主要是實現多開,這個沒有啥好說 ,雷電模擬器還可以實現虛擬定位,硬體模擬 等介面也是開放的 ,所以非常簡單
按鍵精靈對應的程式碼也超級簡單 ,在這裡我貼出 程式碼供大家參考
這裡面的難點在於 如何 轉發語音和 直播視訊,
轉發語音,首先我們先要知道模擬器,它肯定是需要錄製 麥克風資料的,這個時候我們可以給
麥克風下一個hook 鉤子 ,WAVEIN WAVEOUT ,這些關鍵的api 上鉤子
typedef
MMRESULT (WINAPI *PFN_waveInOpen) ( LPHWAVEIN phwi,
UINT
uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD
dwCallback,
DWORD
dwCallbackInstance,
DWORD
fdwOpen );
typedef
MMRESULT (WINAPI *PFN_waveInClose) ( HWAVEIN hwi );
typedef
MMRESULT (WINAPI *PFN_waveOutOpen) ( LPHWAVEOUT phwo,
UINT
uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD
dwCallback,
DWORD
dwCallbackInstance,
DWORD
fdwOpen );
typedef
MMRESULT (WINAPI *PFN_waveOutClose) ( HWAVEOUT hwo );
typedef
MMRESULT (WINAPI *PFN_waveInPrepareHeader) ( HWAVEIN hwi, LPWAVEHDR pwh,
UINT
cbwh );
typedef
MMRESULT (WINAPI *PFN_waveOutWrite) ( HWAVEOUT hwo, LPWAVEHDR pwh,
UINT
cbwh );
//
// 修改Win32 API函式地址
//
CAPIHook g_waveInOpen(
"winmm.dll"
,
"waveInOpen"
, (PROC) Hook_waveInOpen, TRUE);
CAPIHook g_waveInClose(
"winmm.dll"
,
"waveInClose"
, (PROC) Hook_waveInClose, TRUE);
CAPIHook g_waveOutOpen(
"winmm.dll"
,
"waveOutOpen"
, (PROC) Hook_waveOutOpen, TRUE);
CAPIHook g_waveOutClose(
"winmm.dll"
,
"waveOutClose"
, (PROC) Hook_waveOutClose, TRUE);
CAPIHook g_waveInPrepareHeader(
"winmm.dll"
,
"waveInPrepareHeader"
, (PROC) Hook_waveInPrepareHeader, TRUE);
CAPIHook g_waveOutWrite(
"winmm.dll"
,
"waveOutWrite"
, (PROC) Hook_waveOutWrite, TRUE);
至此,通話過程中音訊輸入和輸出的資料(即對方講話和我自己講話的聲音)已經全部“偷取”到了,接下來只要將事先準備好的mp3 輸送出去即可,當然有些工具偷取 錄音的 原理也是一個鳥樣,效果一般,但用做電話錄音足亦。
有什麼不明白的,可以加我微信 258032791 ,有詳細教程和原始碼
視訊資料切換 原理也是類似,當然有些人說用 虛擬攝像頭VCam 也可以達到同樣的效果 ,
其實用虛擬攝像頭,很多虛擬機器不支援,國外的 Genymotion 貌似支援,但是也不好用
這個我也測試過,大家可以去試試
HHOOK
g_hHook = NULL;
HINSTANCE
g_hInst= NULL;
//HWND g_hInst =NULL;
/*
//目標函式指標
camerahook g_hcamera=NULL;//<-capCreateCaptureWindowA函式指標
//Trampoline函式指標
camerahook r_hcamera=NULL;//<-capCreateCaptureWindowA Trampoline函式指標
*/
HWND
(WINAPI * camerahook)(
LPCSTR
lpszWindowName,
_In_
DWORD
dwStyle,
_In_
int
x, _In_
int
y, _In_
int
nWidth, _In_
int
nHeight,
_In_opt_
HWND
hwndParent, _In_
int
nID) =capCreateCaptureWindowA;
void
InstallHook();
//<-Detours鉤子初始化函式
void
UninstallHook();
//<-Detours鉤子解除安裝函式
//HWND WINAPI capCreateCaptureWindowA_mine();//<-capCreateCaptureWindowA的替換函式
//加入目標函式的Detour函式
HWND
WINAPI capCreateCaptureWindowA_mine(
LPCSTR
lpszWindowName,
_In_
DWORD
dwStyle,
_In_
int
x, _In_
int
y, _In_
int
nWidth, _In_
int
nHeight,
_In_opt_
HWND
hwndParent, _In_
int
nID)
{
int
mbox=NULL;
mbox=MessageBoxA(hwndParent,
"有程式正在啟用攝像頭,是否需要攔截?"
,
"提示"
,MB_YESNO);
if
(IDOK==mbox)
{
return
0;
}
else
{
return
camerahook(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hwndParent,nID);
}
}
BOOL
APIENTRY DllMain(
HINSTANCE
hinstDLL,
DWORD
fdwReason,
LPVOID
lpvReserved )
{
g_hInst = hinstDLL;
switch
(fdwReason)
{
case
DLL_PROCESS_ATTACH:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(
PVOID
&)camerahook,(
PVOID
)capCreateCaptureWindowA_mine);
//攔截攝像頭函式
break
;
case
DLL_PROCESS_DETACH:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((
PVOID
*)capCreateCaptureWindowA,(
PVOID
)capCreateCaptureWindowA_mine);
//解除攔截攝像頭函式
break
;
}
return
TRUE;
}
void
InstallHook()
{
//DisableThreadLibraryCalls(g_hInst);
// DetourTransactionBegin();
// DetourUpdateThread(GetCurrentThread());
//DetourAttach(&(PVOID&)camerahook,(PVOID)capCreateCaptureWindowA_mine);//攔截攝像頭函式
//DetourAttach();// 攔截鍵盤記錄函式
//DetourAttach();//攔截圖幕函式
//DetourAttach();//攔截麥克風函式
//DetourTransactionCommit();
}
void
UninstallHook()
{
//DetourTransactionBegin();
//DetourUpdateThread(GetCurrentThread());
//DetourDetach((PVOID*)capCreateCaptureWindowA,(PVOID)capCreateCaptureWindowA_mine);//解除攔截攝像頭函式
////DetourDetach();//解除攔截鍵盤記錄函式
////DetourDetach();//解除攝像頭函式
////DetourDetach();//解除麥克風函式
//DetourTransactionCommit();
}
原理都類似,這裡就不多廢話 ,大家可以去試 ,效果相當不錯