源代码和Apk地址链接:https://pan.baidu.com/s/1royu3pvZ0Z_KAlfqtLBBGw 密码:yeph
专业版肯定比个人版功能强大并且要稳定。增加了很多功能的同时也测试封号的App,对于封号的App,给予剔除。虽然App数量减少了但是都是稳定的且收益比较高的。并且一天也就刷那么十几个而已。专业版比较个人版增加了按照时间刷刷刷。同时每个app的时间可以设置,时间到达后自动进入下一个App。时间是一天之内的时间,也就是说一天之内不超过100分钟,即使间断执行程序也会按照设定时间执行。最后执行的时间就是100分钟。
?
专业版增加清理缓存的功能。每次看视频结束后都会清理缓存。这样保证手机内容小的的福音。同时也是对老手机防卡的一个操作。
专业版增加自动评论功能,这个功能是最难的,操作很多且再输入的时候经常出现错误,一般使用的输入代码是setText和Input。另外有的APP没有评论功能。
专业版签到较之前个人版签到做了个大改版,每个App的签到都和App刷刷放到了一起。无论是签到、自动清理缓存、自动答复都使用了wateFor函数。(其实要慎用)
专业版增加最实用的功能就是自动提现。目前提现的金额是最低额度。(接受定制)
专业版修复了一些bug,同时也增加了一些功能。如:
- 修复了点赞和关注的BUG
- 增加了点赞和关注功能的概率(个人版是将代码写成了硬代码)
- 自动评论也增加了概率
专业版最大的改动其实是代码的优化。对代码做了整体规划也采用了中文名称。这样对对于阅读和修改都是非常便利的。看下截图:
?
薅羊毛专业版用到技术颇多。因为打包成Apk肯定有和用户交互的地方那也就意味着有UI界面。列举一下技术有需要技术的也可以查看本文档来复制代码。
- AutoJs UI技术。List、button、checkbox、input、swich等控件。
- AutoJs UI技术复杂页面布局。抽屉、headermenu、tab页面、垂直布局、水平布局等。
- Image图标使用base64格式显示。
- AutoJs 悬浮框。
- AutoJs 开启无障碍权限代码。
- AutoJs 开启悬浮窗权限代码。
- 多线程。
- Http访问网络。
- 控制台。
- 本地存储。
- 按键模拟。
- 事件与监听。
- 对话框。
- 设备信息。
- App常用函数。
先不吹牛技术了,咱们直接看薅羊毛个人版APP的截图。如下:
这个是写的JS脚本在AutoJs里面的效果。咱们看一看薅羊毛UI版的截图。
薅羊毛首页,Splash页面。可以做很多东西……
?
薅羊毛配置页面
?
前2项我就不多说了,友情提醒先开启无障碍在开启悬浮否则App会挂掉。
- 控制台还是不建议开启,有的App签到会失败。
- 是否开Toast提示,其实是无所谓的。
- 是否自动签到,这个还是很意义的,之前我放自动刷的前面发现有的app会卡住,防止万一我把签到放到自动刷的后面了和清理内存一起
- 自动评论,在我看来整个app最难的就是这个,太难了…….另外不是所有的App都让评论。
- 自动清理缓存,整个说过了。
- 自动提现,目前都是最小金额。
- 执行天数,大于1天就行反正我们手机少,如果是工作室多几天还行不过别指望无障碍玩工作室那样你会很崩溃,
- 滑动屏幕间隔,这个我默认是8秒。
- 随机概率,默认是十分之一,该不该无所谓吧,主要是随机点赞、随机关注、随机评论、随机上滑、随机下滑。控制着几个事件的随机概率。
薅羊毛专业版系统页面:
?
- 日志,我会将更新的日志发到这里
- 此版本将支持在线更新
- 教程还是我CSDN博客地址(以后会改)
- 关于就是版权说明,强调一下,我之前发布的代码有很多人转载也没写版权我就不追究了,如果有人利用我的源码和Apk文件在网络上贩卖我一定会追究。
- 退出……没啥说的吧
接下来我把整个App比较难写的地方写贴出来给大家提个醒,可能你们认为不是问题。献丑了不要见笑。之后我会将所有代码求全部贴出。
部局的时候出现了点问题,一直找不到合理的部局且很难看(现在也不怎么好看)。后来在AutoJs中示例看到了复杂部局就学了一下,效果还可以吧。
代码如下:
?
数据绑定代码:
function initializeFirstFrame() {
for (let i = 0; i < videoArray.length; i++) {
let appName = videoArray[i];
let signMessage = "未签";
let signValue = getSignTime(appName);
let signColor = "#FF0000";
if (getDate() == signValue) {
signMessage = "已签";
signColor = "#228B22";
}
//今日薅羊毛时间 1440 1400 1605-20=1585-1440=145-60=85-20=65-60
let execTimesMessage = "";
let key = appName + storageSign + getDate();
let havedRunTimes = woolStorage.get("" + key + "");
if (havedRunTimes == null) {
execTimesMessage = ("已刷:0分");
} else {
if (parseInt(havedRunTimes) < 1000 * 60) {
execTimesMessage = ("已刷时间小于1分钟");
}
let havedMinute = (havedRunTimes / 1000) / 60;//读取到的时间是毫秒需要转换成秒,转换成秒后在转换成分钟
execTimesMessage = ("已刷:" + havedMinute.toFixed(2) + "分");
}
if (appName == "微视") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "65", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "抖音极速版") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "30", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "快手极速版") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "180", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "火山极速版") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "闪电盒子极速版") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "50", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "欢乐盒子") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "50", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "火火视频极速版") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "刷宝短视频") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "60", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "彩蛋视频") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "快音") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "中青看点") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "100", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "趣铃声") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "爱走路") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "120", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "闪鸭短视频") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "60", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else if (appName == "长豆短视频") {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "80", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
} else {
let row = { SignColor: signColor, AppName: videoArray[i], AppIndex: (i + 1), ExecTimes: "15", IsSign: signMessage, done: false, ExecTimesMessage: execTimesMessage };
videoItems.push(row);
}
}
ui.videoList.setDataSource(videoItems);
//小视频绑定check事件 火火视频极速版 长豆短视频
ui.videoList.on("item_bind", function (itemView, itemHolder) {
itemView.done.on("check", function (checked) {
let item = itemHolder.item;
item.done = checked;
let appName = item.AppName;
let appIndex = itemView.appIndex.getText();
item.AppIndex = appIndex;
item.ExecTimes = itemView.execTimes.getText();
let brushTimes = itemView.execTimes.getText();
if (checked) {
havedVideoChecked.put(appName, appIndex);
havedVideoTimes.put(appName, brushTimes);
} else {
havedVideoChecked.remove(appName);
havedVideoTimes.remove(appName);
}
});
});
ui.videoList.on("item_click", function (item, i, itemView, listView) {
itemView.done.checked = !itemView.done.checked;
});
}
保存配置采用的是storage,这个是不安全的只要知道名称就可以访问,敏感数据不建议使用它。保存配置代码:
具体业务代码在我之前的文章里面已经写过了,我现在把完整代码贴一下,服务器信息是我的大家别乱搞就好了哈。
附赠Apk地址链接:https://pan.baidu.com/s/1royu3pvZ0Z_KAlfqtLBBGw 密码:yeph
最后再次强调:我提供的是源代码,Apk是附属产品。源码和Apk的用途本人概不负责。
基于AutoJs实现的薅羊毛App专业版源码大分享