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

11 篇文章 1 订阅

薅羊毛时间版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 + "\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文件夹下。

三、资费介绍

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

全部源码是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 - 蓝奏云

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
包括软件及打包apk插件 ------------------------ Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。 因为Auto.js是基于JavaScript的,学习Auto.js的API之前建议先学习JavaScript的基本语法和内置对象,可以使用教程前面的两个JavaScript教程链接来学习。 如果您想要使用TypeScript来开发,目前已经有开发者公布了一个可以把使用TypeScript进行Auto.js开发的工具,参见Auto.js DevTools。 如果想要在电脑而不是手机上开发Auto.js,可以使用VS Code以及相应的Auto.js插件使得在电脑上编辑的脚本能推送到手机运行,参见Auto.js-VSCode-Extension。 本文档的章节大致上是以模块来分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。 "自动操作"的部分又可以大致分为基于控件和基于坐标的操作。基于坐标的操作是传统按键精灵、触摸精灵等脚本软件采用的方式,通过屏幕坐标来点击、长按指定位置模拟操作,从而到达目的。例如click(100, 200), press(100, 200, 500)等。这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对一般软件脚本却难以达到想要的效果,而且这种方式需要安卓7.0本以上或者root权限才能执行。所以对于一般软件脚本(例如批量添加联系人、自动提取短信验证码等等),我们采用基于控件的模拟操作方式,结合通知事情、按键事情等达成更好的工作流。这些部分的文档参见基于控件的操作和基于坐标的操作。 其他部分主要包括: app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。 console: 控制台。记录运行的日志、错误、信息等。 device: 设备。获取设备屏幕宽高、系统本等信息,控制设备音量、亮度等。 engines: 脚本引擎。用于启动其他脚本。 events: 事件与监听。按键监听,通知监听,触摸监听等。 floaty: 悬浮窗。用于显示自定义的悬浮窗。 files: 文件系统。文件创建、获取信息、读写。 http: HTTP。发送HTTP请求,例如GET, POST等。 images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。 keys: 按键模拟。比如音量键、Home键模拟等。 shell: Shell命令。 threads: 多线程支持。 ui: UI界面。用于显示自定义的UI界面,和用户交互。 除此之外,Auto.js内置了对Promise。
universal-apk-builder是一个用于构建通用APK(Android应用程序包)的工具。它的作用是将一个应用程序的源代码和资源文件转换成可以在不同Android设备上运行的通用APK文件。 通常在开发Android应用程序时,需要为不同的设备和系统本适配不同的APK文件。这意味着开发人员需要为每个设备和系统本构建多个APK文件,增加了工作量和开发难度。 universal-apk-builder解决了这个问题。它可以根据输入的源代码和资源文件,自动进行适配和优化,生成一个通用的APK文件。这个通用APK文件可以在大多数Android设备和系统本上运行,不再需要为每个设备和系统本构建单独的APK文件。 使用universal-apk-builder的好处是显而易见的。首先,它大大减少了开发人员的工作量和开发周期,因为只需要构建一个通用的APK文件即可。其次,通用APK文件的运行效果和性能可以得到更好的保证,因为它经过了适配和优化处理。 然而,与任何工具一样,universal-apk-builder也有一些限制。它可能无法完全适配所有的Android设备和系统本。在某些特殊情况下,仍然需要构建特定设备和系统本的APK文件。此外,由于通用APK文件需要兼容多种设备和系统本,可能会对应用程序的大小和性能产生一些影响。 总体而言,universal-apk-builder是一个用的工具,可以帮助开发人员简化APK构建过程,提高开发效率。但开发人员仍需根据具体情况和需求来选择是否使用该工具,以及是否进行特定设备和系统本的适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚丁号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值