启动 APP 搜索并播放歌曲

本实例使用了魅族 MX4 手机,启动 QQ 音乐 APP 搜索“我的家乡”,播放两分钟后自动关闭 QQ 音乐(目前用的是绝对坐标)。

编写言语:Node JS

注意事项:

1、需在手机上安装 QQ 音乐 APP 打开一次跳过登录

2、nodejs 安装 request 模块 (npm install --save request)

3、TC 必须开启 sigma输入法

源码执行步骤

1、获取Token

2、获取设备名称

3、启动 QQ 音乐

4、搜索歌曲 “我的家乡”

5、播放 “我的家乡”

6、两分钟后关闭 QQ音乐

7、执行: node app.js

源码

/*
 * 启动QQ音乐APP搜索一首歌播放,播放两分钟后关闭APP
 * 
 * 以魅族MX4手机为例
 * 需安装QQ音乐
 */

//安装 request 模块  npm install --save request
const request = require('request');

const deviceUrlBase = 'http://127.0.0.1:8090/TotalControl/v1';
const runAppName = 'com.tencent.qqmusic'; //要运行 APP 的包名(第二步方法获得)

//REST API 账户:sigma  密码:jiehua
/*
var _buf = new Buffer('sigma:jiehua');
var _str = b.toString('base64');
 */
//console.log(_str);
//结果: c2lnbWE6amllaHVh

//开始 
request({
	url: deviceUrlBase + '/login',
    method: "GET",
    json: true,
    headers: {
        "Authorization": "c2lnbWE6amllaHVh",
    }
}, function (error, response, body) {
	if (!error && response.statusCode == 200) {
		var _token = body.value.token;
		console.log('获取Token:'+_token);
		getDevice(_token);
		
	}
});
 

//1、获取设备名称
function getDevice(token) {
	console.log('1、获取设备名称');
	//1、获取设备名称
	request.get(deviceUrlBase + '/devices/main?token='+token, {json: true}, function (error, response, body) {
		if (!error && response.statusCode == 200) {
			//设备名称
			var device = body.id;
			console.log(device);
			
			console.log('2、获取手机上当前运行APP 的包名');
			//2、获取手机上当前运行APP 的包名
			/*
			request.get(deviceUrlBase + '/devices/'+device+'/apps?q=foreground_app', {json: true}, function (error, response, body) {
				if (!error && response.statusCode == 200) {
					console.log(JSON.stringify(body));
					
					//结果:{"status":true,"value":"com.tencent.qqmusic"}
				}
		    });
		    */
		   //用上面的方法获取 APP 包名 com.tencent.qqmusic
		   
		   
		   startApp(device,token);
	  	}
	});
	
}

//3、启动 QQ 音乐
function startApp(device, token) {
	var runAppUrl = deviceUrlBase + '/devices/' + device + '/apps/' + runAppName + '?state=active&token='+token;
	//参数
	var requestData="";
	console.log('3、启动 QQ 音乐');
	//3、启动 QQ 音乐
	request.post({
	    url: runAppUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: requestData
	},
	function(error, response, body) {
	    if (!error && response.statusCode == 200) {
	    	//启动成功
	    	if (body.status == true) {
	    		console.log('在'+ device +'启动成功' + runAppName);
	    		
		   		 //延迟10秒执行,避开QQ音乐开屏广告
	    		setTimeout(function() {
	    			clickInputBox(device, token);
	    		}, 10000);
	    	} else {
	    		//TODO
	    		//启动失败
	    		console.log('启动失败');
	    	}
	    }
	});		
	    		
}

//4、获取输入框焦点
function clickInputBox(device, token) {
	var clickInputUrl = deviceUrlBase + '/devices/' + device + '/screen/inputs';
	//点击的坐标
	var clickParam = {
		"token":token,
		"x":"613",//0.5321
		"y":"247",//0.1234
		"state":"press"
	};
	console.log('4、获取输入框焦点');
	console.log(clickInputUrl+'---'+ JSON.stringify(clickParam));
	
	request.post({
	    url: clickInputUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: clickParam
	},
	function(error, response, body) {
		console.log(body);
	    if (!error && response.statusCode == 200) {
	    	if (body.status == true) {
	    		console.log('获取输入框焦点成功---');
	    		setTimeout(function() {
	    			inputText(device, token);
	    		}, 2000);
	    	} else {
	    		console.log('获取输入框焦点失败');
	    	}
	    }
	});
	
}

//5、输入文本
function inputText(device, token) {
	var TextUrl = deviceUrlBase + '/devices/' + device + '/screen/texts';
	var textParam = {
		"token":token,
		"text":"我的家乡"
	};
	console.log('5、输入文本');
	console.log(TextUrl+'---'+JSON.stringify(textParam));
	
	request.post({
	    url: TextUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: textParam
	},
	function(error, response, body) {
	    if (!error && response.statusCode == 200) {
	    	if (body.status == true) {
	    		console.log('输入文本成功');
	    		setTimeout(function() {
	    			selectSong(device, token);
	    		}, 2000);
	    	
	    	} else {
	    		console.log('输入文本失败');
	    	}
	    }
	});
}

//6、选择歌曲
function selectSong(device, token) {
	var selectUrl = deviceUrlBase + '/devices/' + device + '/screen/inputs';
	//点击的坐标
	var selectParam = {
		"token":token,
		"x":"274",//0.2352
		"y":"387",//0.1984
		"state":"press"
	};
	console.log('6、选择歌曲');
	console.log(selectUrl+'---'+ JSON.stringify(selectParam));
	
	request.post({
	    url: selectUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: selectParam
	},
	function(error, response, body) {
	    if (!error && response.statusCode == 200) {
	    	if (body.status == true) {
	    		console.log('选择歌曲成功---');
	    		setTimeout(function() {
	    			sing(device, token);
	    		}, 2000);
	    	} else {
	    		console.log('选择歌曲失败');
	    	}
	    }
	});
}

//7、播放歌曲
function sing(device, token) {
	var clickUrl = deviceUrlBase + '/devices/' + device + '/screen/inputs';
	//点击的坐标
	var clickParam = {
		"token":token,
		"x":"111",//0.1024
		"y":"675",//0.4417
		"state":"press"
	};
	console.log('7、播放歌曲');
	console.log(clickUrl+'---'+ JSON.stringify(clickParam));
	
	request.post({
	    url: clickUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: clickParam
	},
	function(error, response, body) {
	    if (!error && response.statusCode == 200) {
	    	if (body.status == true) {
	    		console.log('播放唱歌曲成功---');
	    		console.log('两分钟后关闭APP---');
	    		setTimeout(function() {
	    			closeApp(device, token);
	    		}, 120000);
	    		
	    	} else {
	    		console.log('播放唱歌曲失败');
	    	}
	    }
	});
}

//8、关闭 QQ 音乐
function closeApp(device, token) {
	var runAppUrl = deviceUrlBase + '/devices/' + device + '/apps/' + runAppName + '?state=inactive&token='+token;
	//参数
	var requestData="";
	
	console.log('8、关闭 QQ 音乐');
	request.post({
	    url: runAppUrl,
	    method: "POST",
	    json: true,
	    headers: {
	        "content-type": "application/json",
	    },
	    body: requestData
	},
	function(error, response, body) {
	    if (!error && response.statusCode == 200) {
	    	if (body.status == true) {
	    		console.log('关闭 APP 成功');
	    	} else {
	    		//TODO
	    		console.log('启动 APP 失败');
	    	}
	    }
	});		
}