1. 程式人生 > >怎麼把mp3轉發微信語音發出去,從技術角度分析可行性

怎麼把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();

}

原理都類似,這裡就不多廢話 ,大家可以去試 ,效果相當不錯