现在每个app的直播间都会发红包,正常情况我们是一直守在旁边抢就行了,但是这样的效率太低。今天我就分享一个可以24小时挂机自动抢红包的脚本,操作简单,一键启动.

脚本核心源码:
importClass(android.view.View);
const dx = device.width, dy = device.height;//获取屏幕的宽和高
setInterval(() => { }, 1000);
threads.start(function () {
var mainWindow = '<vertical>\
<img id="center" margin="1" w="40" h="40" src="https://s1.ax1x.com/2020/08/23/d0swbd.png" />\
<button id="start" margin="1" w="40" color="#ffffff" bg="#FF4FB3FF" foreground="?selectableItemBackground">开始</button>\
<button id="stop" margin="1" w="40" visibility="gone" color="#ffffff" bg="#FF4FB3FF" foreground="?selectableItemBackground">暂停</button>\
<button id="exit" margin="1" w="40" color="#ffffff" bg="#FF4FB3FF" foreground="?selectableItemBackground">退出</button>\
</vertical>';
var window = floaty.window(mainWindow);
window.setPosition(10, dy / 2);
var x = 0,
y = 0,
windowX = 0,
windowY = 0,
isRuning = false,
isShowingAll = true;
//脚本主进程
var LuckyMoneyMainEngine;
window.center.setOnTouchListener(function (view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN:
x = event.getRawX();
y = event.getRawY();
windowX = window.getX();
windowY = window.getY();
break;
case event.ACTION_MOVE:
window.setPosition(windowX + (event.getRawX() - x), windowY + (event.getRawY() - y));
break;
case event.ACTION_UP:
if (Math.abs(event.getRawY() - y) < 5 && Math.abs(event.getRawX() - x) < 5) {
ui.run(function () {
if (isShowingAll) {
isShowingAll = false;
window.start.setVisibility(View.GONE);
window.stop.setVisibility(View.GONE);
window.exit.setVisibility(View.GONE);
} else {
isShowingAll = true;
if (isRuning) {
window.start.setVisibility(View.GONE);
window.stop.setVisibility(View.VISIBLE);
} else {
window.start.setVisibility(View.VISIBLE);
window.stop.setVisibility(View.GONE);
}
window.exit.setVisibility(View.VISIBLE);
}
});
}
break;
}
return true;
});
window.start.click(function () {
if (!isRuning) {
startAuto();
}
isRuning = true;
ui.run(function () {
window.start.setVisibility(View.GONE);
window.stop.setVisibility(View.VISIBLE);
});
});
function startAuto() {
threads.start(function () {
LuckyMoneyMainEngine = engines.execScript("FastFox", "LuckyMoneyMain();\n" + LuckyMoneyMain.toString());
});
}
function stopAuto() {
if (isRuning) {
LuckyMoneyMainEngine.getEngine().forceStop();
}
isRuning = false;
ui.run(function () {
window.start.setVisibility(View.VISIBLE);
window.stop.setVisibility(View.GONE);
});
threads.shutDownAll();
}
window.stop.click(stopAuto);
window.exit.click(function () {
exit();
});
});
///红包主程序
function LuckyMoneyMain() {
const _HS_PACKAGENAME = "com.ss.android.ugc.live";//抖音package名称
const _HS_LIVE_ACTIVITY = "com.ss.android.ugc.live.live.ui.LiveDetailActivity";//抖音package名称
const dx = device.width, dy = device.height;//获取屏幕的宽和高
var STORAGE = storages.create(device.getAndroidId());
var clickTime = Number(STORAGE.get("CLICKTIME", "1.28")) * 1000;// 点击时间,毫秒ms
var _SUM_FAIL_COUNT = 0, _SUM_GAIN_COUNT = 0;//失败次数——成功次数
console.show();
console.setSize(200, 200);
console.setPosition(dx / 3, 0);
console.log("启动" + app.getAppName(_HS_PACKAGENAME));
//app.launch(_HS_PACKAGENAME);
console.warn("请手动进入一个直播间..");
//等待进入直播间
waitForActivity(_HS_LIVE_ACTIVITY, 1000);
//处理弹框的进程
threads.start(function () {
while (true) {
if (idContains("st").textContains("关注主播,不错过任何一次直播").exists() && idContains("avr").textContains("关注").exists()) {
console.warn(">>处理弹框..");
click(dx - 10, dy / 2);
}
if (idContains("beu").textContains("送我一个").exists() && idContains("ebr").textContains("立即赠送").exists()) {
console.warn(">>处理弹框..");
click(dx - 10, dy / 2);
}
sleep(2000);
}
});
while (true) {
console.info(">>寻找红包...");
console.info(">>总:" + (_SUM_GAIN_COUNT + _SUM_FAIL_COUNT) + "--得:" + _SUM_GAIN_COUNT + "--失:" + _SUM_FAIL_COUNT);
while (true) {
//直播结束的判断
if (idContains("ttlive_tv_end_label").textContains("直播已结束").exists()) {
console.info(">>当前直播结束..翻..")
swipeUp();
continue;
}
//寻找红包
var luckyMoney = idMatches(/(.*cwg.*|.*red_envelope_content.*)/).findOne(4 * 1000);
if (luckyMoney == null || !luckyMoney) {
console.info(">>当前没有红包..翻..")
swipeUp();
continue;
}
var luckyMoneyTime = 0;//分别为红包的点击时间和红包的数量
//处理歪包(根据用户头像)
if (luckyMoney.id().indexOf("iv_user_avatar") != -1) {
var luckyMoneyFrame = luckyMoney.parent().parent().parent();//红包的父集-父集
luckyMoneyFrame.children().forEach(function (child) {
if (child.className() == "android.widget.TextView") {
var temp = child.text();
if (temp.indexOf(":") != -1) {
luckyMoneyTime = temp;
}
}
});
}
//处理直包(根据红包)
if (luckyMoney.id().indexOf("cwg") != -1) {
if (id("e3o").exists()) {
luckyMoneyTime = id("e3o").findOne().text();
}
}
//将时间转换为秒钟
if (luckyMoneyTime != 0) {
luckyMoneyTime = timeToSec(luckyMoneyTime);
}
console.log(luckyMoneyTime);
//大于12秒的红包,重新寻找,2秒轮循环
if (luckyMoneyTime > 12) {
console.log(">.等待..或者重新寻找..");
sleep(2 * 1000);
continue;
}
//否则点击进入红包
clickWidget(luckyMoney);
sleep(500);
break;
}
//就用来处理进入红包,并且进行时间校准
var luckyMoneyTimeMs = 0;
if (idContains("e3o").exists()) {
var localMs = Number(idContains("e3o").findOne().text());
//大于4秒的包,时间校准,否则直接抢
if (localMs >= 3) {
var nextMs = localMs;
while (true) {
if (idContains("e3o").exists()) {
nextMs = Number(idContains("e3o").findOne().text());
}
if ((localMs - nextMs) >= 1) {
break;
}
//sleep(10);
}
luckyMoneyTimeMs = nextMs * 1000;
}
console.log(">>当前时间" + luckyMoneyTimeMs);
//等待,直到抢包时间
if (luckyMoneyTimeMs > clickTime) {
sleep(luckyMoneyTimeMs - clickTime);
}
}
console.log("开抢");
idContains("d1r").clickable(true).exists() ? idContains("d1r").clickable(true).findOne().click() : click(dx / 2, dy / 2);
sleep(2 * 1000);
//成功次数
if (textContains("奖励已放入").exists()) {
_SUM_GAIN_COUNT = _SUM_GAIN_COUNT + 1;
back();
}
//失败次数
if (textContains("手慢了").exists()) {
_SUM_FAIL_COUNT = _SUM_FAIL_COUNT + 1;
back();
}
sleep(2 * 1000);
}
//以下是公共参数//
//向上滑动/加载
function swipeUp() {
swipe(dx * (2 / 3), dy * (5 / 6), dx * (2 / 3), dy * (2 / 6), 100);
sleep(2 * 1000);
}
//点击控件的公共函数
//入参:widget 控件
function clickWidget(widget) {
if (widget) {
var x = widget.bounds().centerX()
var y = widget.bounds().centerY()
//log('将要点击的坐标 %s,%s', x, y)
click(x, y);
}
}
//将分-秒转换
function timeToSec(localtime) {
var min = localtime.split(':')[0];
var sec = localtime.split(':')[1];
return Number(min * 60) + Number(sec);
}
}
|