使用AI来实现拼多多自动化运营脚本

AI编程 是当前最热门的话题之一,指的是大模型来辅助人类进行编程 ,甚至由AI自动生成代码。这个过程通常被称为AI代码生成AI辅助编程。

常见的AI编程工具:

  • GitHub Copilot:基于OpenAI的Codex模型,能根据你的注释或代码上下文自动建议和生成代码。

  • Amazon CodeWhisperer:亚马逊推出的类似工具。

  • Tabnine:一款专注于代码补全的AI助手。

  • 通义灵码(阿里)、CodeGeeX(智谱)等:国内优秀的同类产品。

  • 大型语言模型:直接使用ChatGPT、Claude、DeepSeek Code等聊天机器人,通过自然语言描述来生成代码片段。

自动化脚本(Automation Scripts)是指编写一些小程序(通常用Python, JavaScript等语言)来自动执行重复、繁琐的计算机任务,从而解放人力,提高效率和准确性。AI编程极大地降低了编写这类脚本的门槛,并提升了开发效率。

一、准备工作

如果是新手强烈建议先看冰狐AI编程文档,了解具体操作步骤,准备一台手机并安装冰狐智能辅助,打开冰狐调试模式,具体操作看冰狐官方文档。配置好大模型参数,推荐使用deepseek。

二、梳理需求

我们总体需求是:实现拼多多自动化运营(点击这里查看具体的视频教程)。但是仅仅这样的比较笼统的、大概的需求还是不够的,我们必须尽量细化,否则AI可能无法正确返回结果。如何来细化需求呢?核心原则是:我们自己手工按需求实际操作下,把每一步的操作记录下来,一般就是我们最终的细化需求了。下面我们就具体来看下如何细化需求:

  • 打开拼多多

打开拼多多后需要判断是否成功进入了拼多多,可以我们可以选择使用"首页"和"个人中心"来做判断。

  • 点击进入搜索页面

点击顶部的搜索框进入搜索页面,通过分析ui树发现无法直接点击搜索框,但是可以通过点击"照相机"左边偏移50像素位置进入搜索框。

  • 搜索

在搜索页面中直接在类名为android.widget.EditText的控件中输入商品名,比如:"手机",然后点击搜索按钮,进入搜索结果页面。

  • 循环遍历处理

在搜索结果页面中循环处理每一个结果,注意:这里循环处理的是id为com.xunmeng.pinduoduo:id/tv_title的控件。

  • 找到商品店铺

上一步找到的title控件,点击它进入商品页面,如果找到"客服"文本则说明进入了商品页面,然后滑动屏幕直到找到"进店"文本为止。通过分析ui树得出:进店控件的family取值为[0, 2, 1, 1]即为店铺名。

三、生成脚本

总结第二步的细化后的ai需求为:"打开拼多多,若找到"首页"或者"个人中心"则表示成功进入拼多多。点击文本为"拍照搜索"且类名为android.widget.ImageView控件的左边50个像素位置,进入含有类名为android.widget.EditText控件的页面。在该控件中输入文本"手机",然后点击文本为"搜索"的按钮,进入含有id为com.xunmeng.pinduoduo:id/tv_title的搜索结果页面。在搜索界面页面中循环遍历处理id为com.xunmeng.pinduoduo:id/tv_title的所有控件,用文本"拍照搜索"来判断是否为搜索结果面。具体处理为:点击控件进入含有文本为"客服"控件的页面,查找文本为"进店"的控件,如果找不到则向上滚动页面后继续查找,最多滚动5次,如果找到则获取控件的famliy为[0, 2, 1, 1]的控件的文本。"。直接提交给AI,AI思考几秒后,就会给出对应的代码。

javascript 复制代码
// 循环遍历处理
function _loopDeal(fnGetContainer, fnGetTitle, fnTask, options) {
     var dealedArr = [], scrollCount = 0;
     var cbItemFilter = options && options.cbItemFilter ? options.cbItemFilter : null;
     var backTag = options && options.backTag ? options.backTag : '';
     var endTag = options && options.endTag ? options.endTag : '';
     var maxConsecutiveScrollCount = options && options.maxConsecutiveScrollCount ? options.maxConsecutiveScrollCount : 3;
     console.log('backTag:', backTag, 'endTag:', endTag, 'maxConsecutiveScrollCount:', maxConsecutiveScrollCount);

     while (true) {
         var container = fnGetContainer();
         if (container) {
             var find = false;
             // 遍历找到的所有目标
             for (var item of container) {
                 // 过滤掉无效的item
                 if (!cbItemFilter || cbItemFilter(item)) {
                     // 获取title,排除空
                     var title = fnGetTitle(item);
                     if (strIsNotEmpty(title.trim())) {
                         if (!dealedArr.includes(title)) {
                            console.log('处理:' + title);
                             find = true;
                             dealedArr.push(title);

                             // 执行任务
                             var r = fnTask(item);
                             console.log('执行任务结果:' + r);

                             // 返回到容器界面
                             if (backTag) {
                                 var b = back2Page(backTag, { backFirst: false, maxStep: 8 });
                                 console.log('back b:' + b);
                             }
                             break;
                         }
                     }
                 }
             }

             if (!find) {
                 // 检查是否到达容器底部
                 if (endTag) {
                     if (findView(endTag, { maxStep: 2 }).length > 0) {
                         console.log('找到结束Tag:' + endTag + ", 退出");
                         break;
                     }
                 }

                 // 检查是否达到最大连续滑动次数
                 if (scrollCount >= maxConsecutiveScrollCount) {
                     console.log('超过最大连续滑动次数,认为已经到达底部,退出');
                     break;
                  }
                 console.log('没找到有效的目标item,滑动');
                 scroll('up', { afterWait: 1000 });
                 ++scrollCount;
             } else {
                 scrollCount = 0;
              }
         } else {
             console.log('没找到容器,退出');
             break;
         }
     }
}

function main() {
    // 启动拼多多APP
    if (1 != launchApp('com.xunmeng.pinduoduo')) {
        console.error('启动拼多多失败');
        return;
    }
    console.log('启动拼多多成功');

    // 等待进入首页或个人中心
    var ret = findView('txt:首页|txt:个人中心', {maxStep: 10});
    if (ret.length <= 0) {
        console.error('未找到首页或个人中心,可能未成功进入拼多多');
        return;
    }
    console.log('成功进入拼多多');

    // 点击拍照搜索控件左边50像素位置
    ret = findView('txt:拍照搜索@cn:android.widget.ImageView');
    if (ret.length <= 0) {
        console.error('未找到拍照搜索控件');
        return;
    }
    var view = ret.views[0];
    // 点击控件左边50像素位置
    gestureClick(view.left - 50, view.top + view.height / 2, {afterWait: 1000});

    // 等待进入含有EditText的页面
    ret = findView('cn:android.widget.EditText', {maxStep: 10});
    if (ret.length <= 0) {
        console.error('未进入搜索页面');
        return;
    }
    console.log('进入搜索页面');

    // 在EditText中输入"手机"
    paste('cn:android.widget.EditText', '手机', {afterWait: 1000});

    // 点击搜索按钮
    click('txt:搜索', {click: true, afterWait: 2000});

    // 等待进入搜索结果页面
    ret = findView('id:com.xunmeng.pinduoduo:id/tv_title', {maxStep: 10});
    if (ret.length <= 0) {
        console.error('未进入搜索结果页面');
        return;
    }
    console.log('进入搜索结果页面');

    // 循环处理搜索结果
    _loopDeal(getContainer, getTitle, task, {backTag:'txt:拍照搜索'});
}

// 弹窗处理
function e1() {
    var ret = findView('txt:取消|txt:关闭|id:com.xunmeng.pinduoduo:id/close', {maxStep: 1});
    if (ret.length > 0) {
        click(ret.views[0], {click: true});
        sleep(500);
    }
}

function getContainer() {
    return findView('id:com.xunmeng.pinduoduo:id/tv_title', {flag: 'find_all', failed: e1}).views;
}

function getTitle(item) {
    return item.text;
}

function task(item) {
    // 点击控件进入详情页
    if (!switchPage(item, 'txt:客服', {failed: e1}).length > 0) {
        console.log('进入详情页失败');
        return false;
    }
    console.log('进入详情页');

    // 查找"进店"控件,最多滚动5次
    var scrollCount = 0;
    var ret;
    while (scrollCount < 5) {
        ret = findView('txt:进店', {maxStep: 2});
        if (ret.length > 0) {
            console.log('找到进店控件');
            // 获取family为[0, 2, 1, 1]的控件文本
            var targetView = ret.views[0].family([0, 2, 1, 1]);
            if (targetView) {
                console.log('目标控件文本:', targetView.text);
            }
            break;
        }
        console.log('未找到进店控件,向上滚动');
        scroll('up', {afterWait: 1000});
        scrollCount++;
    }

    if (scrollCount >= 5) {
        console.log('滚动5次后仍未找到进店控件');
    }

    return true;
}

四、调试运行

直接在左上脚点击"调试运行",即可执行脚本,在执行的过程中,左下角会有对应的log,可以通过log大概看到脚本执行的情况。详细如下图所示。

相关推荐
IT成长日记3 分钟前
【自动化运维神器Ansible】Playbook调用Role详解:从入门到精通
运维·自动化·ansible·playbook·role
Codebee4 分钟前
用原生AI-IDE快速搞定OneCode视图注解:AI与注解驱动开发的完美结合
人工智能·低代码
aneasystone本尊4 分钟前
GraphRAG 快速入门
人工智能
用户5191495848458 分钟前
TypeScript Record类型完全指南:从基础到高级应用
人工智能·aigc
skywalk81639 分钟前
设计简洁的Ansible:目前非常流行的开源配置管理和自动化工具
开源·自动化·ansible
大志说编程10 分钟前
LangChain框架入门18: 十分钟带你搞定LLM工具调用
python·langchain·ai编程
2401_8315017310 分钟前
Linux之Ansible自动化运维(二)
运维·自动化·ansible
pwj去战斗吧12 分钟前
一、部署LNMP
linux·运维
听风.82514 分钟前
机器学习6
人工智能·机器学习·概率论
钢铁男儿22 分钟前
使用 TensorBoardX 实现 PyTorch 神经网络可视化:从入门到进阶
人工智能·pytorch·神经网络