2024年4月作品
功能 :可在界面填写api接口数据可用api接口接收,输入关键词点击悬浮窗即可自动开始
适配2024年最新抖音。
PS: 有能力可以自己修改。
附源码:
"ui";
// 主界面布局
ui.layout(
<vertical padding="16">
<input id="apiUrl" hint="请输入API接口"/>
<input id="gjc" hint="请输入关键词"/>
<Switch id="toggleFloaty" text="悬浮窗开关"/>
</vertical>
);
var storage = storages.create("my_storage");
// 保存输入框的内容
function saveInput() {
storage.put("apiUrl", ui.apiUrl.getText().toString());
storage.put("gjc", ui.gjc.getText().toString());
}
// 加载保存的内容到输入框
function loadInput() {
ui.apiUrl.setText(storage.get("apiUrl", ""));
ui.gjc.setText(storage.get("gjc", ""));
}
// 应用启动时加载输入框内容
loadInput();
var floatyWindow = null;
var isScriptRunning = false;
// 监听悬浮窗开关变化
ui.toggleFloaty.setOnCheckedChangeListener(function(widget, checked) {
if (checked) {
// 显示悬浮窗
saveInput(); // 保存输入框的内容
createFloatingButton();
} else {
// 隐藏悬浮窗
if (floatyWindow !== null) {
floatyWindow.close();
floatyWindow = null;
}
}
});
// 创建悬浮按钮
function createFloatingButton() {
if (floatyWindow === null) {
floatyWindow = floaty.window(
<button id="action" text="开始运行" w="90" h="40" bg="#77ffffff"/>
);
var x = 0, y = 0, windowX, windowY, downTime;
floatyWindow.action.setOnTouchListener(function(view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN:
x = event.getRawX();
y = event.getRawY();
windowX = floatyWindow.getX();
windowY = floatyWindow.getY();
downTime = new Date().getTime();
return true;
case event.ACTION_MOVE:
floatyWindow.setPosition(windowX + (event.getRawX() - x),
windowY + (event.getRawY() - y));
return true;
case event.ACTION_UP:
if (Math.abs(event.getRawY() - y) < 5 && Math.abs(event.getRawX() - x) < 5) {
toggleScript();
}
return true;
}
return true;
});
}
}
// 切换脚本运行状态
function toggleScript() {
if (!isScriptRunning) {
runMainThread(); // 启动主线程逻辑
floatyWindow.action.setText('停止运行');
isScriptRunning = true;
} else {
stopMainThread(); // 停止主线程逻辑
floatyWindow.action.setText('开始运行');
isScriptRunning = false;
}
}
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;
}
click(busObj.x, busObj.y);
sleep(1000)
return true;
};
// 模拟手势操作,从起始点 (x1, y1) 到结束点 (x2, y2),时长为 duration 毫秒
function gestureSwipe(x1, y1, x2, y2, duration) {
swipe(x1, y1, x2, y2, duration);
sleep(duration); // 等待滑动完成
}
function getInformation(storeName, keys, messages, phone) {
let url = ui.apiUrl.getText().toString(); // 指定的URL
let data = {
storename: storeName,
keys: keys,
messages: messages,
phone: phone
};
let res =http.postJson(url, data);
console.log("响应状态码: " + res.statusCode);
let result = res.body.string(); // 尝试获取字符串响应
console.log("响应内容: ", result);
// 解析JSON尝试
try {
let jsonResult = JSON.parse(result);
console.log("解析结果: ", jsonResult);
} catch (e) {
console.error("解析响应失败: ", e);
}
}
function 采集流程(重复店铺){
let mingzi, address, tel; // 用于存储找到的信息
text("客服").findOne(5000)
let kf=text("客服").findOne(5000)
if(kf){
控件随机点(kf)
id("com.ss.android.ugc.aweme:id/tv_title").waitFor()
let 店铺名字控件 = id("com.ss.android.ugc.aweme:id/tv_title").findOne(2000);
if(!重复店铺.includes(店铺名字控件.text())){
if (店铺名字控件) {
let 店铺名字 = 店铺名字控件.text();
重复店铺.push(店铺名字)
log("店铺名字: " + 店铺名字);
mingzi=店铺名字
} else {
log("未找到店铺名字");
}
desc("表情").waitFor()
let guanbi=id("iv_close").findOne(2000)
if(guanbi){
控件随机点(guanbi)
}
let 加号 = desc("更多面板").findOne(100);
if(加号){
控件随机点(加号)
}
text("商家电话").findOne(2000);
let 电话=text("商家电话").findOne(5000)
if(电话){
控件随机点(电话)
id("digits").waitFor()
}
let 商家电话控件 = id("digits").findOne(2000);
if (商家电话控件) {
let 商家电话 = 商家电话控件.text();
log("商家电话: " + 商家电话 );
tel=商家电话.trim()
launchApp("抖音")
} else {
log("未找到商家电话");
let 商家电话 = "否";
log("商家电话: " + 商家电话 );
tel=商家电话
}
sleep(2000)
id("com.ss.android.ugc.aweme:id/tv_title").waitFor()
let 进店=id("com.ss.android.ugc.aweme:id/tv_title").findOne(5000)
if(进店){
log("进店");
控件随机点(进店)
}
id("com.ss.android.ugc.aweme:id/flh").waitFor()
let 动态=text("个作品").findOne(2000)
if(动态){
控件随机点(动态)
id("com.ss.android.ugc.aweme:id/o0r").waitFor()
let 是否直播=text("直播动态").findOne(2000)
if(是否直播){
控件随机点(是否直播)
desc("历史回顾").findOne(2000)
let ff1 = id("iqo").findOne()
let element11 = ff1.find(className("com.lynx.tasm.behavior.ui.text.FlattenUIText").drawingOrder("1")).find(textContains("月"));
// 获取当前日期
// 获取当前日期
let today = new Date();
// 定义一个函数来计算日期差异
function dateDiffInDays(a, b) {
const _MS_PER_DAY = 1000 * 60 * 60 * 24;
// 将两个日期转换为UTC时间
const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
// 计算日期差异
return Math.abs(Math.floor((utc2 - utc1) / _MS_PER_DAY));
}
// 将获取到的控件列表按日期排序
let sortedElements = element11.toArray().sort(function(a, b) {
// 从控件文本中提取日期
let dateTextA = a.text().match(/(\d{4})年(\d{1,2})月(\d{1,2})日/);
let dateTextB = b.text().match(/(\d{4})年(\d{1,2})月(\d{1,2})日/);
// 检查是否成功提取日期文本
if (dateTextA && dateTextB) {
// 构建日期对象
let dateA = new Date(parseInt(dateTextA[1]), parseInt(dateTextA[2]) - 1, parseInt(dateTextA[3]));
let dateB = new Date(parseInt(dateTextB[1]), parseInt(dateTextB[2]) - 1, parseInt(dateTextB[3]));
// 返回日期差异
return dateDiffInDays(dateA, today) - dateDiffInDays(dateB, today);
} else {
// 如果无法提取日期文本,则返回0
return 0;
}
});
// 获取最近日期的控件文本
let nearestElementText = sortedElements[0].text();
if (nearestElementText!==0) {
log("店铺动态: " + nearestElementText );
address=nearestElementText
} else {
let 店铺动态 = "否";
log("店铺动态:" + 店铺动态 );
address=店铺动态
}
}else{
let 店铺动态 = "否";
log("店铺动态:" + 店铺动态 );
address=店铺动态
}
}else{
let 店铺动态 = "否";
log("店铺动态:" + 店铺动态 );
address=店铺动态
}
toast("采集完成:" + "店铺名字:" + mingzi + ",店铺动态:" + address + ",商家电话:" + tel);
getInformation(mingzi, ui.gjc.getText().toString(), address, tel)
// app.startActivity({
// data: "snssdk1128://search"
// });
log("开始下次循环" );
while(true){
let 回到列表 =id("yza").findOne(1500)
if(回到列表){
break;
}else{
back()
}
}
}else{
while(true){
let 回到列表 =id("yza").findOne(1500)
if(回到列表){
break;
}else{
back()
}
}
}
}else{
while(true){
let 回到列表 =id("yza").findOne(1500)
if(回到列表){
break;
}else{
back()
}
}
}
}
function 搜索关键字(){
launchApp("抖音")
sleep(3000)
app.startActivity({
data: "snssdk1128://search"
});
id("fl_intput_hint_container").waitFor()
//这个语句会在屏幕上所有输入框输入"嘿嘿嘿"。
setText(ui.gjc.getText().toString());
let 进店=desc("搜索").findOne(5000)
if(进店){
log("进店");
控件随机点(进店)
}
let 进店1=text("商品").findOne(5000)
if(进店1){
log("进店");
控件随机点(进店1)
}
}
function 依次点击商品() {
// 存储已点击过的 text 属性值
let clickedTexts = [];
let 重复店铺 = [];
// 点击下一个不同的元素
// 点击下一个不同的元素
function clickNextDifferentElement() {
let ff = id("0if").findOne(); // 查询元素
if (!ff) return; // 如果找不到元素则退出函数
let element1 = ff.find(className("com.lynx.tasm.behavior.ui.text.FlattenUIText").drawingOrder("1"));
// let element2 = ff.find(className("com.lynx.tasm.behavior.ui.text.FlattenUIText").drawingOrder("1").depth("26"));
let elements = element1
// 过滤出未点击过的元素
let unclickedElements = elements.filter(element => {
let text = element.text();
return (
text !== "" &&
text.length > 14 &&
!clickedTexts.includes(text)
);
});
console.log(unclickedElements);
// 遍历未点击过的元素
unclickedElements.forEach(element => {
let text = element.text();
clickedTexts.push(text); // 将点击过的元素文本添加到列表中
let clickResult = false;
// 检查点击位置是否在指定范围内
let bus = element.bounds();
let clickX = random(bus.left + 10, bus.right - 10);
let clickY = random(bus.top + 10, bus.bottom - 10);
if (clickX >= 0 && clickY >= 0 && clickX <= device.width && clickY <= device.height) {
控件随机点(element); // 点击元素
采集流程(重复店铺)
}else {
// 模拟手势滑动至下一页
gestureSwipe(device.width / 2, device.height * 0.4, device.width / 2, device.height * 0.2, 345);
sleep(2000); // 可根据需要调整滑动后的延迟时间
}
});
}
// 点击所有不同的元素
while (true) {
clickNextDifferentElement();
// 模拟手势滑动
gestureSwipe(device.width / 2, device.height * 0.4, device.width / 2, device.height * 0.2, 345);
sleep(1500); // 可根据需要调整点击间隔时间
}
}
// 启动主线程逻辑
function runMainThread() {
// 这里填写主线程的代码逻辑
thread = threads.start(() => {
搜索关键字()
依次点击商品()
});
console.log("主线程开始运行...");
}
// 停止主线程逻辑
function stopMainThread() {
// 这里填写停止主线程的代码逻辑
thread.interrupt();
console.log("主线程停止运行...");
}
...
原创文章,作者:admin,如若转载,请注明出处:https://gebulin.top/2024/04/14/4.html
v1fzq9