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

  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;

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

利用adb shell和node.js实现抖音自动抢红包功能(推荐)的更多相关文章

  1. 为什么PATH不适用于从Xcode执行的自定义shell脚本?

    我观察到Xcode在运行脚本阶段执行的自定义shell脚本没有设置任何环境变量.他们有很多其他变量,但不是PATH.有可能解决这个问题,怎么样?我只想运行一个应该在路径中的工具,我不想开始手动检查可能的位置.解决方法你可以明确地找到用户.bashrc,.profile等.或者更好的是,运行类似的东西这不会有污染其他变量的风险.

  2. ios – Xcode Server 4.0 git从构建触发脚本推送

    我为一个托管在github上的项目安装了一个XcodeBot.我按照步骤和设置机器人来使用我现有的SSH密钥.验证成功,项目结算和建立.然后,我在预触发器操作中添加了一个shell脚本,它增加了plist中的版本,将其标记,并将该更改提交到github.但是当我尝试从shell脚本执行gitpush时,我得到:–推送到git@github.com:spex-app/spex-ios.git权限被拒

  3. ios – 超时等待120秒的模拟器启动

    看起来像Teamcity代理(TC版本是9.0EAP)不能通过测试shell脚本运行iOS模拟器.我正在使用BuildStep:命令行,它运行自定义脚本并将参数传递给它.通过使用shell脚本../bin/mac.launchd.sh,在MacOSXYosemite10.10上启动了Teamcity代理.构建日志错误:我的shell脚本进行测试:我也试过从这个question的解决方案,但没有帮助

  4. 在附加到XCode项目的shell脚本中无法识别$SRCROOT

    尝试运行附加到我的xcode项目的简单脚本,如下所示……如果我在XCode之外运行脚本似乎运行正常但是从XCode运行时我收到以下错误…似乎SRCROOT变量在脚本中是不可检测的,但我的理解是这是应该传递并可由脚本访问的环境变量之一.任何想法?解决方法原来这是我的错.该剧本实际上根本没有被调用.在XCode中,我指的是使用脚本的路径…更正了问题,我现在可以从我的脚本访问$SRCROOT.

  5. swift – Xcode 8 Shell脚本调用错误

    我试图解决这个问题几个小时,但它仍然存在.在论坛上尝试了一切,没有任何帮助.我正在使用Cocoapods最新版本1.2.0.beta.1当我尝试构建项目时,它给了我:再次安装pod并运行该项目.使用命令:

  6. android – 来自adb的’grep’命令的问题

    当我用adb写的时候:我得到错误输出:但如果我将它拆分为两个操作符:它工作正常.如果唯一的方法是将它拆分为两个–首先进入adbshell,然后运行Inquire,有一种方法可以从c#中执行此操作吗?

  7. Android模拟器 – 离线到在线模式

    有没有办法将Android模拟器从离线模式带到在线模式而不关闭AVD?我尝试了adb的’kill-server’,’start-server’命令,但这似乎只是重新启动adb服务器,模拟器仍处于离线模式,’adbdevices’仍然显示’离线’状态.也有人可以解释模拟器的“离线”模式究竟是什么意思.在我的例子中–仿真器(独立),守护进程和ADB服务器–似乎都在运行.为什么模拟器状态仍处于脱机状态?

  8. 如何在Android Shell中获得以毫秒为单位的时间?

    3个我正在尝试制作一个在Android上运行的shell脚本.我需要以比秒更精确的时间来测量时间–毫秒或纳秒.我怎样才能在AndroidShell中执行此操作?id=stericson.busybox&hl=en然后你可以这样做:adbshell“busyBoxdate%s”以秒为单位获得时间:adbshell“busyBoxdate%N”获得纳秒秒.

  9. Android Build Tools无论如何都只构建x86_64. APK通过adb安装,但在Play商店中显示不兼容

    所以这发生了.无论我在build.gradle上做什么,所有的APK都会以native_code=’x86_64’标志出来,所以当我将应用程序部署到商店时,结果是有15K不兼容的设备,只有19兼容.我首先想到,不知何故,安装NDK是原因,或者我修改后的构建脚本.但是当我通过GenerateSignedAPK向导时,它仍然会发生.分裂块也最初缺失,并没有帮助.最奇怪的是,当我通过控制台推送安装时,IT工作!

  10. android – 通过ADB更改设备语言

    我想通过亚行改变语言.我试试:但我得到错误:怎么了?我想在物理设备上执行此操作解决方法您的错误与adb无关.您只是不了解本地shell如何处理命令.您正在做的是在本地运行这些命令:您看到的错误消息来自本地shell(即系统上没有setprop可执行文件,启动和停止命令具有非可选参数.正确的命令是或者在最近的Android版本中:

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部