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大概看到脚本执行的情况。详细如下图所示。
