说明

本文提供的代码仅供参考。不建议用于生产环境。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

推荐教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发视频教程(HD超清1080p)

开发文档

Auto.js Pro开发文档
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

示例代码

/*** QQ跳码注册陌陌稳定版* auth:ydy*/
auto();//开启无障碍模式
var y = 1058//设置滑动按钮高度
//Q跳注册陌陌
websever = 'http://39.96.39.174';
let qqhao;
let qqpwd;
let imgname;
let shebeiinfo;
let imei ;
let sousuozhanghao = http.get(websever+'/api/index/getmomo').body.string()
//此代码由飞云脚本圈整理提供(www.feiyunjs.com)
main();
//主程序
function main(){while(true){openwuji();//打开无极sleep(2000)//打开沙盒if(openshahe()==false){continue;}sleep(1000);if( gaiji()==false){//修改机型continue;}sleep(1000);clearQQ();//清除QQ数据if(run_qq()==false){continue ;}sleep(2000)//第二次打开if(openshahe()==false){continue;}sleep(1000);cleraMM();sleep(2000);//打开陌陌if(run_momo()==false){continue;}sleep(3000)}
}function run_momo(){try{id("appIcon").waitFor();//等待出现id("appIcon").find()[1].click();text('输入手机号码').waitFor()sleep(2000);click(472,1625);text('QQ登录').waitFor();if(text('授权并登录').exists()||text('登录').exists()){className('android.widget.Button').click()sleep(8000);if(text('下一步').exists()){toastLog('进入填写陌陌资料');sleep(2000)click(90,672);opention_birth();click(204,891)//选择性别text('下一步').waitFor();sleep(2000);click(text("下一步").findOne().bounds().centerX(),text("下一步").findOne().bounds().centerY())}else{toastLog('QQ号:'+qqhao+',已注册过陌陌');return false;}}sleep(3000)text('绑定手机').waitFor();text('跳过').click()sleep(3000);if(text('跳过').exists()){text('跳过').click();}sleep(2000)if(text('消息').exists()){click(text('消息').findOne().bounds().centerX(),text('消息').findOne().bounds().centerY());sleep(5000)click(text('搜索').findOne().bounds().centerX(),text('搜索').findOne().bounds().centerY());toastLog('搜索用户组')Text(sousuozhanghao);sleep(5000)click(138,387)//点击搜索用户组toastLog('查找用户:'+sousuozhanghao)sleep(10000)back()//返回上一级sleep(5000)//在返回上一级back()//sleep(5000)click(text('更多').findOne().bounds().centerX(),text('更多').findOne().bounds().centerY())sleep(5000)//编辑个人资料text('查看或编辑个人资料').waitFor();click(text('查看或编辑个人资料').findOne().bounds().centerX(),text('查看或编辑个人资料').findOne().bounds().centerY())text('资料').waitFor();//等待资料出现click(text('资料').findOne().bounds().centerX(),text('资料').findOne().bounds().centerY())//上滑swipe(500,1000,500,0,1000)    sleep(3000)momozhanghao =  className('android.widget.TextView').find()[19].text().split(":")[1]toastLog('陌陌账号为:'+momozhanghao)sleep(2000)back();sleep(2000)swipe(500,1000,500,0,1000)sleep(2000)text('设置').waitFor();click(text('设置').findOne().bounds().centerX(),text('设置').findOne().bounds().centerY())sleep(2000)text('设置').waitFor();click(42,300)//点击账号与安全sleep(5000)text('密码修改').waitFor();click(text('密码修改').findOne().bounds().centerX(),text('密码修改').findOne().bounds().centerY());sleep(3000)text('设置密码').waitFor();if(className('android.widget.EditText').find().size()==3){back();//返回上一级;sleep(2000)back();click(text('密码修改').findOne().bounds().centerX(),text('密码修改').findOne().bounds().centerY());}//获取密码url = websever+'/api/index/setpwd';res = http.get(url);pwd = res.body.string()Text(pwd)//重复密码sleep(5000)click(30,519);Text(pwd);goback_http = momozhanghao+'|'+pwd;toastLog(goback_http);sleep(5000)//点击修改click(text('修改').findOne().bounds().centerX(),text('修改').findOne().bounds().centerY())//回传致服务器http.get(websever+'/api/index/fanhui?goback_http='+goback_http+'&name=yushenggongzuoshi&jx='+shebeiinfo+'&imei='+imei)sleep(3000)click(756,1002)}else{return false;}}catch(e){return false;}
}//QQ登陆
function run_qq(){try{id("appIcon").waitFor();//等待出现id("appIcon").find()[0].click();text('登 录').waitFor()//QQ出现登陆text('登 录').click();//获取服务器账号密码while(getqq_number()==0){toastLog('服务器上暂无可用的QQ号');sleep(3000);getqq_number()}text('QQ号/手机号/邮箱').waitFor();text('QQ号/手机号/邮箱').click();Text(qqhao)sleep(3000)desc('密码 安全').click()//点击密码栏Text(qqpwd)sleep(3000);text('登 录').click()sleep(10000);if(text('拖动下方滑块完成拼图').exists()){text('拖动下方滑块完成拼图').waitFor();toastLog('开始滑块');sleep(3000)if(!requestScreenCapture()) {alert("请求截图权限失败!");exit();}if(!start()){//如果滑块未成功请手动滑块}sleep(3000)while(text('拖动下方滑块完成拼图').exists()){//没有跳过滑块sleep(3000);toastLog('请手动完成本次滑块操作');}if(text('确定').exists()){text('确定').click();sleep(1000)text('登 录').click()sleep(10000)text('拖动下方滑块完成拼图').waitFor();if(!requestScreenCapture()) {alert("请求截图权限失败!");exit();}while(!start()){}//滑块致完工sleep(5000)while(text('拖动下方滑块完成拼图').exists()){//没有跳过滑块sleep(3000);toastLog('请手动完成本次滑块操作');}}   }if(text('取消').exists()){text('取消').click();return false;}sleep(3000)if(text('绑定手机号码').exists()){text('绑定手机号码').waitFor();text('关闭').click();}sleep(3000)if(text('通讯录').exists()){text('通讯录').waitFor();text('关闭').click();}toastLog('进入QQ主界面;等待5秒上传照片');rand_img();sleep(5000);let qqimg = className('android.widget.FrameLayout').find()[7];click(qqimg.bounds().centerX(),qqimg.bounds().centerY())//点击侧边栏//等待出现click(className('android.widget.FrameLayout').find()[5].bounds().centerX(),className('android.widget.FrameLayout').find()[5].bounds().centerY());if(text('QQ身份证').exists()){text('QQ身份证') .waitFor();desc('关闭按钮').click();}//加载数据sleep(10000)text('编辑资料').waitFor();text('编辑资料').click();toastLog('进入编辑资料');sleep(3000)text('编辑资料').waitFor();//点击头像click(0,558);toastLog('进入头像挂件');//等待选项text('从相册选择图片').waitFor();Tap(0,1290)//点击从相册选择图片text('相册').waitFor();toastLog('默认选择第一张照片');click(className('android.widget.ImageView').find()[0].bounds().centerX(),className('android.widget.ImageView').find()[0].bounds().centerY());sleep(3000)text('完成').waitFor();text('完成').click();//删除下载图片toastLog('等待3秒,正在删除图片......')del_img();sleep(3000);text('头像挂件').waitFor();text('返回').click();sleep(3000)text('编辑资料').waitFor();click(885,className('android.widget.EditText').find()[0].bounds().centerY())toastLog("删除昵称")for(let t=10;t>0;t--){sleep(1000)KeyCode("KEYCODE_DEL")}sleep(8000)setClip(rand_name());className('android.widget.EditText').find()[0].paste()//返回保存sleep(2000)text('返回').click();//保存toastLog('QQ信息修改成功');sleep(2000)text('返回').click();//保存sleep(2000)text('设置').waitFor();click(60,1820)sleep(2000)text('设置').waitFor();click(text('帐号、设备安全').findOne().bounds().centerX(),text('帐号、设备安全').findOne().bounds().centerY())sleep(3000)//记住机型shebeiinfo = className('android.widget.TextView').find()[7].text();toastLog('机型:'+shebeiinfo);home();sleep(3000)}catch(e){return false;}
}//获取服务器女性名字
function rand_name(){let names = http.get(websever+'/api/index/getnames').body.string()return names;
}//设置陌陌生日
function opention_birth(){//后台设置year = http.get(websever+'/api/index/getyear')year = year.body.string()if(year<0){//从上往下滑for(let i = 1;i<=Math.abs(year);i++){swipe(300,760,300,900,2000)//年sleep(800)//log('当前年执行:'+i+'次')}}else{//从下往上滑for(let i = 1;i<=year;i++){swipe(300,900,300,760,2000)//年sleep(800)//log('当前年执行:'+i+'次')}}sleep(1000)month = http.get(websever+'/api/index/getmonth')month = month.body.string()for(let i = 1;i<=(13-Math.abs(month));i++){swipe(554,769,550,769,2000)//月sleep(800)//log('当前月执行:'+i+'次')}sleep(1000)day = http.get(websever+'/api/index/getday')day = day.body.string()for(let i = 1;i<=(31-Math.abs(day));i++){swipe(750,767,700,767,500)//日sleep(800)//log('当前日执行:'+i+'次')}sleep(1000)click(750,1260)//点击确定sleep(1000)
}//打开沙盒
function openshahe(){app.launch("com.dobe.sandbox");sleep(2000)if(text('机智沙盒').exists()){toastLog('打开沙盒')return true}else{return false}}//一键vpn
function yjvpn(){app.launch("com.leteng.ltproxy");toastLog('正在换ip中,请稍后');sleep(5000);id('bt_change_ip').click();sleep(15000)toastLog('ip更换成功')
}//一键新机
function gaiji(){if(id("download_device").exists()){sleep(2000)id("download_device").findOne().click()sleep(2000)if(className('android.widget.TextView').find()[2].text()=='修改设备'){var xiugaishebei = className('android.widget.TextView').find()[2];click(xiugaishebei.bounds().centerX(), xiugaishebei.bounds().centerY());sleep(2000)if(className("android.widget.Button").exists()){className("android.widget.Button").findOne().click();className("android.widget.TextView").indexInParent(4).waitFor();//等待控件出现toastLog('修改设备成功')sleep(1000);back();sleep(1000);back();sleep(1000)}else{toastLog('修改设备失败');return false;}}}//二次清机sleep(2000)if(id("download_device").exists()){sleep(2000)id("download_device").findOne().click()sleep(2000)if(className('android.widget.TextView').find()[2].text()=='修改设备'){var xiugaishebei = className('android.widget.TextView').find()[2];click(xiugaishebei.bounds().centerX(), xiugaishebei.bounds().centerY());sleep(2000)if(className("android.widget.Button").exists()){className("android.widget.Button").findOne().click();//等待控件出现toastLog('修改设备成功')className("android.widget.TextView").indexInParent(4).waitFor();sleep(3000)imei = className('android.widget.TextView').find()[2].text();toastLog('设备号:'+imei);sleep(1000);back();sleep(1000);back();sleep(1000)}}}
}//点击momo上角的三个点--清除数据
function cleraMM(){ id("context_menu").find()[1].click()id("kill").waitFor();//点击关闭进程id("kill").findOne().click();id("btnPositive").waitFor();id("btnPositive").findOne().click();sleep(5000)id("context_menu").find()[1].click()id("wipe").waitFor();id("wipe").findOne().click();id("btnPositive").waitFor();id("btnPositive").findOne().click();toastLog('陌陌数据清理');sleep(2000);
}//清除QQ上角的三个点--清楚数据
function clearQQ(){id("context_menu").find()[0].click()id("kill").waitFor();//点击关闭进程id("kill").findOne().click();id("btnPositive").waitFor();id("btnPositive").findOne().click();toastLog('QQ进程关闭');sleep(5000)id("context_menu").find()[0].click()id("wipe").waitFor();id("wipe").findOne().click();id("btnPositive").waitFor();id("btnPositive").findOne().click();toastLog('QQ数据清理');sleep(2000);
}
//切换无极vpn
function openwuji(){app.launch("org.wuji");sleep(2000)click(500,1350);sleep(3000)
}//获取服务器QQ号码
function getqq_number(){let url = websever+'/api/index/getqq';let res = http.get(url).body.string()if(res!=0){qqhao =res.split('|')[0];qqpwd =res.split('|')[1];return true;}else{//log('服务器暂无可使用的QQ号');return false;}}function discernSlidingblock(img, ratio) {//创建识别变量var temp, temp2, x, y, num, color, p, temp3, arr1;//分析设备分辨率if (ratio == 720) {var tb = [348, 253, 691, 638, 81]log("您的设备分辨率为:720p");} else if (ratio == 1080) {var tb = [463, 387, 912, 831, 125]log("您的设备分辨率为:1080p");} else {log("当前设备分辨率不符合规范")return -2}num = Math.ceil(tb[4] / 3.3 - 4);//计算滑块位置for (var k = 29; k <= 40; k++) {temp2 = "";color = "#" + k + "" + k + "" + k + "";for (var i = 1; i <= num; i++) {temp2 = temp2 + "0|" + i + "|" + color + ",";temp2 = temp2 + i + "|0|" + color + ",";temp2 = temp2 + "1|" + i + "|" + color + ",";temp2 = temp2 + i + "|1|" + color + ",";temp2 = temp2 + "2|" + i + "|" + color + ",";temp2 = temp2 + i + "|2|" + color + ",";}x = 0;while (x > -2) {y = 0;while (y > -2) {temp = "";for (var i = 1; i <= num; i += 2) {temp = temp + "0|" + (tb[4] + y - i - 1) + "|" + color + ",";temp = temp + (tb[4] + x) + "|" + i + "|" + color + ",";temp = temp + (tb[4] + x) + "|" + (tb[4] + y - i - 1) + "|" + color + ",";temp = temp + (tb[4] + x - i - 1) + "|0|" + color + ",";temp = temp + i + "|" + (tb[4] + y) + "|" + color + ",";temp = temp + (tb[4] + x - i - 1) + "|" + (tb[4] + y) + "|" + color + ",";temp = temp + "1|" + (tb[4] + y - i - 1) + "|" + color + ",";temp = temp + (tb[4] + x - 1) + "|" + i + "|" + color + ",";temp = temp + (tb[4] + x - 1) + "|" + (tb[4] + y - i - 1) + "|" + color + ",";temp = temp + (tb[4] + x - i - 1) + "|1|" + color + ",";temp = temp + i + "|" + (tb[4] + y - 1) + "|" + color + ",";temp = temp + (tb[4] + x - i - 1) + "|" + (tb[4] + y - 1) + "|" + color + ",";}temp = temp + temp2 + "0|0|" + color;arr1 = temp.split(",");var arr2 = new Array();for (var i = 0; i < arr1.length - 1; i++) {arr2[i] = new Array();temp3 = arr1[i].split("|");arr2[i] = [Number(temp3[0]), Number(temp3[1]), temp3[2]];}try {p = images.findMultiColors(img, color, arr2, {region: [tb[0], tb[1], tb[2] - tb[0], tb[3] - tb[1]],threshold: (Math.floor(k / 10) * 16 + k % 10)});if (p) {img.recycle();return p.x}} catch (error) {//出错console.log("识别失败,错误原因:" + error);return -1;}y = --y;}x = --x;}}try {img.recycle();} catch (error) {console.log("识别失败,错误原因:" + error);}return -1;
}function start() {for(var i=0;i<0;i++){sleep(1000);log(i);}while (true) {img = images.captureScreen();if (img) {log("截图成功。进行识别滑块!");break;} else {log('截图失败,重新截图');}}var x = discernSlidingblock(img, device.width) + 65console.info("识别结果滑块X坐标:" + x);if (x > -1) {randomSwipe(220, y, x, y)return true;} else {return false;console.log("识别有误,请确认是否在滑块界面");}
}function bezierCreate(x1,y1,x2,y2,x3,y3,x4,y4){//构建参数var h=100;var cp=[{x:x1,y:y1+h},{x:x2,y:y2+h},{x:x3,y:y3+h},{x:x4,y:y4+h}];var numberOfPoints = 100;var curve = [];var dt = 1.0 / (numberOfPoints - 1);//计算轨迹for (var i = 0; i < numberOfPoints; i++){var ax, bx, cx;var ay, by, cy;var tSquared, tCubed;var result_x, result_y;cx = 3.0 * (cp[1].x - cp[0].x);bx = 3.0 * (cp[2].x - cp[1].x) - cx;ax = cp[3].x - cp[0].x - cx - bx;cy = 3.0 * (cp[1].y - cp[0].y);by = 3.0 * (cp[2].y - cp[1].y) - cy;ay = cp[3].y - cp[0].y - cy - by;var t=dt*itSquared = t * t;tCubed = tSquared * t;result_x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;result_y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;curve[i] = {x: result_x,y: result_y};}//轨迹转路数组var array=[];for (var i = 0;i<curve.length; i++) {try {var j = (i < 100) ? i : (199 - i);xx = parseInt(curve[j].x)yy = parseInt(Math.abs(100 - curve[j].y))} catch (e) {break}array.push([xx, yy])}return array
}/*** 真人模拟滑动函数* * 传入值:起点终点坐标* 效果:模拟真人滑动*/
function randomSwipe(sx,sy,ex,ey){//设置随机滑动时长范围var timeMin=1000var timeMax=3000//设置控制点极限距离var leaveHeightLength=500//根据偏差距离,应用不同的随机方式if(Math.abs(ex-sx)>Math.abs(ey-sy)){var my=(sy+ey)/2var y2=my+random(0,leaveHeightLength)var y3=my-random(0,leaveHeightLength)var lx=(sx-ex)/3if(lx<0){lx=-lx}var x2=sx+lx/2+random(0,lx)var x3=sx+lx+lx/2+random(0,lx)}else{var mx=(sx+ex)/2var y2=mx+random(0,leaveHeightLength)var y3=mx-random(0,leaveHeightLength)var ly=(sy-ey)/3if(ly<0){ly=-ly}var y2=sy+ly/2+random(0,ly)var y3=sy+ly+ly/2+random(0,ly)}//获取运行轨迹,及参数var time=[0,random(timeMin,timeMax)]var track=bezierCreate(sx,sy,x2,y2,x3,y3,ex,ey)log("随机控制点A坐标:"+x2+","+y2)log("随机控制点B坐标:"+x3+","+y3)log("随机滑动时长:"+time[1])//滑动gestures(time.concat(track))
}function rand_img(){//从服务器上下载图片let tx = http.get(websever + "/system/index/return_tx").body.string();var url =websever+tx;//保存到路径/sdcard/auto.js.pngthreads.start(function(){imgname = (new Date).getTime();if(url){files.writeBytes("/sdcard/" + imgname+".jpg", http.get(url).body.bytes());media.scanFile("/sdcard/" + imgname+".jpg");toast("图片上传成功!");}});
}//删除文件
function del_img(){
url= "/sdcard/" + imgname+".jpg";
threads.start(function(){
if (files.remove(url)){
log('图片删除成功')
}else{
log('图片删除失败')
}
})
}

auto.js Pro编写的QQ跳码注册陌陌稳定版脚本源代码,免root运行相关推荐

  1. 【autojs】Auto.js Pro安卓QQ语音红包秒抢挂免费脚本源码

    //此代码由飞云脚本圈整理提供(www.feiyunjs.com) importPackage(android.speech.tts); importClass(java.util.Locale); ...

  2. Auto.js Pro 调起APP并跳转至指定页面

    本文仅供学习交流使用,如侵立删 效果: 环境: VS Code Auto.js Pro 7.0.4 雷电4 模拟器 跳转 function openjd() {app.startAcvity({pac ...

  3. autojs入门视频教程,Auto.js Pro安卓全分辨率免ROOT引流脚本开发零基础到进阶教程,飞云脚本学院2019年全力打造高清品质,不容错过的年度大作

    课程大纲(更新中-) 基础课程 [已完成]01安装Visual Studio Code(时长9分33秒)在线观看 [已完成]02安装Auto.js Pro(时长5分48秒)在线观看 [已完成]03解读 ...

  4. autojs零基础入门视频教程,跟我学Auto.js Pro安卓免ROOT引流脚本开发教程,飞云脚本学院2019最新录制

    课程大纲(更新中-) 基础课程 [已完成]01安装Visual Studio Code(时长9分33秒)在线观看 [已完成]02安装Auto.js Pro(时长5分48秒)在线观看 [已完成]03解读 ...

  5. Auto.js Pro安卓免ROOT引流脚本开发系列教程23网易公开课(1)-前言

    APP名称 网易公开课 APP版本 安卓客户端:v6.8.1 APP简介 网易公开课提供来自世界一流名校和著名机构的上万集精品视频课程,涵盖各类热门领域,与Web版保持同步更新.速度流畅,画面高清.支 ...

  6. 基于PaddleOCR开发Auto.js Pro文字识别插件

    目录 目的 准备工作 插件开发 1.项目结构对比 2.插件SDK集成 3.调整assets资源 4.删除无用的Activity文件 5.修改AndroidManifest.xml 6.修改Predic ...

  7. 微信批量删除朋友圈脚本,使用auto.js编写的免root运行

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  8. Auto.js Pro 8.4.10 免登陆解除限制版本

    主要改动: 1.在官方基础上支持x86 32位的模拟器运行 Auto.js Pro 8.4.10的官方版本,只有arm64的lib库,不支持我去广告版的雷电模拟器的7.0系统,于是就是找了个v7a的库 ...

  9. Auto.js Pro如何连接VS Code插件

    由于Auto.js Pro的插件更新,原插件使用方式已经不适合新插件,现推出此教程. 准备Auto.js Pro 你首先需要一个Auto.js Pro.Pro是付费软件,如果你还没购买,请访问 htt ...

最新文章

  1. 查看Linux系统软硬件信息
  2. VMWARE错误-VirtualInfrastructure.Utils.ClientsXml的类型初始值设定项引发异常
  3. java数据库设计工具_Java课程设计---创建数据库工具类
  4. Mac与Phy组成原理的简单分析
  5. Jquery自定义分页插件
  6. 基于 Kata Containers 与 iSulad 的云容器实践解析
  7. mutations vuex 调用_Vuex源码解析
  8. 赛锐信息:SAP安全漏洞审计及工具介绍
  9. MySQL Enterprise Monitor架构图
  10. 导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数
  11. Android跑马灯进度条,table数据跑马灯效果
  12. SharePoint is Dying
  13. NC 主子表增加页签
  14. Exsel 设置固定表头
  15. 面试官系列 - LeetCode链表知识点题型总结
  16. MySQL中幻读现象
  17. J0ker的CISSP之路:复习-Access Control(4)
  18. 利用公式计算π=4(1-1/3+1/5-1/7+1/9-...)的近似值,直到括号中最后一项的绝对值小于0.000001为止
  19. 刘备和诸葛亮闹翻:无意说出蜀国灭亡的根源?
  20. python怎么判断倍数_检查整数及其两倍数是否存在 python3

热门文章

  1. Task 3: Subword Models (附代码)(Stanford CS224N NLP with Deep Learning Winter 2019)
  2. 一个方便的图片加载框架——ImageViewEx
  3. kubernetes中infra容器的理解
  4. 《杰克韦尔奇自传》读后感
  5. 远程诊断DoIP(笔记二)概念
  6. 图片单张预测和批量预测
  7. 超模脸、网红脸、萌娃脸...换头像不重样?我开源了5款人脸生成器
  8. V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动
  9. lrs_save_searched_string
  10. 常用网址-2023整理