"ui"; var 配置 = storages.create("DSJL"); var version = 4.1; //版本号 ui.layout( <ScrollView> <vertical> <appbar> <toolbar id="bt" title="抖商精灵" /> </appbar> <Switch id="autoService" text="无障碍服务" checked="{{auto.service != null}}" padding="8 8 8 8" textSize="15sp" /> <horizontal> <text text=" 抖音客户端:" gravity="left" /> <spinner id="khd" entries="抖音短视频|抖音极速版" /> </horizontal> <horizontal> <text text=" 运行总时间:" gravity="left" /> <input id="yhsc" hint="时间(分钟)" textSize="15sp" inputType="number" gravity="center" /> <text text=" 喜欢概率:" gravity="left" /> <input id="xhgl" hint="喜欢概率" textSize="15sp" inputType="number" gravity="center" /> </horizontal> <horizontal> <text text=" 浏览作品时间:" gravity="left" /> <input id="jg" hint="最小值" textSize="15sp" inputType="number" gravity="center" /> <text text="----" gravity="center" /> <input id="jg1" hint="最大值" textSize="15sp" inputType="number" gravity="center" /> <text text=" 秒" gravity="left" /> </horizontal> <horizontal> <text text=" 作品关键词:" gravity="left" /> <input id="key" hint="务必填写,不填写无法运行!" textSize="15sp" /> </horizontal> <text text=" 温馨提示:" gravity="left" /> <text text=" 1.软件根据关键词识别作品是否浏览;" gravity="left" /> <text text=" 2.关键词尽量精准,才能使账号更加垂直;" gravity="left" /> <text text=" 3.可设置多个关键词,分隔符“,”;" gravity="left" /> <text text=" 4.例如:剪辑,影视,观影,60帧等;" gravity="left" /> <text text=" 5.关键词尽可能多而精准;" gravity="left" /> <horizontal> <text text=" 系统提示:" gravity="left" /> <checkbox id="支持" text="本软件无需root权限。" checked="true" /> </horizontal> <horizontal> <text id="ver" text=" 当前软件版本: " gravity="left" /> <text id="安卓版本" textSize="15sp" /> </horizontal> <horizontal> <button id="start" text="开始运行" layout_weight="1" style="Widget.AppCompat.Button.Colored" /> </horizontal> </vertical> </ScrollView> ); ui.安卓版本.text(" 本机安卓版本:" + device.release + ""); ui.ver.text(" 当前软件版本:" + version + " "); ui.bt.title = "抖商精灵 V" + version; ui.autoService.on("check", function (checked) { if (checked && auto.service == null) { app.startActivity({ action: "android.settings.ACCESSIBILITY_SETTINGS" }); } if (!checked && auto.service != null) { auto.service.disableSelf(); } }); var 悬块 = function (window, view) { if (!window || !view) { throw "缺参数"; }; this.x = 0, this.y = 0; this.windowX, this.windowY; this.downTime = 500; this.Timeout = 0; this.Click = function () { }; this.LongClick = function () { }; this.setClick = function (fun) { //判断参数类型是否为函数? if (typeof fun == "function") { this.Click = fun; }; }; this.setLongClick = function (fun, ji) { //判断参数类型是否为函数? if (typeof fun == "function") { this.LongClick = fun; //判断参数是否可为设置数字? if (parseInt(ji) <= 1000) { this.downTime = parseInt(ji); }; }; }; view.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => { switch (event.getAction()) { //按下事件。 case event.ACTION_DOWN: //按下记录各种坐标数据。 this.x = event.getRawX(); this.y = event.getRawY(); this.windowX = window.getX(); this.windowY = window.getY(); //创建一个定时器用来定时执行长按操作。 this.Timeout = setTimeout(() => { this.LongClick(); this.Timeout = 0; }, this.downTime); return true; //移动事件。 case event.ACTION_MOVE: //移动距离过大则判断为移动状态 // if (Math.abs(event.getRawY() - this.y) > 5 && Math.abs(event.getRawX() - this.x) > 5) { // //移动状态清除定时器 // if (this.Timeout) { // //定时器存在则清除定时器。 // clearTimeout(this.Timeout); // this.Timeout = 0; // }; // //移动手指时调整悬浮窗位置 // window.setPosition(this.windowX + (event.getRawX() - this.x), this.windowY + (event.getRawY() - this.y)); // }; return true; //抬起事件。 case event.ACTION_UP: if (this.Timeout) { clearTimeout(this.Timeout); this.Timeout = 0; this.Click(); }; return true; }; return true; })); }; var startime = Date.parse(new Date()); var 点赞数量 = 0; var 浏览数量 = 0; readconfig();//读取配置 ui.start.on("click", function () { //程序开始运行之前判断无障碍服务 if (auto.service == null) { toast("请先开启无障碍服务!"); return; } saveconfig();//保存配置 xf();//悬浮窗 抖音();//主线程 }); function 抖音() { 主线程 = threads.start(function () { console.setTitle("抖商"); console.show(); ts("执行操作:脚本开始运行"); gjcjc(); 返回首页(); sleep(1000); _养号() }) } function xf() { var thread = threads.start(function op() { var window = floaty.window( // <button id="but" w="35" h="60" text="停止" /> <button id="but" text="stop" /> // <img id="but" src="file://stop1.png" /> ); window.setPosition(10, device.height / 3) setInterval(() => { }, 500); var ad = new 悬块(window, window.but); ad.setLongClick(function () { var yxtime = (Date.parse(new Date()) - startime) / 1000; yxtime = formatSeconds(yxtime); log("提示:用户停止运行"); log("时间提示:运行" + yxtime); log("浏览作品:" + 浏览数量); log("点赞作品:" + 点赞数量); exit(); }); ad.setClick(function () { var yxtime = (Date.parse(new Date()) - startime) / 1000; yxtime = formatSeconds(yxtime); log("提示:用户停止运行"); log("时间提示:运行" + yxtime); log("浏览作品:" + 浏览数量); log("点赞作品:" + 点赞数量); exit(); }) }) //创建一个新的悬浮控制模块 ad 并带入参数(所要控制的悬浮窗和用来控制悬浮窗移动的控件)。 } function gjcjc() { var keyword = ui.key.text(); var str = keyword.split(','); if (str.length <= 1) { var str = keyword.split(','); } log("关键词数量:" + str.length); for (k = 0; k < str.length; k++) { log("关键词" + (k + 1) + ":" + str[k]); } } function saveconfig() { 配置.put("xhgl", ui.xhgl.text()); 配置.put("jg", ui.jg.text()); 配置.put("jg1", ui.jg1.text()); 配置.put("key", ui.key.text()); 配置.put("yhsc", ui.yhsc.text()); 配置.put("支持", ui.支持.checked); 配置.put("khd", ui.khd.getSelectedItemPosition()); } function readconfig() { ui.xhgl.text(配置.get("xhgl", "60")); ui.jg.text(配置.get("jg", "20")); ui.jg1.text(配置.get("jg1", "45")); ui.yhsc.text(配置.get("yhsc", "30")); ui.支持.checked = Boolean(配置.get("支持", true)); ui.key.text(配置.get("key", "")); if (parseInt(配置.get("khd", ""))) { ui.khd.setSelection(parseInt(配置.get("khd", ""))); }; } function _视频检测() { var h = device.height; var keyword = ui.key.text(); var jstime = new Date().getTime(); if (!text("推荐").visibleToUser().exists()) { 返回首页(); } if (text("评论并转发").visibleToUser().exists()) { back(); sleep(1000); } var uc = textMatches("......*").visibleToUser().boundsInside(0, device.height / 2, device.width, device.height).find(); for (i = 0; i < uc.length; i++) { if (uc[i].text() == "点击进入直播间") { log("直播中,自动跳过"); log("检测耗时:" + (new Date().getTime() - jstime) + "毫秒"); return false; } } for (i = 0; i < uc.length; i++) { if (uc[i].text().indexOf("[t]") != -1) { log("广告作品,自动跳过"); log("检测耗时:" + (new Date().getTime() - jstime) + "毫秒"); return false; } } for (i = 0; i < uc.length; i++) { var str = keyword.split(','); if (str.length <= 1) { var str = keyword.split(','); } for (k = 0; k < str.length; k++) { if (uc[i].text().indexOf(str[k]) != -1) { log("检测成功,视频符合"); 浏览数量 = 浏览数量 + 1; log(uc[i].text()); log("关键词:" + str[k]); log("检测耗时:" + (new Date().getTime() - jstime) + "毫秒"); return true; } } } log("跳过!当前视频不包含关键词"); log("检测耗时:" + (new Date().getTime() - jstime) + "毫秒"); return false; } function _养号() { var W = device.width; var H = device.height; var mt = Date.parse(new Date()); 返回首页(); if (配置.get("key", "") == "") { ts("系统提示:没有添加关键词。"); ts("系统提示:请添加后重试!"); exit(); } while (true) { if (_视频检测()) { var sj = random(parseInt(ui.jg.text()), parseInt(ui.jg1.text())); if (!isNaN(sj)) { ts("浏览时间:" + sj + "秒"); sleep(sj * 1000); } else { ts("浏览时间:15秒"); sleep(15 * 1000); } var sjs = random(1, 100); if (parseInt(ui.xhgl.text()) > sjs) { click(W / 2, H / 2); sleep(50); click(W / 2, H / 2); sleep(1000); 点赞数量 = 点赞数量 + 1; log("系统提示:点赞数量:" + 点赞数量); // if (sjs > 39) { // 评论(); // } } }; swipe(W / 2, H * 4 / 5, W / 2, H / 6, random(300, 1000)); sleep(random(500, 2000)); if (textMatches("编辑资料.*|.*更多主播").exists()) { 返回首页(); }; if (!text("推荐").visibleToUser().exists()) { 返回首页(); } if (text("评论并转发").visibleToUser().exists()) { back(); sleep(1000); } if (Date.parse(new Date()) - mt > 1000 * 60 * parseInt(配置.get("yhsc", ""))) { ts("系统提示:养号结束。"); var yxtime = (Date.parse(new Date()) - startime) / 1000; yxtime = formatSeconds(yxtime); log("时间提示:运行" + yxtime); log("浏览作品:" + 浏览数量); log("点赞作品:" + 点赞数量); return; } _弹窗(); sleep(100); } }; function _弹窗() { if (text("我知道了").exists()) { text("我知道了").findOne().click(); } if (text("允许").exists()) { text("允许").findOne().click(); } if (text("取消").exists()) { text("取消").findOne().click(); } if (text("以后再说").exists()) { text("以后再说").findOne().click(); } if (text("继续播放").exists()) { text("继续播放").findOne().click(); } if (text("好的").exists()) { text("好的").findOne().click(); } } function _判断是否登录() { 返回首页(); while (true) { _弹窗() if (text("我").exists()) { var b = text("我").findOne().bounds(); if (b) { click(b.centerX(), b.centerY()); sleep(1000); }; }; if (text("编辑资料").exists() || text("分享主页").exists() || text("编辑企业资料").exists()) { ts("操作提示:账号已登录") return true; }; if (text("密码登录").exists()) { ts("操作提示:账号未登录"); return false; }; if (text("您的收藏在这里").exists()) { back(); sleep(1000); }; sleep(100); } }; function 返回首页() { if (parseInt(配置.get("khd", "")) == 1) { app.startActivity({ action: "android.intent.action.VIEW", data: "snssdk2329://feed" }); } else { app.startActivity({ action: "android.intent.action.VIEW", data: "snssdk1128://feed" }); } sleep(100); } function ts(text) { log(text) } function formatSeconds(value) { var secondTime = parseInt(value);// 秒 var minuteTime = 0;// 分 var hourTime = 0;// 小时 if (secondTime > 60) { minuteTime = parseInt(secondTime / 60); secondTime = parseInt(secondTime % 60); if (minuteTime > 60) { hourTime = parseInt(minuteTime / 60); minuteTime = parseInt(minuteTime % 60); } } var result = "" + parseInt(secondTime) + "秒"; if (minuteTime > 0) { result = "" + parseInt(minuteTime) + "分" + result; } if (hourTime > 0) { result = "" + parseInt(hourTime) + "小时" + result; } return result; } function download(url, filePath) { importClass('java.io.FileOutputStream'); importClass('java.io.IOException'); importClass('java.io.InputStream'); importClass('java.net.MalformedURLException'); importClass('java.net.URL'); importClass('java.net.URLConnection'); importClass('java.util.ArrayList'); var url = new URL(url); var conn = url.openConnection(); //URLConnection var inStream = conn.getInputStream(); //InputStream var fs = new FileOutputStream(filePath); //FileOutputStream var connLength = conn.getContentLength(); //int var buffer = util.java.array('byte', 1024); //byte[] var byteSum = 0; //总共读取的文件大小 var byteRead; //每次读取的byte数 // log('要下载的文件大小='); // log(connLength); var threadId = threads.start(function () { while (1) { var 当前写入的文件大小 = byteSum; var progress = (当前写入的文件大小 / connLength) * 100; if (progress > 0.1) { //var progress = parseInt(progress).toString() + '%'; // ui.run(function () { // w.progressNum.setText(progress); // }); if (当前写入的文件大小 >= connLength) { break; } } sleep(1000); } }); while ((byteRead = inStream.read(buffer)) != -1) { byteSum += byteRead; //当前时间 currentTime = java.lang.System.currentTimeMillis(); fs.write(buffer, 0, byteRead); //读取 } threadId && threadId.isAlive() && threadId.interrupt(); } function 评论() { if (descStartsWith("评论").exists()) { var uc = descStartsWith("评论").find(); for (i = 0; i < uc.length; i++) { if (uc[i].bounds().centerX() > 0 && uc[i].bounds().centerY() > 0 && uc[i].bounds().centerY() < device.height) { uc[i].click(); //click(uc[i].bounds().centerX(), uc[i].bounds().centerY()) sleep(2000); break; } } } if (textStartsWith("留下你的精彩评论").exists()) { if (!desc("[呲牙]").exists()) { log("操作提示:浏览评论"); var a = ""; var uc1 = textMatches(".+分.*钟.*前.*|.*小时前").visibleToUser(true).findOne(1000) if (uc1) { a = uc1.text(); a = a.replace(/[0-9]/ig, ""); a = 取文本左边(a, "前"); } var num = random(2, 4) for (i = 0; i < num; i++) { var sjs = random(2, 5); swipe(device.width / 2, device.height - 260, device.width / 2, device.height / sjs, random(500, 2000)) var sj = random(3, 7); sleep(sj * 1000); } if (uc1) { if (textStartsWith("留下你的精彩评论").exists()) { textStartsWith("留下你的精彩评论").findOne().click(); sleep(1000); if (setText(a)) { sleep(1000); } if (desc("表情").exists()) { var td = desc("表情").findOne().bounds(); click(td.right + 40, td.centerY()); sleep(2000); log("操作提示:评论内容:" + a); } } } var num = random(2, 4) for (i = 0; i < num; i++) { var sjs = random(2, 5); swipe(device.width / 2, device.height - 260, device.width / 2, device.height / sjs, random(500, 2000)) var sj = random(3, 7); sleep(sj * 1000); } } else { back(); sleep(2000); } back(); sleep(2000); } app.startActivity({ action: "android.intent.action.VIEW", data: "snssdk1128://feed" }); sleep(1000); } function 取文本左边(str, a) //取文本的中间值 { var w1 = str.indexOf(a); if (w1 < 0) { return false; }; return str.substr(0, w1 - a.length - 2); } function sjstr(str) //返回一个随机值,分隔符, { if (str) { strnum = str.split(","); if (strnum.length <= 1) { var strnum = str.split(','); } var sjz = random(0, parseInt(strnum.length) - 1); return strnum[sjz]; } }