_撸猫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/

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

相关推荐
延凡科技2 天前
工业锅炉智慧云管控平台解决方案|物联网远程监测、智能预警与能耗优化
物联网·远程控制·工业物联网·设备运维·智慧锅炉
南方者2 天前
远程控制延迟低至3ms?ToDesk ZeroSync 引擎技术全解析
远程工作·远程连接·todesk·远程控制
u0103055272 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055273 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝4 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055274 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055275 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055277 天前
Java实用类应用精讲
人工智能·1024程序员节
u0103055277 天前
Java I/O核心操作实战
人工智能·1024程序员节
u0103055278 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节