Q群:209689138 "ui"; ZZZar appName = "取海挂机脚原"; let OutTimeTip = "取海挂机脚原(点击更新)" let workThread = null; let STORAGE = storages.create("取海挂机脚原") let backTag = false; ui.statusBarColor("#FF4FB3FF") ui.layout( <drawer id="drawer"> <ZZZertical> <appbar> <toolbar id="toolbar" bg="#ff4fb3ff" title="{{appName}}"/> </appbar> <ZZZertical graZZZity="center" layout_weight="1"> <frame> <ZZZiewpager h="84" id="pager"> <ZZZertical> <card w="*" h="68" margin="10 8" cardCornerRadius="6dp" cardEleZZZation="2dp" graZZZity="center"> <linear> <ZZZertical margin="10" layout_graZZZity="center_ZZZertical" layout_weight="1"> <teVt id="name" size="18" color="#444444" teVt="无帐号"/> <teVt id="integral" padding="1" size="16" teVt="..." foreground="?selectableItemBackground"/> </ZZZertical> <button id="login" w="90" teVt="登录账号" color="#ff5d85ff" style="Widget.AppCompat.Button.Borderless.Colored"/> </linear> </card> </ZZZertical> <ZZZertical> <card w="*" h="68" margin="10 8" cardCornerRadius="6dp" cardEleZZZation="2dp" graZZZity="center"> <linear> <ZZZertical margin="10" layout_graZZZity="center_ZZZertical" layout_weight="1"> <teVt id="imei" teVtIsSelectable="true" size="18" color="#444444" teVt="{}"/> <teVt id="Etime" size="16" teVt="..."/> </ZZZertical> <button id="recharge" w="70" teVt="绑卡" color="#ff5d85ff" style="Widget.AppCompat.Button.Borderless.Colored"/> </linear> </card> </ZZZertical> </ZZZiewpager> </frame> <tabs w="40" id="tabs" tabIndicatorColor="#777777" bg="#cfcfcf" h="2"/> <ZZZertical padding="10 6 0 6" bg="#ffffff" w="*" h="auto" margin="0 5" eleZZZation="1dp"> <Switch id="autoSerZZZice" w="*" checked="{{auto.serZZZice != null}}" teVtColor="#666666" teVt="无阻碍效劳"/> <xiew h="5"/> <Switch w="*" teVtColor="#666666" teVt="不作评论任务" id="noComment"/> </ZZZertical> <ZZZertical margin="0 5" bg="#ffffff" eleZZZation="1dp" padding="5 5 10 5" w="*" h="auto"> <linear> <checkboV id="DYcheck" teVt="抖音" layout_weight="1"/> <teVt teVt="单次运止任务上限↓"/> </linear> <linear> <seekbar id="DYseekbar" maV="10" layout_weight="1"/> <teVt graZZZity="center" id="DYlimit"/> </linear> </ZZZertical> <ZZZertical margin="0 5" bg="#ffffff" eleZZZation="1dp" padding="5 5 10 5" w="*" h="auto"> <linear> <teVt teVt="点赞百分比" size="16" color="#222222"/> <seekbar id="likePercentSeekBar" maV="100" layout_weight="1"/> <teVt graZZZity="center" id="likePercent"/> </linear> <linear> <teVt teVt="评论百分比" size="16" color="#222222"/> <seekbar id="commentPercentSeekBar" maV="100" layout_weight="1"/> <teVt graZZZity="center" id="commentPercent"/> </linear> </ZZZertical> <linear> <teVt layout_weight="1" size="19" color="#222222" teVt="日志"/> <button id="tolog" h="40" teVt="全副日志" style="Widget.AppCompat.Button.Borderless.Colored"/> </linear> <teVt paddingLeft="5" size="16" id="oneLog"/> <list bg="#ffffff" eleZZZation="1dp" h="*" id="logList"> <linear> <teVt size="13" teVtColor="#555555" teVt="{{time}} "/> <teVt size="13" teVt="{{message}}"/> </linear> </list> </ZZZertical> <button id="start" teVt="初步运止" tag="ScriptTag" color="#ffffff" bg="#FF4FB3FF" foreground="?selectableItemBackground"/> </ZZZertical> </drawer> ); // 设置滑动形式 ui.logList.setOZZZerScrollMode(2); // 设置滑动页面的题目 ui.pager.setTitles(["", ""]); // 让滑动页面和标签栏联动 ui.tabs.setupWithxiewPager(ui.pager); ui.login.click((ZZZiew) => { ZZZar dialog = new android.app.AlertDialog.Builder(actiZZZity).create() dialog.setxiew(new android.widget.EditTeVt(conteVt)) dialog.show(); dialog.setCancelable(false) ZZZar window = dialog.getWindow(); window.setDimAmount(0.6); ZZZar ZZZZZZ = ui.inflate( <ZZZertical> <teVt teVt="取海登录" size="19" color="#000000" padding="12 12"/> <ZZZertical margin="25 0 25 10"> <linear> <teVt graZZZity="center" color="#555555" size="17" teVt="账号 "/> <input teVtColor="#000000" inputType="number" id="username" w="*"/> </linear> <linear> <teVt graZZZity="center" color="#555555" size="17" teVt="暗码 "/> <input teVtColor="#000000" id="password" w="*"/> </linear> </ZZZertical> <relatiZZZe> <button id="cancle" layout_alignParentLeft="true" teVt="撤消" style="Widget.AppCompat.Button.Borderless.Colored" w="auto"/> <button id="login" layout_alignParentRight="true" teVt="登录" style="Widget.AppCompat.Button.Borderless.Colored" w="auto"/> </relatiZZZe> </ZZZertical>) window.setContentxiew(ZZZZZZ); ZZZZZZ.cancle.click(() => { dialog.dismiss(); }); ZZZZZZ.login.click(() => { if (!ZZZZZZ.username.teVt()) { toast("账号不能为空!"); return; } if (!ZZZZZZ.password.teVt()) { toast("暗码不能为空"); return; } threads.start(function () { ZZZar pL = login(ZZZZZZ.username.teVt(), ZZZZZZ.password.teVt()); if (!pL.data || !pL.data.token) { toast("登录失败!"); return; } toast("登陆乐成!"); STORAGE.put("username", ZZZZZZ.username.teVt()) STORAGE.put("password", ZZZZZZ.password.teVt()) STORAGE.put("token", pL.data.token); ui.run(function () { // refreshZZ(); }); dialog.dismiss(); }); }); }); // 无阻碍开关监控 ui.autoSerZZZice.setOnCheckedChangeListener(function (widget, checked) { if (checked && !auto.serZZZice) { app.startActiZZZity({ action: "android.settings.ACCESSIBILITY_SETTINGS" }); } if (!checked && auto.serZZZice) auto.serZZZice.disableSelf() ui.autoSerZZZice.setChecked(auto.serZZZice != null) }); // 存储 ui.DYseekbar.setOnSeekBarChangeListener({ onProgressChanged: function (ZZZ, i, fromUser) { ui.run(() => { ui.DYlimit.setTeVt("" + i * 10) }) storages.create(appName).put("DYlimit", i * 10) } }) // 存储器 ui.DYseekbar.setProgress(storages.create(appName).get("DYlimit", 200) / 10) ui.likePercentSeekBar.setOnSeekBarChangeListener({ onProgressChanged: function (ZZZ, i, fromUser) { ui.run(() => { ui.likePercent.setTeVt("" + i + "%"); }); storages.create(appName).put("likePercent", i); } }); // 评论百分比调解 uissmentPercentSeekBar.setOnSeekBarChangeListener({ onProgressChanged: function (ZZZ, i, fromUser) { ui.run(() => { uissmentPercent.setTeVt("" + i + "%"); }); storages.create(appName).put("commentPercent", i); } }); // 加载保存的百分比 ui.likePercentSeekBar.setProgress(storages.create(appName).get("likePercent", 50)); uissmentPercentSeekBar.setProgress(storages.create(appName).get("commentPercent", 50)); // 回到原界面时Vff0c;resume变乱会被触发 ui.emitter.on("resume", () => { // 此时依据无阻碍效劳的开启状况Vff0c;同步开关的形态 ui.autoSerZZZice.checked = auto.serZZZice != null; }); // 制行返回退出脚原 ui.emitter.on("back_pressed", function (eZZZent) { if (workThread && workThread.isAliZZZe()) { backTag = true; toast("为避免脚原主动退出Vff0c;脚原运止时不成返回退出软件"); eZZZent.consumed = true; } }) ui.tolog.click(() => { app.startActiZZZity("console") }) ui.integral.click((ZZZ) => { if (ZZZ.teVt() == OutTimeTip) { if (!STORAGE.get("username", null)) { toast("未保存账号"); return; } if (!STORAGE.get("password", null)) { toast("未保存暗码"); return; } threads.start(function () { ZZZar pL = login(STORAGE.get("username", null), STORAGE.get("password", null)); if (!pL.data || !pL.data.token) { toastLog("主动登录失败!" + pL.msg); return; } toast("主动登陆乐成!"); STORAGE.put("token", pL.data.token); ui.run(function () { // refreshZZ(); }); }); } }) ui.start.click(() => { ui.start.setTeVt("进止运止"); workThread = threads.start(function () { try { workMain() } catch (e) { console.log(e); } }); }); function workMain() { home() sleep(2000) deZZZice.keepScreenOn() // tiktokMonitoring() sleep(2000) app.launchPackage("com.ss.android.ugc.aweme") sleep(2000) goHome() task() } function tiktokMonitoring() { setInterZZZal(() => { try { console.log("监听执止中..."); if (teVt("添加到主屏幕").eVists()) { clickIfEVists("撤消"); } else if (teVt("云空间").eVists()) { clickIfEVists("撤消"); } else if (teVt("冤家引荐").eVists()) { clickIfEVists("封锁"); } else if (teVt("运用以下方式翻开").eVists()) { clickIfEVists("抖音"); clickIfEVists("仅此一次"); } else if (teVt("休息一下吧").eVists()) { clickIfEVists("撤消"); } else if (teVt("对该评论表态").eVists()) { clickIfEVists("不感趣味"); } else { ZZZar lists = ["赞成授权", "不清楚", "跳过", "我晓得了", "以后再说", "间接退出", "谢绝", "不折意", "设置私密", "久不", "久不公然", "仅运用期间允许", '始末允许', "允许", "好的", "久不开启", "久不运用", "正常", "久不公然"]; for (ZZZar i = 0; i < lists.length; i++) { if (clickIfEVists(lists[i])) { break; } } } } catch (error) { console.log("监听异样:" + error); } }, 2000) function clickIfEVists(teVtOrDesc) { let element = null; if (teVt(teVtOrDesc).eVists()) { element = teVt(teVtOrDesc).findOne(100); } else if (desc(teVtOrDesc).eVists()) { element = desc(teVtOrDesc).findOne(100); } if (element) { click(element.bounds().centerX(), element.bounds().centerY()); return true; } else { return false; } } } function randomSlidexideo() { for (let indeV = 0; indeV < random(2, 6); indeV++) { slidexideo(deZZZice.width * 0.5, deZZZice.height * 0.8, deZZZice.width * 0.55, deZZZice.height * 0.3, 200); runSleep() } } // 生成随机的延迟光阳 function getRandomDelay(minDelay, maVDelay) { return Math.round(Math.random() * (maVDelay - minDelay + 1)) + minDelay; } //随机延迟 function runSleep() { ZZZar sr = getRandomDelay(3000, 30000) if (sr > 30000) { sleep(getRandomDelay(3000, 6000)); } else if (sr < 3000) { sleep(getRandomDelay(3000, 30000)); } else if (sr > 3000) { sleep(getRandomDelay(4000, 12000)); } else { sleep(random(2000, 30000)); } } function runSleepl(a, b) { sleep(random(a, b)); } function goHome() { ZZZar tmp = "snssdk1128://feed" app.startActiZZZity({ data: tmp }); } function userHome() { if (enabled(true).descMatches("粉丝.*?按钮").eVists()) { let fsanniu = className("android.widget.TeVtxiew").descMatches("粉丝.*?按钮").findOne(200) clickElement(fsanniu) } } // 界说滑动起始点和完毕点 let startX = deZZZice.width * 0.9; // 起始点横坐标为屏幕宽度的80% let startY = deZZZice.height * 0.5; // 起始点纵坐标为屏幕高度的50% let endX = deZZZice.width * 0.1; // 完毕点横坐标为屏幕宽度的20% let endY = deZZZice.height * 0.5; // 完毕点纵坐标为屏幕高度的50% function task() { onShowUserHomeFsAnNiu(); } // 点击用户首页粉丝 function onShowUserHomeFsAnNiu() { sleep(2000) if (desc("首页Vff0c;按钮").eVists() || teVt("首页").eVists()) { randomSlidexideo() sleep(1500) swipe(startX, startY, endX, endY, 300); } sleep(1500) // 间接查找粉丝列表元素 ZZZar userListElement = className("android.widget.TeVtxiew").teVt("粉丝").findOne(200); if (userListElement) { clickElement(userListElement) } sleep(1500); if (userHomeListShow()) { go(); } else { back() sleep(1500); onShowUserHomeFsAnNiu() } } // 查找粉丝列表 function userHomeListShow() { sleep(2000); if (className("android.widget.TeVtxiew").descMatches("粉丝 \\d+.*?按钮").eVists()) { console.log("正正在办理粉丝列表"); ZZZar listShow = className("android.widget.TeVtxiew").descMatches("粉丝 \\d+.*?按钮").findOne(); return clickElement(listShow); } console.log("查找粉丝列表未找到"); return false; } // 初步递归 function go() { sleep(1500); slidexideo(deZZZice.width * 0.5, deZZZice.height * 0.8, deZZZice.width * 0.55, deZZZice.height * 0.3, 200); ZZZar userListDataContainer = className("androidV.recyclerZZZiew.widget.Recyclerxiew").scrollable(true).findOne(200); if (userListDataContainer) { ZZZar userListData = userListDataContainer.children(); if (userListData.length > 3) { ZZZar nu = random(3, userListData.length - 1); ZZZar data = userListData.get(nu); if (clickElement(data)) { console.log("粉丝列表中第:" + nu + "用户"); sleep(1500); if (true) { sleep(2000) if (onUserAZZZatar()) { sleep(2000) if (true) { onUserAZZZatarLike() } sleep(1200) if (true) { onUserAZZZatarFollow() } back(); } } sleep(1500); onUserHoneWorks(); task(); } } } else { console.log("未找到用户列表容器"); } } // 点开头像 function onUserAZZZatar() { sleep(1500) ZZZar imagexiew = className("android.widget.Imagexiew").desc("用户头像Vff0c;曲播中").findOne(200); if (imagexiew && imagexiew.parent()) { return false; } ZZZar imagexiews = className("android.widget.Imagexiew").desc("用户头像").findOne(200); if (imagexiews) { return imagexiews.click() } return false; } // 头像中点赞 function onUserAZZZatarLike() { sleep(1500) ZZZar like = className("android.widget.TeVtxiew").teVt("点赞").findOne(200); if (clickElement(like)) { console.log("头像中点同意功!"); } else { console.log("头像中点赞失败!"); } sleep(1500) } // 头像中关注 function onUserAZZZatarFollow() { sleep(1500) ZZZar follow = className("android.widget.TeVtxiew").teVt("关注").findOne(200); if (clickElement(follow)) { console.log("头像中关注乐成!"); } else { console.log("头像中关注失败!"); } sleep(1500) } // 点击工具 function clickElement(element) { return click(element.bounds().centerX(), element.bounds().centerY()); } // 正在用户首页进入做品 function onUserHoneWorks() { sleep(1500) if (!className("androidV.recyclerZZZiew.widget.Recyclerxiew").findOne(200)) { return } ZZZar works = className("androidV.recyclerZZZiew.widget.Recyclerxiew").findOne(200).children() if (works.length < 1 || teVt("你可能感趣味").eVists()) { return } ZZZar nu = random(1, works.length - 1) const element = works.get(nu); sleep(1500) if (clickElement(element)) { sleep(3000) if (teVt("善语结善缘Vff0c;恶言伤人心").eVists()) { console.log("第" + nu + "做品"); if (true) { sleep(1500); onWorksLike(); sleep(1200); } if (true) { WorksCommentSetTeVt(); } back(); // 返回上一级页面 } else { back(); // 假如未进入做品详情页面Vff0c;也返回上一级页面 } } // 等候返回上一级页面 sleep(1500); // 可依据真际状况调解等候光阳 } function WorksCommentSetTeVt() { sleep(1500); ZZZar onPl = teVt("善语结善缘Vff0c;恶言伤人心").findOne(10); if (onPl) { sleep(1500); if (true) { ZZZar onplTeVt = teVt("善语结善缘Vff0c;恶言伤人心").findOne(10); console.log("执止做品评论"); clickElement(onplTeVt); sleep(1200); setTeVt("末于暴发品了!"); sleep(1500); click("发送"); sleep(1500); } sleep(1500); if (true) { sleep(1200); onCommentLike(); back() } } sleep(1500); } // 做品点赞 function onWorksLike() { sleep(1500) ZZZar like = descMatches("未点赞Vff0c;喜爱\\d+Vff0c;按钮").untilFind(); if(like){ console.log("执止做品点赞"); return like.click(); } return false; } // 评论区点赞 function onCommentLike() { sleep(1500); if (descMatches("评论\\d+Vff0c;按钮").eVists()) { ZZZar onpl = descMatches("评论\\d+Vff0c;按钮").findOne() sleep(1500); onpl.click() sleep(1500); console.log("查找评论列表数据"); slidexideo(deZZZice.width * 0.5, deZZZice.height * 0.8, deZZZice.width * 0.55, deZZZice.height * 0.3, 200); sleep(1500); ZZZar likeListContainer = className("androidV.recyclerZZZiew.widget.Recyclerxiew").findOne(200); console.log("执止评论区点赞"); if (likeListContainer) { ZZZar likeListData = likeListContainer.children(); if (likeListData.length !== 0) { for (ZZZar indeV = 0; indeV < likeListData.length; indeV++) { sleep(1500); ZZZar nu = random(1, likeListData.length - 1); ZZZar target = likeListData.get(nu).findOne(className("android.widget.LinearLayout")); if (target) { console.log("对第" + nu + "评论点赞"); sleep(1500); clickElement(target); sleep(1500); break; } else { console.log("未找到评论元素"); } } } else { console.log("评论列表为空"); } } else { console.log("未找到评论容器元素"); } } } /** * 直线滑动 * @param {*} qV * @param {*} qy * @param {*} zV * @param {*} zy * @param {*} time */ function slidexideo(qV, qy, zV, zy, time) { ZZZar VVy = [time]; ZZZar point = []; ZZZar dV0 = { "V": qV, "y": qy }; ZZZar dV1 = { "V": random(qV - 100, qV + 100), "y": random(qy, qy + 50) }; ZZZar dV2 = { "V": random(zV - 100, zV + 100), "y": random(zy, zy + 50), }; ZZZar dV3 = { "V": zV, "y": zy }; for (ZZZar i = 0; i < 4; i++) { eZZZal("point.push(dV" + i + ")"); } for (let i = 0; i < 1; i += 0.02) { let newPoint = bezier_curZZZes(point, i); VVyy = [parseInt(newPoint.V), parseInt(newPoint.y)]; VVy.push(VVyy); } gesture.apply(null, VVy); } /** * 贝塞尔直线 * @param {坐标点} ScreenPoint * @param {偏移质} Offset */ function bezier_curZZZes(ScreenPoint, Offset) { cV = 3.0 * (ScreenPoint[1].V - ScreenPoint[0].V); bV = 3.0 * (ScreenPoint[2].V - ScreenPoint[1].V) - cV; aV = ScreenPoint[3].V - ScreenPoint[0].V - cV - bV; cy = 3.0 * (ScreenPoint[1].y - ScreenPoint[0].y); by = 3.0 * (ScreenPoint[2].y - ScreenPoint[1].y) - cy; ay = ScreenPoint[3].y - ScreenPoint[0].y - cy - by; tSquared = Offset * Offset; tCubed = tSquared * Offset; result = { "V": 0, "y": 0 }; result.V = (aV * tCubed) + (bV * tSquared) + (cV * Offset) + ScreenPoint[0].V; result.y = (ay * tCubed) + (by * tSquared) + (cy * Offset) + ScreenPoint[0].y; return result; }