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

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

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

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

一、功能区域

二、框架描述

三、资费介绍

四、其他介绍

一、功能区域

目前薅羊毛的APP大概有这多么(不能写名称你们懂得)

先放个提现图给大家过过瘾再加之增加信心。

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

我已经提供app的下载,大家安装后下载就可以了。这个版本的薅羊毛必须使用内置提供的APP

用某APP(实际名称会被封杀)举例说明下功能。

筷子,有图有真相

来点实际的东西

关注一个用户

function 关注1个用户() {
        let returnValue = adenTools.getBusinessInfo(appName, "关注1个用户")
        if (returnValue) {
            if (returnValue == 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 = adenTools.getBusinessInfo(appName, "评论1个作品")
        if (returnValue) {
            if (returnValue == 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分钟会执行一下领取宝箱动作、签到、关注等事件给大家放个图

​ 这些功能已经内置在各个APP上。大家不用单独设置。

  1. 大家最关注的就是自动TX,筷子极速版大额TX是要验证码的但是咱TX0.3的啊所以不用验证码。

         薅羊毛时间版APP本身其实有很多功能,大家可以参考薅羊毛专业版说明书看看APP功能。基本一样。

二、框架描述

         虽然偏技术但是也得提及,对咱技术人是个帮助,同时小弟也希望大神大咖们不要嘲笑我小弟再次谢过了。

核心技术改成了Autojs7因此支持找图操作。同时找图也有局限性我们技术人都知道的,找图是有分辨率限制的。此款APP是在1920*1080分辨率下截图和找图的因此非此分辨率是不支持的。但是我们技术人是可以修正,其实改改图就行。

进入正题我给大家放个项目截图:

Autojs7是支持项目的因此将各个页面分离不在出现万行代码。启动页面的引用。

         该项目基本的UI都已经写好了,例如:

  1. APP主界面
  2. 登录
  3. 注册
  4. 系统配置
  5. 个人页面
  6. 设备信息
  7. Flash页面
  8. 悬浮窗页面

详细的参考实际的项目吧。还有一些大方法如:

  1. 账号合法性检测

  1. App升级

  1. 检测网络

还有个大家都在苦找得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   "
");//写日志
        }
        else {
            files.append(logFilePath, message   "
");//追加日志
        }

        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文件夹下。

三、资费介绍

         作者搞这个软件也是不容易大家支持一下吧~

全部源码是300R包含整个工程

单独APK的邀请码10R每个月

永久(无时间现在)每个邀请码是100R

还望大家理解和支持谢谢送大家一首打油诗

学习知识费力气,收集整理更不易。

知识付费甚欢喜,为咱码农谋福利。

四、其他

App不切换了我该怎么办

两个解决方案,如果都不行我也没招了

  1. 无障碍服务假活真死,一般华为手机爱这样,重启手机就可以
  2. 这个是权限问题,不同的手机配置可能不大一样尤其是小米

被薅羊毛APK下载

十几个App都有了。必须使用我的版本否则会封号,在薅羊毛时间版中也可以下载。

链接: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 - 蓝奏云

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

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

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

一、功能区域

二、框架描述

三、资费介绍

四、其他介绍

一、功能区域

目前薅羊毛的APP大概有这多么(不能写名称你们懂得)

先放个提现图给大家过过瘾再加之增加信心。

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

我已经提供app的下载,大家安装后下载就可以了。这个版本的薅羊毛必须使用内置提供的APP

用某APP(实际名称会被封杀)举例说明下功能。

筷子,有图有真相

来点实际的东西

关注一个用户

function 关注1个用户() {
        let returnValue = adenTools.getBusinessInfo(appName, "关注1个用户")
        if (returnValue) {
            if (returnValue == 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 = adenTools.getBusinessInfo(appName, "评论1个作品")
        if (returnValue) {
            if (returnValue == 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分钟会执行一下领取宝箱动作、签到、关注等事件给大家放个图

​ 这些功能已经内置在各个APP上。大家不用单独设置。

  1. 大家最关注的就是自动TX,筷子极速版大额TX是要验证码的但是咱TX0.3的啊所以不用验证码。

         薅羊毛时间版APP本身其实有很多功能,大家可以参考薅羊毛专业版说明书看看APP功能。基本一样。

二、框架描述

         虽然偏技术但是也得提及,对咱技术人是个帮助,同时小弟也希望大神大咖们不要嘲笑我小弟再次谢过了。

核心技术改成了Autojs7因此支持找图操作。同时找图也有局限性我们技术人都知道的,找图是有分辨率限制的。此款APP是在1920*1080分辨率下截图和找图的因此非此分辨率是不支持的。但是我们技术人是可以修正,其实改改图就行。

进入正题我给大家放个项目截图:

Autojs7是支持项目的因此将各个页面分离不在出现万行代码。启动页面的引用。

         该项目基本的UI都已经写好了,例如:

  1. APP主界面
  2. 登录
  3. 注册
  4. 系统配置
  5. 个人页面
  6. 设备信息
  7. Flash页面
  8. 悬浮窗页面

详细的参考实际的项目吧。还有一些大方法如:

  1. 账号合法性检测

  1. App升级

  1. 检测网络

还有个大家都在苦找得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   "
");//写日志
        }
        else {
            files.append(logFilePath, message   "
");//追加日志
        }

        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文件夹下。

三、资费介绍

         作者搞这个软件也是不容易大家支持一下吧~

全部源码是300R包含整个工程

单独APK的邀请码10R每个月

永久(无时间现在)每个邀请码是100R

还望大家理解和支持谢谢送大家一首打油诗

学习知识费力气,收集整理更不易。

知识付费甚欢喜,为咱码农谋福利。

四、其他

App不切换了我该怎么办

两个解决方案,如果都不行我也没招了

  1. 无障碍服务假活真死,一般华为手机爱这样,重启手机就可以
  2. 这个是权限问题,不同的手机配置可能不大一样尤其是小米

被薅羊毛APK下载

十几个App都有了。必须使用我的版本否则会封号,在薅羊毛时间版中也可以下载。

链接: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 - 蓝奏云

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在