利用adb shell和node.js实现抖音自动抢红包功能(推荐)


Posted in Javascript onFebruary 22, 2018

逻辑很简单,在抖音视频播完之后如果是红包视频,会跳出红包。 我们模拟逻辑如下:

  1. 点击屏幕中央,如果有红包打开红包,没有红包则暂停视频。
  2. 点击返回按钮,如果有红包关闭红包界面,没有红包提示再按一次退出(其实没退出)。
  3. 进行上滑操作,进入下一个视频。

点击、返回、上滑,就这么三步行为,无论有红包没红包都成立,只要计算好时间就行。

代码

下面是一段 node.js 代码:

touch.js

var process = require('child_process');
function exec(shell) {
 process.exec(shell,function (error, stdout, stderr) {
 if (error !== null) {
  console.log('exec error: ' + error);
 }
 });
}
function click() {
 console.log('click')
 exec(`adb shell input tap 400 600`)
 setTimeout(back, 1000)
}
function swipe() {
 console.log('swipe')
 exec(`adb shell input swipe 400 800 400 0 500`)
 setTimeout(click, 20000)
}
function back() {
 console.log('back')
 exec(`adb shell input keyevent 4`)
 setTimeout(swipe, 1000)
}
swipe()

打开手机的开发者模式,启动 USB调试 ,如果是小米请另外打开 USB调试(安全设置) 。连接手机,打开抖音主界面。将这个js保存到本地,使用node执行即可。

$ node touch.js

如果发现抖音每20秒上滑一次,说明成功啦~

原理

类似使用 adb shell 来操作手机的文章还有操作跳一跳等,下面说下原理。

child_process.exec(command[, options][, callback])

该方法功能为衍生一个 shell,然后在 shell 中执行 command,且缓冲任何产生的输出。具体可以看参考文档 其实就是等于执行脚本,shell命令了。 我们利用它来执行 adb shell 命令。

adb shell

adb 是电脑连接手机的开发工具,所有电脑对手机的操作其实都是adb 完成的,包括各种手机助手帮你装 APP 也是。 PS:做了这么久手机,今天才发现这个好玩的功能……汗……

adb shell 可以装apk、看手机信息、操作手机文件、模拟点击行为等功能,是非常强大的。我们这里主要是要模拟点击行为 adb shell input 。 下面罗列下各功能:

// 输入文本 content
$ adb shell input text “hello” 
// 点击返回按钮 keynumber
$ adb shell input keyevent 4
// 点击屏幕某个点 x y
$ adb shell input tap 400 400
// 滑动 x1 y1 x2 y2 time
$ adb shell input swipe 400 800 400 0 500
// 下面三个不太清楚,再研究
$ adb shell input press
$ adb shell input roll
$ adb shell input tmode

更多按键对应值可以看 Android keyevent 对应的值 通过这些命令我们可以对手机进行一些简单操作啦~

最后

这其实是个很简单的逻辑,但是给我很多启发,以后再有什么简单的操作就可以使用adb和node来重复执行啦~ 最后吐槽下:抖音的红包真的少,昨天刷了3个小时就几毛钱,不够电费的说。就当娱乐吧~

PS:下面介绍下Android keyevent 对应的值

Android keyevent 中的各个值,在使用adb shell input 的时候用得到。

KEYCODE_UNKNOWN=0;
KEYCODE_SOFT_LEFT=1;
KEYCODE_SOFT_RIGHT=2;
KEYCODE_HOME=3;
KEYCODE_BACK=4;
KEYCODE_CALL=5;
KEYCODE_ENDCALL=6;
KEYCODE_0=7;
KEYCODE_1=8;
KEYCODE_2=9;
KEYCODE_3=10;
KEYCODE_4=11;
KEYCODE_5=12;
KEYCODE_6=13;
KEYCODE_7=14;
KEYCODE_8=15;
KEYCODE_9=16;
KEYCODE_STAR=17;
KEYCODE_POUND=18;
KEYCODE_DPAD_UP=19;
KEYCODE_DPAD_DOWN=20;
KEYCODE_DPAD_LEFT=21;
KEYCODE_DPAD_RIGHT=22;
KEYCODE_DPAD_CENTER=23;
KEYCODE_VOLUME_UP=24;
KEYCODE_VOLUME_DOWN=25;
KEYCODE_POWER=26;
KEYCODE_CAMERA=27;
KEYCODE_CLEAR=28;
KEYCODE_A=29;
KEYCODE_B=30;
KEYCODE_C=31;
KEYCODE_D=32;
KEYCODE_E=33;
KEYCODE_F=34;
KEYCODE_G=35;
KEYCODE_H=36;
KEYCODE_I=37;
KEYCODE_J=38;
KEYCODE_K=39;
KEYCODE_L=40;
KEYCODE_M=41;
KEYCODE_N=42;
KEYCODE_O=43;
KEYCODE_P=44;
KEYCODE_Q=45;
KEYCODE_R=46;
KEYCODE_S=47;
KEYCODE_T=48;
KEYCODE_U=49;
KEYCODE_V=50;
KEYCODE_W=51;
KEYCODE_X=52;
KEYCODE_Y=53;
KEYCODE_Z=54;
KEYCODE_COMMA=55;
KEYCODE_PERIOD=56;
KEYCODE_ALT_LEFT=57;
KEYCODE_ALT_RIGHT=58;
KEYCODE_SHIFT_LEFT=59;
KEYCODE_SHIFT_RIGHT=60;
KEYCODE_TAB=61;
KEYCODE_SPACE=62;
KEYCODE_SYM=63;
KEYCODE_EXPLORER=64;
KEYCODE_ENVELOPE=65;
KEYCODE_ENTER=66;
KEYCODE_DEL=67;
KEYCODE_GRAVE=68;
KEYCODE_MINUS=69;
KEYCODE_EQUALS=70;
KEYCODE_LEFT_BRACKET=71;
KEYCODE_RIGHT_BRACKET=72;
KEYCODE_BACKSLASH=73;
KEYCODE_SEMICOLON=74;
KEYCODE_APOSTROPHE=75;
KEYCODE_SLASH=76;
KEYCODE_AT=77;
KEYCODE_NUM=78;
KEYCODE_HEADSETHOOK=79;
KEYCODE_FOCUS=80;//*Camera*focus
KEYCODE_PLUS=81;
KEYCODE_MENU=82;
KEYCODE_NOTIFICATION=83;
KEYCODE_SEARCH=84;
KEYCODE_MEDIA_PLAY_PAUSE=85;
KEYCODE_MEDIA_STOP=86;
KEYCODE_MEDIA_NEXT=87;
KEYCODE_MEDIA_PREVIOUS=88;
KEYCODE_MEDIA_REWIND=89;
KEYCODE_MEDIA_FAST_FORWARD=90;
KEYCODE_MUTE=91;

好了,内容就介绍这么多。

Javascript 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
javascript两种function的定义介绍及区别说明
May 02 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
Jun 06 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
微信小程序实现bindtap等事件传参
Apr 08 Javascript
vue.js的简单自动求和计算实例
Nov 08 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
Jun 08 Javascript
vue+echarts实现动态折线图的方法与注意
Sep 01 Javascript
vue使用watch监听属性变化
Apr 30 Vue.js
浅谈webpack打包生成的bundle.js文件过大的问题
Feb 22 #Javascript
babel之配置文件.babelrc入门详解
Feb 22 #Javascript
javascript填充默认头像方法
Feb 22 #Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 #Javascript
利用CDN加速react webpack打包后的文件详解
Feb 22 #Javascript
node内置调试方法总结
Feb 22 #Javascript
详解vue移动端日期选择组件
Feb 22 #Javascript
You might like
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
jquery中对表单的基本操作代码
2010/07/29 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
jstree的简单实例
2016/12/01 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
Python解释执行原理分析
2014/08/22 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
Python松散正则表达式用法分析
2016/04/29 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
机器学习实战之knn算法pandas
2019/06/22 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python如何调用java类
2020/07/05 Python
Python 防止死锁的方法
2020/07/29 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
特步官方商城:Xtep
2017/03/21 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2016高考寄语集锦
2015/12/04 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
MySQL去除密码登录告警的方法
2022/04/20 MySQL