微信群控系统是市场上比较流行的微信加人营销工具,很多人在很好的利用这一工具后掘到了一桶桶金。其应用的行业也是十分广泛,只要是需要网络营销推广,需要获取大量粉丝的行业,需求任意定位加人的,批量自动加人的等等,都能用到该工具。本人带领技术团队也开发了一套完整的群控系统,下面就微信群控系统的实现原理,以及部分核心代码供大家参考。
不同于市场上的其他群控系统,我们研发的群控系统是可以运行在任何电脑上的,不用再购买另外一台服务器,对群控系统的操作便捷性以及实用性都做了极大的优化。该系统的实现主要分为几个部分,一是pc端操作软件,二是adb底层传输,三是手机端模拟点击,四是,手机端底层劫持。如果是想控制授权,还在再加一个部分就是web服务器端授权系统。
pc端操作软件,主要是把所有手机的界面投射到电脑上,实现手机和电脑的同步操作,以及一些自动化操功能。其中比较核心的问题是手机界面实时投射到电脑上,网上有很多介绍使用asm等方法实现,也有介绍各种截图传输方式的。但这里我想告诉大家大部分方式都不能实现实时传输,都会延迟几秒钟。如果是正常的截图传输的方式很多时候都是感觉很卡顿。
解决这个问题就是要用到adb了,adb相当于电脑和手机的传输通道,群控系统的实现主要环节就在于adb的各种命令的应用。但正常的adb是无法完成所有的功能的,在本项目的开发过程中,我们在Linux平台上下载Google的Android源码,修改了adb的文件后,重新编译生成我们自己想要的adb。
手机界面的实时传输在我们项目中用的是socket传输的,在进行了各种优化之后,传输不会有任何延迟,无任何卡顿现象。
手机端主要是模拟点击和底层劫持,模拟点击实现这里我们使用的是uiautomator,当然,这里模拟点击实现的方式各不先同,大家可以选择一种自己熟悉的方式来实现。底层劫持的话主要用到xposed,在全国定位,自动摇一摇等功能时都要用到底层劫持,还有就是为了减少执行的步骤,打开微信的时候直接跳到微信的某个页面,都会用到底层劫持。
以下是手机端的核心实现代码,主要是手机端视频流的获取,实时向pc端传输。实时投屏的具体实现。利用socket实时传输,每秒传送的帧数可以自由控制,在实际的实现过程中,我们大概用到的是每秒30帧左右就十分流畅。核心代码为:
new Thread(new Runnable() {
public void run() {
try {
if(popUp)
screenshot = Utilities.bitmapMatrix(screenshot);
else
screenshot = Utilities.bitmapMatrix1(screenshot);
baos = new ByteArrayOutputStream();
screenshot.compress(Bitmap.CompressFormat.JPEG, 30, baos);
data = baos.toByteArray();
dos.writeInt(data.length);
dos.write(data);
if (baos != null) {
baos.flush();
}
} catch (Exception e) {
} finally {
if (baos != null) {
try {
baos.close();
baos = null;
} catch (IOException ioe) {
}
}
screenshot.recycle();
screenshot = null;
data = null;
}
try {
if (baos != null) {
baos.close();
baos = null;
}
if (screenshot != null) {
screenshot.recycle();
screenshot = null;
data = null;
}
} catch (Exception e) {
e.printStackTrace();
}
System.gc();
}}).run();
pc端接收实时传输,获取每一帧图片的处理代码为:互相学习请加V:393231639。
public static Bitmap ReceiveVarData(Socket s)
{
string ss = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
try
{
int total = 0;
int recv = 0;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, 0);
if (recv == 0)
{
//已经断开连接,需要重新连接
return null;
}
byte[] datasize3 = new byte[4];
for (int i = 0; i < 4; i++)
{
datasize3[i] = datasize[3 - i];
}
int size = BitConverter.ToInt32(datasize3, 0);
int dataleft = size;
byte[] data = new byte[size];
MemoryStream fs = new MemoryStream();
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0)
{
//已经断开连接,需要重新连接
data = null;
return null;
// break;
}
// fs.Write(data, 0, recv);
total += recv;
dataleft -= recv;
}
fs.Write(data, 0, size);
Bitmap ImgBitmap = new Bitmap(fs);
fs.Close();
// fs.Flush();
// return data;
string ss1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
return ImgBitmap;
}
catch (Exception e)
{
return null;
}
}
获取到每帧传输后实时显示在电脑端。以下为效果图。