_撸猫websocket服务器端,手机远程服务端

自写自用的小东西.

远程控制手机的.用aardio写的,原理也简单的很.

客户端是用autojs写.

这个是服务器端的.

main代码

javascript 复制代码
//异步服务端
import win.ui;
import web.socket.server;
import win;
import inet.http;
/*DSG{{*/
mainForm = win.form(cls="EMAO_FORM";text="__撸猫websocket服务器端";left=10;top=4;right=1298;bottom=836;topmost=1)
mainForm.add(
Btn_SendCommand={cls="plus";text="发送给所有机(&C)";left=1120;top=752;right=1259;bottom=784;db=1;dr=1;font=LOGFONT(h=-14;name='微软雅黑';weight=700);notify=1;z=14};
Btn_SendCommandToSel={cls="plus";text="发送给已选机(&C)";left=976;top=752;right=1112;bottom=784;db=1;dr=1;font=LOGFONT(h=-14;name='微软雅黑';weight=700);notify=1;z=17};
Btn_SendTask={cls="plus";text="重新载入(&R)";left=1056;top=468;right=1184;bottom=500;db=1;dr=1;font=LOGFONT(h=-14;name='微软雅黑';weight=700);notify=1;z=13};
CB_CmdList={cls="combobox";left=824;top=755;right=957;bottom=779;db=1;dr=1;edge=1;font=LOGFONT(h=-14;name='微软雅黑');items={"集成指令列表"};mode="dropdownlist";z=16};
CB_EnabledJoin={cls="checkbox";text="允许新机加入";left=1148;top=13;right=1276;bottom=45;bgcolor=12639424;checked=1;dr=1;dt=1;font=LOGFONT(h=-16;name='微软雅黑');z=8};
CB_TaskList={cls="combobox";left=824;top=471;right=1048;bottom=497;db=1;dr=1;edge=1;font=LOGFONT(h=-14;name='微软雅黑');items={};mode="dropdownlist";z=6};
OnlineCount={cls="edit";text="0";left=811;top=437;right=864;bottom=461;align="center";db=1;dr=1;edge=1;font=LOGFONT(h=-14;name='微软雅黑');multiline=1;z=4};
TB_Command={cls="edit";text='alert("演示");';left=824;top=504;right=1261;bottom=744;db=1;dr=1;edge=1;font=LOGFONT(h=-16);multiline=1;vscroll=1;z=15};
groupbox={cls="groupbox";text="【在线】";left=736;top=440;right=1280;bottom=800;db=1;dr=1;edge=1;z=3};
plus={cls="plus";left=0;top=0;right=1288;bottom=56;bgcolor=12639424;dl=1;dr=1;dt=1;z=1};
plus1={cls="plus";left=952;top=16;right=1016;bottom=40;background="\res\ServiceOn.png";disabled=1;dr=1;dt=1;notify=1;repeat="scale";transparent=1;z=9};
plus2={cls="plus";left=1072;top=16;right=1136;bottom=40;background="\res\ServiceOn.png";disabled=1;dr=1;dt=1;notify=1;repeat="scale";transparent=1;z=10};
static2={cls="static";text="任务列表:";left=752;top=474;right=832;bottom=506;db=1;dr=1;font=LOGFONT(h=-14;name='微软雅黑');transparent=1;z=5};
static3={cls="static";text="单独指令:";left=752;top=504;right=832;bottom=536;db=1;dr=1;font=LOGFONT(h=-14;name='微软雅黑');transparent=1;z=7};
static4={cls="static";text="WebSocket";left=864;top=16;right=960;bottom=40;bgcolor=12639424;dr=1;dt=1;font=LOGFONT(h=-16;name='微软雅黑');transparent=1;z=11};
static5={cls="static";text="HTTP";left=1032;top=16;right=1080;bottom=40;bgcolor=12639424;dr=1;dt=1;font=LOGFONT(h=-16;name='微软雅黑');transparent=1;z=12};
static6={cls="static";text="手机群控服务端v2.3";left=24;top=14;right=352;bottom=40;font=LOGFONT(h=-20;name='微软雅黑');transparent=1;z=19};
tab1={cls="tab";left=8;top=64;right=1280;bottom=424;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-16;name='微软雅黑');z=2};
tab2={cls="tab";left=8;top=432;right=728;bottom=800;db=1;dl=1;dr=1;edge=1;font=LOGFONT(h=-16;name='微软雅黑');z=18}
)
/*}}*/

/*myVariables*/
wsrv = web.socket.server();

/*myUI*/	mainForm.loadForm("/dlg/UI.aardio")
/*Func*/	mainForm.loadForm("/dlg/FUNC.aardio");
/*COMM*/	mainForm.loadForm("/dlg/COMMAND.aardio");

sktList = {  };



//一个客户端掉线了
wsrv.onClose = function(hSocket,event){
	//mainForm.other1.txtMessage.print("onClose",hSocket,event);
	var sid = getSid( hSocket );
	//根据sid取相关信息
	//取设备信息,以及对应手机号码,如13号手机
	androidID = "";
	for( k,v in sktList ){
		if( v && sid == v.string ){
			sktList[k] = null;
			androidID = k; //取得socket对应的安卓id号
			break;
		}
	}
	if( androidID!="" ){
		for(i=1; mainForm.list1.LV_Online.count;1){
			if( mainForm.list1.LV_Online.getItemText( i, 3 ) == androidID ){
				name = mainForm.list1.LV_Online.getItemText( i, 2 );
				mainForm.other1.txtMessage.print( "【id:" ++ i ++ " - " ++ name ++ "】已掉线" );
				mainForm.OnlineCount.text = wsrv.clientCount();
				//这里可以报警了---
				////////////////////////////////////////////////////////////////////////////
				setOffLineState( androidID );
				list2.disabledItem( name );
				return;
			}
		}
		
	}
	//mainForm.other1.txtMessage.print( "【id=" ++ sid ++ " 】已掉线" );
	mainForm.OnlineCount.text = wsrv.clientCount();
}

//一个客户端发消息过来了
wsrv.onMessage = function(hSocket,msg){
	//mainForm.other1.txtMessage.print(hSocket,msg.data);  //wsrv.send(hSocket,"收到xx消息:" + msg.data);
    mainForm.OnlineCount.text = wsrv.clientCount();
    //第----------------2----------------收到身份-登记造册
    if( string.indexOf(msg.data,"verify:") && mainForm.CB_EnabledJoin.checked ){
    	var client = wsrv.client(hSocket);
    	ip = client.getRemoteIp();
    	vStr = string.replace( msg.data, "@verify:","" );
    	vStr = string.split( vStr, '<||>' ); //厂商+主板+ID+电量
    	//检测列表中有没有,没有才新加,有就更新
    	nid = setOnLineState( vStr[3] );
    	if( nid == null ){
    	    nid = getNewId();
    	    mainForm.list1.LV_Online.addItem( { nid; ""; vStr[3]; vStr[1]++" " ++ vStr[2]; ip; "在线"; vStr[4]; tostring(time(,"%Y/%m/%d %H:%M:%S" )); "0天0时0分"; }, 0 );
    	}else {
    	    mainForm.list1.LV_Online.setItemText( vStr[3], nid, 3 );
    	    mainForm.list1.LV_Online.setItemText( vStr[1]++" " ++ vStr[2], nid, 4 );
    	    mainForm.list1.LV_Online.setItemText( ip, nid, 5 );
    	    mainForm.list1.LV_Online.setItemText( "【在线】", nid, 6 );
    	    mainForm.list1.LV_Online.setItemText( vStr[4], nid, 7 );
    	    mainForm.list1.LV_Online.setItemText( tostring(time(,"%Y/%m/%d %H:%M:%S" )), nid, 8 );
    	    mainForm.list1.LV_Online.setItemText( "0天0时0分", nid, 9 );
    	}
    	mainForm.other1.txtMessage.print( "【"++client.getRemoteIp()++"】ID=" ++ nid ++ " / 机型:" ++ vStr[1]++"-" ++ vStr[2] ++ " / 电量:" ++ vStr[4] ++ "% - 成功连接!" );
  		sktList[ vStr[3] ] = { //安卓id当键名
  								"instance" = hSocket;
  								"string" = getSid( hSocket );
  		};
  		//检测缓存中有没有对应的手机编号名称,有则直接读取
  		if( io.exist("/config/"++vStr[3]++".txt" ) ){
  			var phoneCode=string.load("/config/"++vStr[3]++".txt");
  			if( phoneCode!="" ){
  				mainForm.list1.LV_Online.setItemText( phoneCode, nid, 2 );
  				list2.enableItem( phoneCode );
  			}
  		}
    }
    //第----------------3----------------收到心跳
    if( string.indexOf(msg.data,"HeartBeat:") ){
        //mainForm.other1.txtMessage.print( msg.data );
        vStr = string.replace( msg.data, "@HeartBeat:","" );
    	vStr = string.split( vStr, '<||>' ); //手机编号+ID+电量
    	nid = setOnLineState( vStr[2] );
		debugForm.log( vStr[1] ++ " - " ++ vStr[2] );
		if( mainForm.list1.LV_Online.getItemText( nid,2 )=="" || mainForm.list1.LV_Online.getItemText( nid,2 )!=vStr[1] ){
			//如果还没更新机器编号,或换了编号,则更新文件
			string.save("/config/" ++ vStr[2] ++ ".txt", vStr[1]);
		}
		//mainForm.other1.txtMessage.print( msg.data );
    	mainForm.list1.LV_Online.setItemText( vStr[1], nid, 2 );
    	if( vStr[4]=="1" ) vStr[3] = "【"++vStr[3] ++"】";
    	mainForm.list1.LV_Online.setItemText( vStr[3], nid, 7 );
    	tm = time( mainForm.list1.LV_Online.getItemText( nid, 8 ) );
		tm2 = time();
		var v = tm2.diffsecond( tm ); 
		
		mainForm.list1.LV_Online.setItemText( getTimeBySecond( v ), nid, 9 );
		
    }
    //第----------------4----------------收到错误信息 //运行脚本出错
    if( string.indexOf(msg.data,"enginesError:") ){
        //mainForm.other1.txtMessage.print( msg.data );
        vStr = string.replace( msg.data, "@enginesError:","" );
    	nid = getRowBySocket( hSocket );
		if( nid ){
    		mainForm.list1.LV_Online.setItemText( vStr, nid, 10 );
		}
    }
    //第----------------5----------------收到脚本执行完的反馈,查看start 或 end
    if( string.indexOf(msg.data,"enginesResult:") ){
        //mainForm.other1.txtMessage.print( msg.data );
        vStr = string.replace( msg.data, "@enginesResult:","" );
    	nid = getRowBySocket( hSocket );
		if( nid ){
			if( vStr == "end" ){
				mainForm.list1.LV_Online.setItemText( "执行完成!", nid, 10 );
			} else {
				mainForm.list1.LV_Online.setItemText( "出错了!", nid, 10 );
			}
			mainForm.other1.txtMessage.print( vStr );
		}
    }
    //第----------------6----------------接收新的短信
    if( string.indexOf(msg.data,"NewSms:") ){
        vStr = string.replace( msg.data, "@NewSms:","" );
    	//nid = getRowBySocket( hSocket );
    	vStr = string.split( vStr, "<||>" );
		mainForm.sms.txtMessage.print( "【" ++ vStr[1] ++ " - " ++ vStr[2] ++ " - " ++ getTimeByNumber( vStr[3] ) ++ "】" );
		mainForm.sms.txtMessage.print( vStr[4] );
		mainForm.sms.txtMessage.print( string.repeat( 100,"-" ) );
		ckSms = checkSMS( vStr[4] );
		if( ckSms ){
			mainForm.sms.txtMonitor.print( "【" ++ vStr[1] ++ " - " ++ ckSms ++ " - " ++ vStr[2] ++ " - " ++ getTimeByNumber( vStr[3] ) ++ "】" );
			mainForm.sms.txtMonitor.print( vStr[4] );
			mainForm.sms.txtMonitor.print( string.repeat( 100,"-" ) );
			//发送到微信
			pushBase( ckSms ++ "-" ++ vStr[1], vStr[4] );
			
		}
    }
    //返回高速---不返回--由服务端主动推送
    //if( string.trim(msg.data) == "requestGAOSU" ){
    //	return wsrv.send( hSocket, "EXE||" ++ string.load("/js/GAOSU.txt") );
    //}
}



mainForm.Btn_SendTask.oncommand = function(id,event){ 
	mainForm.CB_TaskList.clear();
	cmd = string.load( "/config/_tasklist.txt" );
	if( cmd ){ 
		cmd = string.split( cmd, '<\r\n>' );
		for(i=1;#cmd;1){ 
			if( string.trim(cmd[i])=="" ) break;
			str = string.split( cmd[i], '<||>' );
			if( #str==2 ){
				mainForm.CB_TaskList.add( cmd[i] );
			}
		}
	}
	if( mainForm.CB_CmdList.count>0 ){ mainForm.CB_CmdList.selIndex = 1; } 
	mainForm.msgbox("重新载入完成!");
}

mainForm.Btn_SendCommand.oncommand = function(id,event){
	if( wsrv ){
		for(i=1;mainForm.list1.LV_Online.count;1){
			hp = mainForm.list1.LV_Online.getItemText(i,3);
			hp = sktList[ hp ];
			if( hp && hp.instance ){
				result = wsrv.send( hp.instance, "COMMAND||"++mainForm.TB_Command.text );
				if( !result ){
					mainForm.list1.LV_Online.setItemText( "命令发送成功!", i, 10 );
				}else {
					mainForm.list1.LV_Online.setItemText( "命令发送失败!", i, 10 );
				}
			}else {
				mainForm.list1.LV_Online.setItemText( "---", i, 6 );
				mainForm.list1.LV_Online.setItemText( "已退线", i, 10 );
			}
		}
		//wsrv.send( hSocket,"verify" )
		mainForm.msgbox("命令发送成功!");
	}
}


win.delay( 500 );
//启动服务端 
if( wsrv.start(,880) ){
	mainForm.other1.txtMessage.print( wsrv.getUrl() + "/aardio","已启动WebSocket服务器");
	mainForm.other1.txtMessage.print( wsrv.httpServer.getUrl(),"已启动HTTP服务器");
	mainForm.plus1.disabled = false;
	mainForm.plus2.disabled = false;
}
else {
	mainForm.other1.txtMessage.print("启动失败,建议修改端口号");
}

//同一个端口还可以同时运行HTTP服务端
wsrv.httpServer.run( 
    function(response,request){ 
         //mainForm.other1.txtMessage.print( request );
         if( #mainForm.other1.txtMessage.text > 10000 ){ mainForm.other1.txtMessage.text = ""; }
         if( !string.indexOf( request.url, "favicon.ico" ) ){
         	mainForm.other1.txtMessage.print("HTTP协议访问:",request.url , request.uri);
         }else{
         	return;
         }
         response.contentType = "text/html";
         //response.jsonPrettyPrint = true;
         var uri = request.uri;
         uri = string.split( uri, "/" );
         
         if( uri[2] == "config" || string.indexOf( request.uri, "debug" )  ){
            fl = string.replace( request.uri,"\?.+","" );
            if( io.exist( fl ) ){
         		response.write( string.load( fl ) );
         	}else {
         		response.write( string.load("/res/404.html") );
         	}
         }
    }
);

mainForm.Btn_SendCommandToSel.oncommand = function(id,event){
	if( wsrv ){
		for(i=1;mainForm.list1.LV_Online.count;1){
			if( mainForm.list1.LV_Online.getChecked( i ) ){
				hp = mainForm.list1.LV_Online.getItemText(i,3);
				hp = sktList[ hp ];
				if( hp && hp.instance ){
					result = wsrv.send( hp.instance, "COMMAND||"++mainForm.TB_Command.text );
					if( !result ){
						mainForm.list1.LV_Online.setItemText( "定向命令发送成功!", i, 10 );
					}else {
						mainForm.list1.LV_Online.setItemText( "定向命令发送失败!", i, 10 );
					}
				}else {
					mainForm.list1.LV_Online.setItemText( "已掉线", i, 10 );
				}
			}
		}
		//wsrv.send( hSocket,"verify" )
		mainForm.msgbox("命令发送成功!");
	}
}

win.loopMessage();

代码很短,其实就像是一个中介一样.

可以自定义代码,存成单独的文件,可以在主界面,选择要执行的脚本,可以单发群发给上线手机

下载地址:https://wangpanmao.com/archives/6722/

喜欢的宝子们,帮点赞评论,感谢支持嗷.

相关推荐
WaWaJie_Ngen12 小时前
【设计模式】组合模式(Composite)
设计模式·组合模式·1024程序员节
CN.LG12 小时前
C# 企业微信机器人消息推送
c#·企业微信·1024程序员节·机器人推送
嵌入式-老费12 小时前
Easyx图形库应用(工业自动化领域的应用)
运维·自动化·1024程序员节
小Mei数码说12 小时前
华为Watch GT 6:运动与科技的完美融合
1024程序员节
比奥利奥还傲.12 小时前
不用服务器也能搭博客!Docsify+cpolar的极简方案
1024程序员节
YC运维12 小时前
ELK日志分析系统完整部署与应用指南
1024程序员节
小马哥编程12 小时前
【软考架构】架构风格:针对规则系统体系架构风格,举一个经典案例
1024程序员节
❀͜͡傀儡师12 小时前
Spring Boot 4.0.0-RC1 已经正式发布
1024程序员节·springboot4.0.0·framework7.0.0