微信云控系统的实现原理,微信云控系统源码之服务器推送的实现及其核心代码

与世无争的帅哥 提交于 2019-12-03 13:13:11

        微信云控系统,其概念是相对于微信群控系统的。微信群控系统是通过usb线传输数据控制手机进行模拟操作的,而微信云控系统则是通过网络传输数据操作手机端。也就是从服务器下发命令到手机上,手机端执行各种模拟操作。

       微信云控系统主要用到的技术有服务器推送技术,客户端接收数据,并执行模拟点击操作。服务器推送在这里我们主要用到的是推送透传,大家可以采取自建推送平台,这个就比较麻烦,要根据协议来写。还有就是使用现在已经非常成熟的第三方服务,有个推,极光,百度等等。大家可以去了解下。客户端接收到服务器端传送的命令后,触发相应的操作。客户端的模拟点击实现,在这里我们使用的是uiautomator,可模拟各种点击,输入等操作。

     如果还需要虚拟定位,一键换机等操作,则需要用到Android的劫持工具xposed。这是个功能很强大的第三方工具,可以劫持任何你想改变的数据。

     云控系统实现的关键是服务器端的推送,在我们的云控系统中主要是借助第三方推送服务,这里使用的是个推。大家也可以有不同的选择,这个是因人而异的。

      服务器端核心推送源码为:

       //
//服务端推送接口,支持三个接口推送
//1.PushMessageToSingle接口:支持对单个用户进行推送
//2.PushMessageToList接口:支持对多个用户进行推送,建议为50个用户
//3.pushMessageToApp接口:对单个应用下的所有用户进行推送,可根据省份,标签,机型过滤推送
//


//单推接口案例
public function pushMessageToSingle(){
//var_dump('./'.__ROOT__ . 'touchuan/' . 'IGt.Push.php');exit();
//require_once('./'.__ROOT__ . 'touchuan/' . 'IGt.Push.php');
    //$igt = new \IGeTui(HOST,APPKEY,MASTERSECRET);
    $igt = new \IGeTui(NULL,APPKEY,MASTERSECRET,false);


    //消息模版:
    // 1.TransmissionTemplate:透传功能模板
    // 2.LinkTemplate:通知打开链接功能模板
    // 3.NotificationTemplate:通知透传功能模板
    // 4.NotyPopLoadTemplate:通知弹框下载功能模板


//     $template = IGtNotyPopLoadTemplateDemo();
//     $template = IGtLinkTemplateDemo();
//     $template = IGtNotificationTemplateDemo();
    $template = $this->IGtTransmissionTemplateDemo();


    //个推信息体
    $message = new \IGtSingleMessage();


    $message->set_isOffline(true);//是否离线
    $message->set_offlineExpireTime(3600*12*1000);//离线时间
    $message->set_data($template);//设置推送消息类型
// $message->set_PushNetWorkType(0);//设置是否根据WIFI推送消息,1为wifi推送,0为不限制推送
    //接收方
    $target = new \IGtTarget();
    $target->set_appId(APPID);
    $target->set_clientId(CID);
//    $target->set_alias(Alias);


       
    try {

        $rep = $igt->pushMessageToSingle($message, $target);
        var_dump($rep);
        echo ("<br><br>");


    }catch(RequestException $e){
        $requstId =e.getRequestId();
        $rep = $igt->pushMessageToSingle($message, $target,$requstId);
        var_dump($rep);
        echo ("<br><br>");
    }


}

//多推接口案例
public function pushMessageToList($idsArr,$cmd)
{
    putenv("gexin_pushList_needDetails=true");
    putenv("gexin_pushList_needAsync=true");


    $igt = new \IGeTui(HOST, APPKEY, MASTERSECRET);
    //消息模版:
    // 1.TransmissionTemplate:透传功能模板
    // 2.LinkTemplate:通知打开链接功能模板
    // 3.NotificationTemplate:通知透传功能模板
    // 4.NotyPopLoadTemplate:通知弹框下载功能模板
    
    // var_dump("ssssssssssss");
    //$template = IGtNotyPopLoadTemplateDemo();
    //$template = IGtLinkTemplateDemo();
    //$template = IGtNotificationTemplateDemo();
    $template = $this->IGtTransmissionTemplateDemo($cmd);
    //个推信息体
    $message = new \IGtListMessage();
    $message->set_isOffline(true);//是否离线
    $message->set_offlineExpireTime(3600 * 12 * 1000);//离线时间
    $message->set_data($template);//设置推送消息类型
//    $message->set_PushNetWorkType(1); //设置是否根据WIFI推送消息,1为wifi推送,0为不限制推送
//    $contentId = $igt->getContentId($message);
    $contentId = $igt->getContentId($message,"toList任务别名功能");//根据TaskId设置组名,支持下划线,中文,英文,数字


     foreach ($idsArr as $k=>$v) {
   $target = new \IGtTarget();
        $target->set_appId(APPID);
        $target->set_clientId($v);
//    $target1->set_alias(Alias);
         $targetList[$k] = $target;
        }
    //接收方1
    $rep = $igt->pushMessageToList($contentId, $targetList);
    return $rep;
   // var_dump($rep);


   // echo ("<br><br>");


}

     Android端接收数据执行命令核心代码为:

@Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
    String appid = msg.getAppid();
    String taskid = msg.getTaskId();
    String messageid = msg.getMessageId();
    byte[] payload = msg.getPayload();
    String pkg = msg.getPkgName();
    String cid = msg.getClientId();

    // 第三方回执调用接口,actionid范围为90000-90999,可根据业务场景执行
    boolean result = PushManager.getInstance().sendFeedbackMessage(context, taskid, messageid, 90001);
    Log.d(TAG, "call sendFeedbackMessage = " + (result ? "success" : "failed"));

    Log.d(TAG, "onReceiveMessageData -> " + "appid = " + appid + "\ntaskid = " + taskid + "\nmessageid = " + messageid + "\npkg = " + pkg
            + "\ncid = " + cid);
    if (payload == null) {
        Log.e(TAG, "receiver payload = null");
    } else {
         data = new String(payload);
        Log.d(TAG, "receiver payload = " + data);
      在Android端接收到数据后,进行相应的命令操作,结合上篇文章中的uiautomator
      进行模拟点击,模拟输入等等的实现。需要源码及有疑问,交流学习V:393231639。
     

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!