基于Auto.js一键京东自动退货脚本
## 声明此脚本只用于读者学习使用,禁止用于非法用途。
## 环境
app | 版本
-------- | -----
Autojs| 4.1.1 Alpha
京东| 11.3.6
# 源码
```javascript
// 悬浮窗按钮 run.js
var path = "./jd.js";
if (!files.exists(path)) {
toast("脚本文件不存在: " + path);
exit();
}
var window = floaty.window(
<frame>
<button id="action" text="开始运行" textColor="#ffffff" w="90" h="40" bg="#77ff0000"/>
</frame>
);
setInterval(() => {}, 1000);
var execution = null;
//记录按键被按下时的触摸坐标
var x = 0,
y = 0;
//记录按键被按下时的悬浮窗位置
var windowX, windowY;
//记录按键被按下的时间以便判断长按等动作
var downTime;
window.action.setOnTouchListener(function(view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN:
x = event.getRawX();
y = event.getRawY();
windowX = window.getX();
windowY = window.getY();
downTime = new Date().getTime();
return true;
case event.ACTION_MOVE:
//移动手指时调整悬浮窗位置
window.setPosition(windowX + (event.getRawX() - x),
windowY + (event.getRawY() - y));
//如果按下的时间超过1.5秒判断为长按,退出脚本
if (new Date().getTime() - downTime > 1500) {
exit();
}
return true;
case event.ACTION_UP:
//手指弹起时如果偏移很小则判断为点击
if (Math.abs(event.getRawY() - y) < 5 && Math.abs(event.getRawX() - x) < 5) {
onClick();
}
return true;
}
return true;
});
function onClick() {
if (window.action.getText() == '开始运行') {
execution = engines.execScriptFile(path);
window.action.setText('停止运行');
} else {
if (execution) {
execution.getEngine().forceStop();
}
window.action.setText('开始运行');
}
}
```
```javascript
/*
* @Author: bowyn
* @Date: 2022-12-08 19:46:23
* @LastEditTime: 2022-12-08 19:53:19
* @Description: 京东自动退货
*/
console.log("Hello, Auto.js Pro!");
main()
function main() {
toast("开始运行京东脚本")
var 继续时间 = 1000; var 退货理由 = false;
var afters = className("android.widget.TextView").desc("退换或售后").findOne(500);
if (afters != null && afters.bounds().centerX() > 1) {
click(afters.bounds().centerX(), afters.bounds().centerY()); sleep(2000); 继续时间 = 5000;
} else { 继续时间 = 1000; }
let i = 1;
while(true){
run();toastLog("售后申请:"+ (i++) + "次");sleep(1000);
}
}
function run(){
var shsqbtn = className("android.view.ViewGroup").desc("售后申请按钮").findOne(500);
if (shsqbtn != null && shsqbtn.bounds().centerX() > 1) {
click(shsqbtn.bounds().centerX(), shsqbtn.bounds().centerY()); sleep(2000); 继续时间 = 5000;
} else { 继续时间 = 1000; }
var sh = className("android.view.ViewGroup").desc("申请售后按钮").findOne(500);
if (sh != null && sh.bounds().centerX() > 1) {
click(sh.bounds().centerX(), sh.bounds().centerY()); sleep(2000); 继续时间 = 5000;
} else { 继续时间 = 1000; }
var hh = className("android.widget.TextView").text("选择售后类型").findOne(继续时间);
if (hh != null) {
var th = className("android.widget.TextView").text("退货").findOne(继续时间);
if (th != null && th.bounds().centerX() > 1) {
click(th.bounds().centerX(), th.bounds().centerY()); sleep(3000); 继续时间 = 3000;
} else { 继续时间 = 1000; }
}
for (var i = 0; i < 继续时间 / 1000; i++) {
var wt = className("android.widget.TextView").text("7天无理由").findOne(2000);
if (wt != null && wt.bounds().centerX() > 1) {
click(wt.bounds().centerX(), wt.bounds().centerY()); sleep(2000); 继续时间 = 5000; break;
} else {
wt = className("android.widget.TextView").text("商品破损/包装问题").findOne(500);
if (wt != null && wt.bounds().centerX() > 1) {
click(wt.bounds().centerX(), wt.bounds().centerY()); sleep(2000); 继续时间 = 3000; break;
}
}
sleep(1000);
}
var sv = className("android.widget.TextView").text("申请数量").findOne(继续时间);
if (sv != null && className("android.widget.EditText").text("0").exists()) {
className("android.widget.EditText").text("0").findOne().setText("1"); 继续时间 = 5000; sleep(500);
} else { 继续时间 = 1000; }
if (className("android.widget.TextView").text("商品状态").exists()) {
var sh = className("android.widget.TextView").text("未破损").findOne(3000);
if (wt != null && wt.bounds().centerX() > 1) {
click(sh.bounds().centerX() - 70, sh.bounds().centerY()); sleep(500);
}
}
for (var i = 0; i < 继续时间 / 1000; i++) {
var yy = className("android.widget.TextView").text("买多").findOne(500);
if (yy != null && yy.bounds().centerX() > 1) {
click(yy.bounds().centerX(), yy.bounds().centerY());
sleep(500); swipe(500, 1670, 500, 100, 1000); sleep(1000); break;
} else {
yy = className("android.widget.TextView").text("包装简陋").findOne(500);
if (yy != null && yy.bounds().centerX() > 1) {
click(yy.bounds().centerX(), yy.bounds().centerY());
sleep(500); swipe(500, 1670, 500, 100, 1000); sleep(1000); break;
} else {
yy = className("android.widget.TextView").text("款式不合适").findOne(500);
if (yy != null && yy.bounds().centerX() > 1) {
click(yy.bounds().centerX(), yy.bounds().centerY());
sleep(500); swipe(500, 1670, 500, 100, 1000); sleep(1000); break;
}
}
}
sleep(1000);
}
if (className("android.widget.TextView").text("原支付返还").exists()) {
click(485, 1380); sleep(3000);
}
if (className("android.widget.TextView").text("地址管理").exists()) {
className("androidx.recyclerview.widget.RecyclerView").findOne().children().forEach(child => {
var target = child.findOne(desc("编辑"));
if(target!=null){
target.click();sleep(1000);
}
});
}
function 随机名字(长度) {
长度 = 长度 || 32;
var $chars = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经房裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄麴家封芮羿储靳汲邴糜松井段富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭厉戎祖武符刘景詹束龙叶幸司韶郜黎蓟薄印宿白怀蒲邰从鄂索咸籍赖卓蔺屠蒙池乔阴欎胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍舄璩桑桂濮牛寿通边扈燕冀郏浦尚农温别庄晏柴瞿阎充慕连茹习宦艾鱼容向古易慎戈廖庾终暨居衡步都耿满弘匡国文寇广禄阙东殴殳沃利蔚越夔隆师巩厍聂晁勾敖融冷訾辛阚那简饶空曾毋沙乜养鞠须丰巢关蒯相查後荆红游竺权逯盖益桓公万俟司马上官欧阳夏侯诸葛闻人东方赫连皇甫尉迟公羊澹台公冶宗政濮阳淳于单于太叔申屠公孙仲孙轩辕令狐钟离宇文长孙慕容鲜于闾丘司徒司空亓官司寇仉督子车颛孙端木巫马公西漆雕乐正壤驷公良拓跋夹谷宰父谷梁晋楚闫法汝鄢涂钦段干百里东郭南门呼延归海羊舌微生岳帅缑亢况后有琴梁丘左丘东门西门商牟佘佴伯赏南宫墨哈谯笪年爱阳佟第五言福百家姓终'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
var maxPos = $chars.length;
var pwd = '';
for (i = 0; i < 长度; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
function 修改编辑(){
var 本次名字 = 随机名字(3)
editable().findOne().setText(本次名字); sleep(1000);
var 本次手机 = "140" + Math.random().toString().slice(4, 12)
editable().textContains("****").findOne().setText(本次手机); sleep(1000);
/* 随机地址
let szdq = editable(false).depth(3).indexInParent(1).findOne()
if (szdq != null && szdq.bounds().centerX() > 1) {
click(szdq.bounds().centerX(), szdq.bounds().centerY()); sleep(2000); 继续时间 = 5000;
} else { 继续时间 = 1000; }
id('fo').findOne().click(); sleep(1000);
click(1031,RandomNumBoth(1204,2100));sleep(500);
while(className("android.widget.TextView").text("请选择所在地区").exists()){
click(500,RandomNumBoth(1204,2100))
sleep(500)
}
editable().depth(2).indexInParent(8).findOne().setText(随机名字(10))
*/
click("保存"); sleep(2000);
}
var 修改地址 = false; 继续时间 = 1000;
if (className("android.widget.TextView").text("编辑收货地址").exists()) {
try {
修改编辑()
} catch (error) {
toastLog(error)
}
}
if (className("android.widget.TextView").text("地址管理").exists()) {
let a = className("androidx.recyclerview.widget.RecyclerView").findOne().children()
let xz = a.findOne(depth(2));
xz.click();sleep(1000); // 返回
}
if (className("android.widget.TextView").text("退货").exists()) {
let tj = className("android.widget.TextView").text("提交").findOne();
if (tj != null && tj.bounds().centerX() > 1) {
click(tj.bounds().centerX(), tj.bounds().centerY()); sleep(2000); 继续时间 = 5000;
} else { 继续时间 = 1000; }
}
className("android.widget.TextView").text("好的,我知道了").findOne().click(); sleep(2000);
back()
}
// 随机数
function RandomNumBoth(Min,Max){
var Range = Max - Min;
var Rand = Math.random();
var num = Min + Math.round(Rand * Range); //四舍五入
return num;
}
``` 感谢分享!只是很奇怪为啥需要这样的功能{:1_904:} 孤狼微博 发表于 2022-12-12 11:46
为什么要退,羊毛吗
我也不太清楚 xiaoan87 发表于 2022-12-12 11:35
不是 没明白退货一键式 是为什么
有人定做的,后面失联了 不是 没明白退货一键式 是为什么 为什么要退,羊毛吗 搞不懂为啥要一键退货 感谢楼主分享 哈哈自动退货的用途是什么 8970665 发表于 2022-12-12 13:44
哈哈自动退货的用途是什么
应该是商家需要的