AutoJs|Autojs7实戦---薅羊毛时间版APK

薅羊毛时间版APK下载地址:薅羊毛时间版_v0.0.40.apk - 蓝奏云
薅羊毛时间版源代码下载地址:薅羊毛时间版源码.rar - 蓝奏云


薅羊毛时间表顾名思义就是支持时间账号,可以进行时间付费,也可以购买永久账号,这个是次要的。主要的是此版本的APP支持【领宝箱、做任务、清缓、签到、提现和评论】每个APP的功能是不一样的。就按照下面的目录讲解吧!
一、功能区域
二、框架描述
三、资费介绍
四、其他介绍

一、功能区域
目前薅羊毛的APP大概有这多么(不能写名称你们懂得)
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

先放个提现图给大家过过瘾再加之增加信心。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

金额都不大,0.3元和0.2元的。每个机器都不大一样我有个机器稍微少点。强调一下现在虽然是薅羊毛的后时代但是依然可以薅羊毛,主要是技术和被薅羊毛的APP版本。无障碍、adb、root都已经出现很多问题。协议成本又太高….难道没有办法了吗?我都提现了不可能没办法的,采用APP的历史版本,当然APP得允许使用和提现。不废话上图。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

我已经提供app的下载,大家安装后下载就可以了。这个版本的薅羊毛必须使用内置提供的APP
用某APP(实际名称会被封杀)举例说明下功能。
筷子,有图有真相
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

来点实际的东西
关注一个用户

function 关注1个用户() { let returnValue = https://www.it610.com/article/adenTools.getBusinessInfo(appName,"关注1个用户") if (returnValue) { if (returnValue =https://www.it610.com/article/= adenTools.getDate()) { toastLog("关注1个用户任务已经完成...") return } } toastLog("关注1个用户任务") if (clickRedPacket()) { adenTools.sleepRandom3() adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() if (text("关注1个用户").exists()) { if (adenTools.clickControlBounds(text("关注1个用户"))) { adenTools.sleepRandom1() if (adenTools.clickControlBounds(text("关注"))) { adenTools.sleepRandom1() back() adenTools.sleepRandom1() adenTools.clickControlBounds(text("领金币")) adenTools.sleepRandom1() adenTools.clickControlBounds(text("知道了")) adenTools.recordBusinessInfo(appName, "关注1个用户") //到这里应该是提现成功 back() } } } }}

评论1个作品
function 评论1个作品() { let returnValue = https://www.it610.com/article/adenTools.getBusinessInfo(appName,"评论1个作品") if (returnValue) { if (returnValue =https://www.it610.com/article/= adenTools.getDate()) { toastLog("评论1个作品任务已经完成...") return } } toastLog("start评论1个作品任务") if (clickRedPacket()) { adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() if (text("评论1个作品").exists()) { if (adenTools.clickControlBounds(text("评论1个作品"))) { adenTools.sleepRandom1() if (adenTools.clickControlBounds(id("subject_layout"))) { adenTools.sleepRandom1() adenTools.sleepRandom1() adenTools.sleepRandom1() let little_image_array = adenTools.buildImageArray("评论", "./Image/快手", 6); if (adenTools.clickAreaForFindImage(little_image_array)) { let comment = adenComment.CommentKeyWord[Math.floor(Math.random() * adenComment.CommentKeyWord.length)]; adenTools.sleepRandom1() if (adenTools.clickControlBounds(text("发条有爱评论~"))) { adenTools.sleepRandom1() setText(0, comment); adenTools.sleepRandom1() if (adenTools.clickControlBounds(text("发送"))) { toastLog("自动评论成功") if (!adenTools.clickControlBounds(id("comment_header_close"))) { back(); } adenTools.sleepRandom1() back() adenTools.sleepRandom1() if (clickRedPacket()) { adenTools.sleepRandom1() adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() adenTools.sleepRandom1() adenTools.swipeDown() adenTools.clickControlBounds(text("领金币")) adenTools.sleepRandom1() adenTools.clickControlBounds(text("知道了")) adenTools.recordBusinessInfo(appName, "评论1个作品") //到这里应该是提现成功 back() adenTools.sleepRandom1() } } } } else { if (clickRedPacket()) { } }} } } } }


筷子极速版吧大家都知道筷子是啥意思。
  1. 自动阅读(基本功能)视频的下滑同时伴随着随机上滑、随机点赞、随机关注和随机评论。
  2. 每隔10分钟会执行一下领取宝箱动作、签到、关注等事件给大家放个图
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片
这些功能已经内置在各个APP上。大家不用单独设置。

  1. 大家最关注的就是自动TX,筷子极速版大额TX是要验证码的但是咱TX0.3的啊所以不用验证码。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

薅羊毛时间版APP本身其实有很多功能,大家可以参考薅羊毛专业版说明书看看APP功能。基本一样。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

二、框架描述
虽然偏技术但是也得提及,对咱技术人是个帮助,同时小弟也希望大神大咖们不要嘲笑我小弟再次谢过了。
核心技术改成了Autojs7因此支持找图操作。同时找图也有局限性我们技术人都知道的,找图是有分辨率限制的。此款APP是在1920*1080分辨率下截图和找图的因此非此分辨率是不支持的。但是我们技术人是可以修正,其实改改图就行。

进入正题我给大家放个项目截图:
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

Autojs7是支持项目的因此将各个页面分离不在出现万行代码。启动页面的引用。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

该项目基本的UI都已经写好了,例如:
  1. APP主界面
  2. 登录
  3. 注册
  4. 系统配置
  5. 个人页面
  6. 设备信息
  7. Flash页面
  8. 悬浮窗页面
详细的参考实际的项目吧。还有一些大方法如:
  1. 账号合法性检测
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

  1. App升级
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

  1. 检测网络
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

还有个大家都在苦找得JS页面通讯。Autojs多线程访问UI。
工具类里面也封装了很多使用的方法例如:
adenTools.clickAreaForFindImage多个小图联合找图(可以扩展成多分辨率找图)
/** * 找图,找到并点击 * @param {可以是数组也可以是字符串,传输数组可以多次找图知道找到为止} img_path_array * @param {找图区域,默认是全屏找图,该参数可以不传输} area_region * @param {相似度,默认是0.8,可以不传输} threshold * @returns true表示执行成功Flase表示失败 */ adenTools.clickAreaForFindImage=function(img_path_array, area_region, threshold,is_continue) { try { area_region = area_region || [0, 0, device.width, device.height] //默认的找图区域 全屏找图 前2位是坐标 后面是长度和宽度千万别理解成是坐标 threshold = threshold || 0.8 // 默认的相识度0.8 is_continue=is_continue|| false if (img_path_array instanceof Array) { let arrayLength = img_path_array.length for (let i = 0; i < arrayLength; i++) { //toastLog("正在进行第" + (i + 1) + "次找图...") img_path = img_path_array[i] //小图地址可判断是否存在 if (!files.exists(img_path)) { toastLog(img_path + "文件不存在因此跳过") continue } var little_image = images.read(img_path) //小图 var find_result_bounds = findImage( captureScreen(), little_image, { region: area_region, threshold: threshold }); if (find_result_bounds) { toastLog(img_path+"图找到,准备点击坐标:" + find_result_bounds) click(find_result_bounds.x, find_result_bounds.y) return true } else { //toastLog(img_path+"小图存在但是在大图中未找到图片进入下一次循环...") } } return false } if (typeof (img_path_array) == "string") { img_path = img_path_array//小图地址可判断是否存在 if (!files.exists(img_path)) { toastLog(img_path + "文件不存在因此跳过") return false } var little_image = images.read(img_path) //小图 var find_result_bounds = findImage( captureScreen(), little_image, { region: area_region, threshold: threshold }); if (find_result_bounds) { toastLog(img_path+"图找到,准备点击坐标:" + find_result_bounds) click(find_result_bounds.x, find_result_bounds.y) return true } else { //toastLog(img_path + "小图存在但是在大图中未找到图片") return false } } } catch (error) { toastLog("clickAreaForFindImage方法出现错误:" + error) return false; } }

adenTools.clickRegionForFindImage多个小图联合找图(可以扩展成多分辨率找图)
adenTools.clickRegionForFindImage=function(img_path_array, area_region, threshold,is_continue) { try { area_region = area_region || [0, 0, device.width, device.height] //默认的找图区域 全屏找图 前2位是坐标 后面是长度和宽度千万别理解成是坐标 threshold = threshold || 0.9 // 默认的相识度0.85 is_continue=is_continue|| false if (img_path_array instanceof Array) { let arrayLength = img_path_array.length for (let i = 0; i < arrayLength; i++) { img_path = img_path_array[i] //小图地址可判断是否存在 if (!files.exists(img_path)) { toastLog(img_path + "文件不存在因此跳过") continue } var little_image = images.read(img_path) //小图 var find_result_bounds = images.matchTemplate( captureScreen(), little_image, { region: area_region, threshold: threshold, max: 100 }); if (find_result_bounds) { find_result_bounds.matches.forEach(match => { log(img_path+"point = " + match.point + ", similarity = " + match.similarity); click(match.point.x, match.point.y) }); if(is_continue || is_continue=="true"){ continue; } return true } else { //toastLog(img_path + "小图存在但是在大图中未找到图片进入下一次循环...") } } return false } if (typeof (img_path_array) == "string") { img_path = img_path_array//小图地址可判断是否存在 if (!files.exists(img_path)) { toastLog(img_path + "文件不存在因此跳过") return false } var little_image = images.read(img_path) //小图 var find_result_bounds = images.matchTemplate( captureScreen(), little_image, { region: area_region, threshold: threshold, max: 100 }); toastLog(find_result_bounds) if (find_result_bounds) { //toastLog(img_path + "图找到,准备点击坐标:" + find_result_bounds) click(find_result_bounds.x, find_result_bounds.y) return true } else { //toastLog(img_path + "小图存在但是在大图中未找到图片") return false } } } catch (error) { toastLog("clickRegionForFindImage方法出现错误:" + error) return false; } }

adenTools.swipeFindElement滑动页面寻找元素或图片(可设置阈值)
adenTools.swipeFindElement=function(searchTimes, searchArray) { try { for (let i = 0; i < searchTimes; i++) { toastLog("第"+i+"次查找元素") let elementCoordinate = adenTools.findImageCoordinate(searchArray) if (elementCoordinate) {return elementCoordinate } else { adenTools.swipeDown() } } return null } catch (error) { toastLog("swipeFindElement滑动查找元素失败"+error) } }

查找页面的元素或者图片

adenTools.clickWordOrImage 点击文字或图片
adenTools.clickWordOrImage=function(elem, img_array) { if (elem.exists()) { adenTools.clickControlBounds(elem) return true } else { if (adenTools.clickControlBounds(img_array)) { return true } } return false }

adenTools.clickControOffsetCoordinates 点击找到图片的偏移量
/** * 点击UI上元素的偏移坐标 * @param {查找的元素} element * @param {偏移的坐标} cordinates * @returns 成功返回True失败错误等返回False */ adenTools.clickControOffsetCoordinates=function(element,cordinates){ try { let resultJson=adenTools.getControlBounds(element) if(resultJson==null || resultJson== undefined){ return false }else{ if (cordinates instanceof Array) { toastLog(cordinates[1]) let x=parseInt(resultJson.x)+parseInt(cordinates[0]) let y=parseInt(resultJson.y)+parseInt(cordinates[1]) toastLog(y) return click(x, y); } return false } } catch (error) { toastLog("clickControOffsetCoordinates方法出现错误:" + error) return false } }

获取手机安装app列表
/** * 获取手机安装app的集合 */ adenTools.getAppList = function () { var pm = context.getPackageManager() var appList = pm.getInstalledApplications(0) var appInfoList = [] for (let i = 0; i < appList.size(); i++) { var app = appList.get(i) var appInfo = { appName: app.loadLabel(pm), packageName: app.packageName, isSystemApp: false } let android_version=device.release if(android_version==11){}else{ if (!app.isSystemApp()) { appInfoList.push(appInfo) } } } //追加app 微信阅读 var appInfo = { appName: "微信阅读", packageName: "com.yadinghao.wx.read", isSystemApp: false } appInfoList.push(appInfo) return appInfoList }


写日志
/** * 写日志,toast、consle和文件日志 * @param {日志内容} loginfo * @param {日志等级} level */ writeLog = function (loginfo, level) { try { var logName = "" if(level=="error"){ logName = softName + "" + adenTools.getDate() + "_" + "Log.txt"; }else{ logName = softName + "" + adenTools.getDate() + "_" + "ErrorLog.txt"; } var logPath = rootPath + "/日志/"; let message = adenTools.getTime() + "(" + softVersion + "):" + loginfo; if (!files.isDir(rootPath)) { if (files.create(rootPath)) { files.create(logPath) } } else { files.create(logPath) } let logFilePath = logPath + "/" + logName; if (!files.exists(logFilePath)) { files.create(logFilePath); files.write(logFilePath, message + "\r"); //写日志 } else { files.append(logFilePath, message + "\r"); //追加日志 }toast(message); if (level == "log") { console.log(message); } else if (level == "info") { console.info(message); } else if (level == "warn") { console.warn(message); } else if (level == "error") { console.error(message); } } catch (error) { console.error("系统再写日志的时候出现错误若不影响使用请略过" + error); } }

随机时间
/** * 休眠随机0.1秒至0.5秒 */ adenTools.sleepRandom0 = function () { sleep(random(100, 500)); } /** * 休眠随机1秒至3秒 */ adenTools.sleepRandom1 = function () { sleep(random(1000, 3000)); } /** * 休眠随机3秒至5秒 */ adenTools.sleepRandom3 = function () { sleep(random(3000, 5000)); } /** * 休眠随机5秒至7秒 */ adenTools.sleepRandom5 = function () { sleep(random(5000, 7000)); } /** * 休眠随机7秒至9秒 */ adenTools.sleepRandom7 = function () { sleep(random(7000, 9000)); } /** * 休眠随机11秒至9秒 */ adenTools.sleepRandom9 = function () { sleep(random(9000, 11000)); }

日期函数
直线滑动
曲线滑动A(贝叶斯函数)
/** * 贝塞尔曲线 * @param {坐标点} ScreenPoint * @param {偏移量} Offset */ adenTools.bezier_curves = function (ScreenPoint, Offset) { cx = 3.0 * (ScreenPoint[1].x - ScreenPoint[0].x); bx = 3.0 * (ScreenPoint[2].x - ScreenPoint[1].x) - cx; ax = ScreenPoint[3].x - ScreenPoint[0].x - cx - bx; 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 = { "x": 0, "y": 0 }; result.x = (ax * tCubed) + (bx * tSquared) + (cx * Offset) + ScreenPoint[0].x; result.y = (ay * tCubed) + (by * tSquared) + (cy * Offset) + ScreenPoint[0].y; return result; }/** * * @param {*} qx * @param {*} qy * @param {*} zx * @param {*} zy * @param {*} time * @param {*} timesInterval */ adenTools.curveDown = function (qx, qy, zx, zy, time, timesInterval) { var xxy = [time]; var point = []; var dx0 = { "x": qx, "y": qy }; var dx1 = { "x": random(qx - 100, qx + 100), "y": random(qy, qy + 50) }; var dx2 = { "x": random(zx - 100, zx + 100), "y": random(zy, zy + 50), }; var dx3 = { "x": zx, "y": zy }; for (var i = 0; i < 4; i++) { eval("point.push(dx" + i + ")"); }; for (let i = 0; i < 1; i += 0.08) { let newPoint = adenTools.bezier_curves(point, i); xxyy = [parseInt(newPoint.x), parseInt(newPoint.y)] xxy.push(xxyy); } gesture.apply(null, xxy); let randomMin = timesInterval * 1000; let randomMax = (parseInt(timesInterval) + 2) * 1000; let delayTime = random(randomMin, randomMax); sleep(delayTime); }

adenTools.clickControlBounds 点击找到控件的坐标
太多了自己下载项目看吧。我这里就不一一列举了。项目的位置是Plgin文件夹下。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

三、资费介绍
作者搞这个软件也是不容易大家支持一下吧~
全部源码是300R包含整个工程
单独APK的邀请码10R每个月
永久(无时间现在)每个邀请码是100R
还望大家理解和支持谢谢送大家一首打油诗

学习知识费力气,收集整理更不易。
知识付费甚欢喜,为咱码农谋福利。
四、其他
App不切换了我该怎么办
两个解决方案,如果都不行我也没招了
  1. 无障碍服务假活真死,一般华为手机爱这样,重启手机就可以
  2. 这个是权限问题,不同的手机配置可能不大一样尤其是小米
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片


被薅羊毛APK下载
十几个App都有了。必须使用我的版本否则会封号,在薅羊毛时间版中也可以下载。
AutoJs|Autojs7实戦---薅羊毛时间版APK
文章图片

链接:https://pan.baidu.com/s/1qg6zN0vrklyCv-6DQiM3lw?pwd=bq26 提取码:bq26

机型选择
经过多年的甄选基本确定了一个稳定机型
1、OppOR9S 和 OppOR9Sk
2小米5或者小6
其实我不大建议使用华为的手机,电池真心的不行。我3部华为手机电池全部鼓包分别是:华为Mate10、华为Nova和荣耀V8。虽然荣耀被卖了但是我们也不能买新机器干阿。

系统要求
Android7以上包含安卓7非Android7别试验了浪费时间。

薅羊毛时间版APK下载地址:薅羊毛时间版_v0.0.40.apk - 蓝奏云
薅羊毛时间版源代码下载地址:薅羊毛时间版源码.rar - 蓝奏云


【AutoJs|Autojs7实戦---薅羊毛时间版APK】

    推荐阅读