利用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 相关文章推荐
用js实现多域名不同文件的调用方法
Jan 12 Javascript
JavaScript与C# Windows应用程序交互方法
Jun 29 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
JS 弹出层 定位至屏幕居中示例
May 21 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
使用typescript构建Vue应用的实现
Aug 26 Javascript
JS实现瀑布流效果
Mar 07 Javascript
浅谈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
Zend公司全球首推PHP认证
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
python修改FTP服务器上的文件名
2019/09/11 Python
使用python绘制二维图形示例
2019/11/22 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
中科软笔试题和面试题
2014/10/07 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
化学教师自荐信范文
2013/12/28 职场文书
班组长岗位职责范本
2014/01/05 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
云冈石窟导游词
2015/02/04 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android