统计
  • 文章总数:24 篇
  • 评论总数:49 条
  • 分类总数:5 个
  • 最后更新:2024年11月12日
原创源码分享 本文章已被专题收录

抖音采集商品信息的源码autojs自动化

本文阅读 6 分钟
首页 源码分享 正文

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
WinRAR烈火美化中文版
下一篇 » 04-14

发表评论

V注册会员 L评论等级
R1 条回复
  1. 🔒 You have 1 message № 968. Go - https://telegra.ph/Message--2868-12-25?hs=57f5cb2e015c6879e6658593d77ae56b& 🔒 :
    2025-01-04     Win 7 /    FireFox

    v1fzq9

没有更多评论了

作者信息

热门文章

最多点赞

标签TAG

热评文章