1.控件随机点
function 控件随机点(uiObject) {
if (!uiObject) return null;
let bus = uiObject.bounds();
let 偏移 = {
x: bus.width() * 0.3,
y: bus.height() * 0.3,
};
let busObj = {
x: random(bus.left + 偏移.x, bus.right - 偏移.x),
y: random(bus.top + 偏移.y, bus.bottom - 偏移.y),
};
if (busObj.x < 0 || busObj.y < 0 || busObj.x > device.width || busObj.y > device.height) {
return false;
}
// log(bus.centerX(), bus.centerY())
// log(busObj.x, busObj.y);
click(busObj.x, busObj.y);
sleep(500)
return true;
};
2.设置代理IP和清除代理
设置代理
function 换IP(){
// 清除现有代理设置
shell ("settings put global http_proxy :0", true);
// 访问API获取新的代理信息
// var apiUrl = ui.runCountInput.getText().toString();
var apiUrl = "https://api.douyadaili.com/proxy/?service=GetIp&authkey=H3oToE523ViSh7r94Qwi&num=1&lifetime=15&prot=0&format=json&distinct=1&isp=0&sameoutip=1&high=1&detail=1";
var response = http.get(apiUrl);
if (response.statusCode != 200) {
log("API 请求失败");
return;
}
// 解析API返回的代理信息
var responseData = JSON.parse(response.body.string());
if (responseData.ret !== 200) {
toast("API 返回错误:" + responseData.msg);
return;
}
// 提取代理信息
var proxyInfo = responseData.data[0];
var host = proxyInfo.ip;
var port = proxyInfo.port;
// var user = proxyInfo.user;
// var password = proxyInfo.pwd;
// 设置新的代理
shell("settings put global http_proxy " + host + ":" + port, true);
shell("settings put global global_http_proxy_host " + host, true);
shell("settings put global global_http_proxy_port " + port, true);
// shell("settings put global global_http_proxy_user " + user, true);
// shell("settings put global global_http_proxy_password " + password, true);
log("代理设置成功: " + host + ":" + port);
}
清除代理
function 清除代理(){
// 清除现有代理设置
}
3.获取ip城市
// 定义获取城市信息的函数
function getCityFromIpAddress() {
// 设置请求的URL
var url = "https://whois.pconline.com.cn/ipJson.jsp?json=true";
// 发送GET请求
var response = http.get(url);
// 检查响应状态码
if (response.statusCode == 200) {
// 解析返回的JSON字符串
var json = JSON.parse(response.body.string());
// 提取城市信息
var city = json.city;
// 返回城市信息
return city;
} else {
// 如果响应状态码不是200,返回错误信息
// return "Error: " + response.statusCode;
return "网络错误";
}
}
4.生成随机手机号码
// 生成随机手机号码
function generateRandomPhoneNumber() {
// 中国大陆手机号码前三位(号段)列表
const prefixList = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139',
'145', '147', '149', '150', '151', '152', '153', '155', '156',
'157', '158', '159', '166', '170', '171', '172', '173', '174', '175',
'176', '177', '178', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189',
'191', '198', '199'];
// 随机选择号段
let phoneNumber = prefixList[randomInt(0, prefixList.length - 1)];
// 剩余八位是随机数字
for (let i = 0; i < 8; i++) {
phoneNumber += randomInt(0, 9).toString();
}
return phoneNumber;
}
// 生成qq
function generateRandomNumber() {
const length = Math.floor(Math.random() * 2) + 8; // 随机生成8或9
let randomNumber = '';
for (let i = 0; i < length; i++) {
randomNumber += Math.floor(Math.random() * 10).toString();
}
return randomNumber;
}
5.生成随机账号
// 生成随机账号
function generateRandomAccount() {
// 定义账号长度为8到14位
const length = randomInt(8, 14);
// 定义字母和数字的数量
const numLetters = randomInt(1, length - 3); // 至少一个字母,且字母后面至少有三个数字
const numNumbers = length - numLetters;
// 生成字母部分
let lettersPart = '';
for (let i = 0; i < numLetters; i++) {
lettersPart += String.fromCharCode(randomInt(97, 122)); // 小写字母a-z的ASCII码
}
// 生成数字部分
let numbersPart = '';
for (let i = 0; i < numNumbers; i++) {
numbersPart += randomInt(0, 9).toString();
}
// 合并字母和数字部分
return lettersPart + numbersPart;
}
6.生成随机密码
// 生成随机密码
function generateRandomPassword() {
// 定义密码的总长度为6到10位
const totalLength = randomInt(6, 10);
// 定义前两位为小写字母
let password = '';
for (let i = 0; i < 2; i++) {
password += String.fromCharCode(randomInt(97, 122)); // 小写字母a-z的ASCII码
}
// 生成剩余的字符
for (let i = 2; i < totalLength; i++) {
// 随机选择生成字母还是数字
const isLetter = randomInt(0, 1) === 0;
if (isLetter) {
// 随机生成一个小写字母
password += String.fromCharCode(randomInt(97, 122));
} else {
// 随机生成一个数字
password += randomInt(0, 9).toString();
}
}
return password;
}
7.执行下滑动操作
// 执行下滑动操作
function swipeDown() {
// 设置滑动参数
var width = device.width; // 设备宽度
var height = device.height; // 设备高度
var swipeDuration = 500; // 滑动持续时间(毫秒)
// 从屏幕中间向上滑动
swipe(width / 2, height * 3.5 / 4, width / 2, height / 4, swipeDuration);
}
8.取号分割符----
function 取号() {
let filePath = "/mnt/shared/Pictures/666.txt";
if (!filePath) {
console.log("输入路径为空,请输入有效的文件路径");
return null;
}
let file = open(filePath, "r");
let lines = file.readlines();
file.close();
if (lines.length === 0) {
console.log("没有文件了");
exit()
return null; // 如果文件为空,则返回null
}
let firstLine = lines[0];
let parts = firstLine.split("----");
return {
cardnanme: parts[0].trim(),
card: parts[1].trim()
};
}
9.写入文本文件
function 写入文件(文件路径, 内容) {
// 检查文件是否存在,不存在则先创建文件
let file = open(文件路径, "a"); // "a" 模式用于追加内容
if (!file) {
console.log("无法打开或创建文件:" + 文件路径);
return;
}
file.writeline(内容); // 写入内容并自动添加换行
file.close(); // 关闭文件
}
//调用如
写入文件("/mnt/shared/Pictures/" + "已注册信息.txt","注册成功----" + randomAccount + "----" + randomPassword+city);
10.删除当前行
function 删除当前行(filePath, identifier) {
// 打开文件以读取内容
let file = open(filePath, "r");
// 读取文件的所有行
let lines = file.readlines();
// 关闭文件
file.close();
// 存储未被删除的行
let remainingLines = [];
// 遍历文件的每一行
for (let line of lines) {
// 如果行不以指定标识符开头,则将其保留
if (!line.startsWith(identifier)) {
remainingLines.push(line);
}
}
// 重新打开文件以写入修改后的内容
file = open(filePath, "w");
// 将剩余的行写入文件
for (let line of remainingLines) {
file.writeline(line);
}
// 关闭文件
file.close();
}
//调用如
删除当前行("/mnt/shared/Pictures/666.txt",quhao.cardnanme);
//慎用,会删除当前行分割符合某一部分的所有行
11.塞贝尔曲线滑动
function 投篮功能() {
try {
sleep(1200)
// 图片1和图片2的网络链接(确保设备连接到互联网并且能够访问这些链接)
// var image1Url = "https://p1.meituan.net/csc/46a47df620209f5e8a322dc26a8fdd534470.jpg";
// var image2Url = "https://p0.meituan.net/csc/ebf80e004b05a72f8e1f661913a877817626.jpg";
// // className("android.view.View").depth("15").drawingOrder("0").findOne(10000)
// 从网络获取图片1和图片2
var image1 = images.read("/mnt/shared/Pictures/Screenshots/篮球.png");
var image2 = images.read("/mnt/shared/Pictures/Screenshots/蓝框.png");
// // 从网络获取图片1和图片2
// var image1 = images.load(image1Url);;
// var image2 = images.load(image2Url);;
if (!image1 || !image2) {
console.log("获取图片失败");
// exit();
}
if(!requestScreenCapture()){
alert("请求截图失败");
// exit();
return false;
}
// 获取当前屏幕截图
var screenshot = captureScreen();
// 查找图片1的位置
var image1Point = images.findImage(screenshot, image1, {
threshold: 0.1 // 尝试调整阈值,范围从0到1,值越大匹配越严格
});
// 查找图片2的位置
var image2Point = images.findImage(screenshot, image2, {
threshold: 0.1
});
if (image1Point && image2Point) {
// 计算图片1和图片2的中心点坐标
var image1CenterX = image1Point.x + image1.width / 2;
var image1CenterY = image1Point.y + image1.height / 2;
var image2CenterX = image2Point.x + image2.width / 2;
var image2CenterY = image2Point.y + image2.height / 2;
// 塞贝尔曲线的控制点
var controlX1 = image1CenterX + (image2CenterX - image1CenterX) / 4;
var controlY1 = image1CenterY - 200;
var controlX2 = image1CenterX + 3 * (image2CenterX - image1CenterX) / 4;
var controlY2 = image1CenterY + 200;
// 生成贝塞尔曲线点
function bezierCurvePoints(startX, startY, controlX1, controlY1, controlX2, controlY2, endX, endY, steps) {
var points = [];
for (var t = 0; t <= 1; t += 1 / steps) {
var x = Math.pow(1 - t, 3) * startX +
3 * t * Math.pow(1 - t, 2) * controlX1 +
3 * Math.pow(t, 2) * (1 - t) * controlX2 +
Math.pow(t, 3) * endX;
var y = Math.pow(1 - t, 3) * startY +
3 * t * Math.pow(1 - t, 2) * controlY1 +
3 * Math.pow(t, 2) * (1 - t) * controlY2 +
Math.pow(t, 3) * endY;
points.push([x, y]);
}
return points;
}
// 生成贝塞尔曲线的点
var points = bezierCurvePoints(image1CenterX, image1CenterY, controlX1, controlY1, controlX2, controlY2, image2CenterX, image2CenterY, 100);
// 执行滑动操作
gesture.apply(null, [random(1399, 1899)].concat(points));
console.log("投篮成功");
let 重试 =text("Verify Fail, Click For Retry").findOne(5000)
if(重试){
控件随机点(重试)
return 投篮功能()
}
} else {
console.log("未找到篮球图片或蓝框图片");
let 重试 =text("Security Verify").findOne(3000)
if(重试){
控件随机点(重试)
return 投篮功能()
}
}
} catch (error) {
console.log("投篮失败");
let 重试 =text("Verify Fail, Click For Retry").findOne(3000)
if(重试){
控件随机点(重试)
return 投篮功能()
}
}
}
....待添加