有什么需要帮助的,看不明白的 ,可以加微信 258032791
做微信营销的朋友,很多喜欢做群营销,个人营销,
这个时候,如果人工一句句话去说,肯定能累个半死,如果每天应付几百人
能把你累虚脱,那么从技术角度上来讲,能不能实现把事先准备的文字,语音,视频转发到微信里面 ,
代替人工操作的 ??
答案当然是可以的,从技术角度上来讲,一点问题都没有,接下来我和大家分析下怎么做!
我通过技术手段实现了一个简单的例子,有兴趣的 ,可以学习下 ,
首先我们先看下效果
http://8h7s.cn/index.php/2018/09/26/wx_tool/
接下来给大家上几个图
这是我写的一个小例子,实现准备需要转发的文字,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();
}
原理都类似,这里就不多废话 ,大家可以去试 ,效果相当不错