我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛
1、项目说明
Autojs是一个非常好用的工具,主要功能就是开发一些自动化脚本,看到身处上海的掘友看到有人用它来开发一些抢菜脚本,点赞量非常多。 基于Auto.js写抢菜脚本
然后自己做了一个随机粽子基于Tkinter的GUI界面程序:# 端午节不知道先吃什么口味的粽子?Tkinter粽子选择器你值得拥有!(还能自动关机,选择困难症克星),没什么人气,有点小郁闷。
然后自己看到有位掘友的文章:夏天来了,怎么用Python查询全国各个城市的温度呢?下面的评论:
点子来了!满足这个大兄弟的愿望:夏天来了,用Auto.js寻找这个夏天最凉快的小姐姐,使用Auto.js脚本来识别抖音上的小姐姐,颜值要高,衣着要凉快。
需要颜值识别
和衣着识别
这两个接口,这两个接口我自己全部在本地实现了,没有接入第三方接口识别。参考:
颜值识别(自己改别人的):koala9527/face_rank
衣服图片识别:ousheobin/what_dress
本地接口部署
颜值识别去去年花了一点时间弄了一个Docker镜像,最初是在某个公众号还是文章上看到的 ,挺好玩的,我GitHUb上面找到源码都是接入了百度或者腾讯云的接口,不够稳定,GitHub上面也有类似的项目,但是很冷门很早的项目,自己有一段时间对深度学习非常感兴趣,也有实现了几个项目的训练和预测,但是学了好久基础知识半途而废了,基础太差了,制作这个镜像的时候花了好久尝试安装不同版本的包~
今天又在GitHub上找到了一个衣服图片识别的接口,又是一个远古项目,使用的是tensorflow1.X,装了一下CUDA和cuDNN(用于优化深度学习的显卡驱动)
颜值识别
颜值识别,去年把别人的项目拉了下来,制作了Docker镜像,根据README.md文件直接从阿里云拉取镜像本地运行就行了,注意本地运行的时候注意宿主机的端口,不要跟第二个接口的端口从冲突了。
接口会直接返回颜值评分,10分为满分。
衣服识别
这个项目很冷门,自己安装了一些基础依赖包,直接运行就可以了,也没有改接口内容,会直接返回两个种类预测的结果:
两个衣服分类列表以执行度从高到低排列。分别为上衣,和下装,在源码中找到了两个大类的所有子类:
九分裤,九分裙,七分裙,长裙,五分裤,五分裙,短裙,七分裤,短裤,中裙
九分袖,无袖,七分袖,短袖,五分袖,杯袖,长袖,超长袖
这个项目后面看用的人多不多,多的话我还是花点精力做一个Docker镜像吧。
auto.js
auto.js我也是只有一点点的经验,使用了一些javascript的基础语法。autojs版本是最后的免费版4,1,刚刚才发现已经更新到9.X了,还可以用node.js,npm,太强了。代码也有没有那么长,主要的难度是要找抖音中的爱心图标,使用了多点找色的原理,没有使用无障碍功能中的控件查找,因为抖音对这个有一定的屏蔽,有时候会变,或者加载不出来,多点找色也很困难,白色的爱心是一个半透明的,只有找一下上面的关注头像然后Y轴向下偏移点击,白色爱心的位置上下也会有偏移。
代码:
auto();
if (!requestScreenCapture()) {
toast("请求截图失败");
exit();
}
var score_url = 'http://192.168.2.226:5001/predict' //手机访问电脑的内网地址,获得颜值评分
var dress_url = 'http://192.168.2.226:5000/classify' //衣服分类
var upper_dress = ['无袖', '短袖', '杯袖', '七分袖'] //上衣目标,识别只有这个其中一个并且颜值超过阈值就可以点击爱心。
var below_dress = ['五分裙', '短裤', '短裙', '五分裤', '七分裙', '七分裤'] //下装目标,同样识别只有这个其中一个并且颜值超过阈值就可以点击爱心。
function randNum(minnum, maxnum) {
return Math.floor(minnum + Math.random() * (maxnum - minnum)); //封装随机数
};
function screen_png() { //截图保存,返回路径
console.log("开始");
var timestamp = Date.parse(new Date());
file_name = "/sdcard/autojs_img/girl/" + timestamp + ".png"
console.log(file_name)
captureScreen(file_name);
console.log("结束");
// toast("截图完成");
return file_name
}
function get_score(file_path) { //获取颜值,没有获取到直接返回0分
console.log(file_path)
var res = http.postMultipart(score_url, {
file: open(file_path)
});
res = res.body.string()
if (res != "未识别到人脸") {
return res;
} else {
return 0
}
}
function get_dress(file_path) { //获取衣着列表,没有返回空列表
var res = http.postMultipart(dress_url, {
file: open(file_path)
});
res = res.body.json()
return_res = []
if (res.hasOwnProperty("skirtAndPantLegnth")) {
if (res["skirtAndPantLegnth"].length > 0) {
return_res.push(res['skirtAndPantLegnth'][0]['label']);
}
}
if (res.hasOwnProperty("sleeveLength")) {
if (res['sleeveLength'].length > 0) {
return_res.push(res['sleeveLength'][0]['label']);
}
}
return return_res
}
function get_dress_status(dress_list) { //识别的衣着列表进行自定义的列表对比,看有没有自己的目标,返回是否是凉快的衣着。
for (var item of upper_dress) {
result = dress_list.indexOf(item)
if (result != -1) {
return true
}
}
for (var item of below_dress) {
result = dress_list.indexOf(item)
if (result != -1) {
return true
}
}
return false
}
function get_love_target(file_path) { //最难的地方 ,找爱心去点击,识别各种状态的头像,进行Y轴向下点击
// toast("找爱心")
let img = images.read(file_path);
img1 = ["#ffffff", [[-68, -71, "#ffffff"], [5, -135, "#ffffff"], [60, -106, "#ffffff"], [70, -56, "#ffffff"], [54, -21, "#ffffff"], [28, -2, "#ffffff"], [-53, -111, "#ffffff"], [40, -125, "#ffffff"], [-43, -17, "#ffffff"], [39, -10, "#ffffff"], [66, -91, "#ffffff"], [-57, -33, "#ffffff"]]]
img2 = ["#fe2c55", [[-11, -9, "#fe2c55"], [-11, -30, "#fe2c55"], [9, -30, "#fe2c55"], [-5, -41, "#fe2c55"], [5, -39, "#fe2c55"], [-64, -63, "#ffffff"], [-1, -154, "#ffffff"], [68, -83, "#ffffff"], [60, -53, "#ffffff"], [50, -38, "#ffffff"]]]
img3 = ["#fe2c55", [[-1, -41, "#fe2c55"], [-19, -34, "#fe2c55"], [14, -34, "#fe2c55"], [25, -21, "#fe2c55"], [-22, -20, "#fe2c55"], [-21, -9, "#fe2c55"], [12, -7, "#fe2c55"], [-1, -128, "#f62880"], [-1, -130, "#f7287e"], [-2, -121, "#f72880"]]]
img4 = ["#f4f5f6", [[0, 11, "#f4f5f6"], [0, 29, "#f1f1f1"], [-13, 1, "#f5f6f7"], [-32, -18, "#f5f6f7"], [24, -23, "#eff0f1"], [29, -5, "#eeeff0"], [1, 23, "#f1f2f3"], [-30, 12, "#f5f6f8"], [14, 23, "#e8e9e9"], [-36, -16, "#f6f7f7"], [-1, -3, "#f4f5f6"], [-27, -12, "#f5f6f7"], [7, -10, "#f1f2f3"]]]
var p1 = images.findMultiColors(img, img1[0], img1[1], {
threshold: 0.7
}) //已关注未直播
var p2 = images.findMultiColors(img, img2[0], img2[1], {
threshold: 0.7
}) //未关注未直播
var p3 = images.findMultiColors(img, img3[0], img3[1], {
threshold: 0.7
}) //未关注直播
var p4 = images.findMultiColors(img, img4[0], img4[1], {
threshold: 100,
region: [924, 805, 1047 - 924, 1082 - 805] //需要限定识别范围
}) //直接白色爱心
if (p2) {
toast("找到了")
click(p2.x, p2.y + 100)
}
if (p1) {
toast("找到了")
click(p1.x, p1.y + 110)
}
if (p3) {
toast("找到了")
click(p3.x, p3.y + 110)
}
if (p4) {
toast("找到了")
click(p4.x + 20, p4.y + 20)
}
toast("结束没找到")
sleep(500)
}
function get_love_status(file_path) { //颜值识别和衣服识别进行合并判断,大于7.5分并且有一件凉快的衣着就返回真
score = get_score(file_path)
dress_list = get_dress(file_path)
dress_status = get_dress_status(dress_list)
if (parseFloat(score) > 7.5 && dress_status) {
toast("符合标准!!!颜值:" + score + "装扮:" + dress_list.toString())
return true
} else {
toast("不符合标准,颜值:" + score + "装扮:" + dress_list.toString())
return false
}
}
function next_video() { //划屏幕进入下一个视频
swipe(randNum(300, 350), randNum(1350, 1300), randNum(300, 350), randNum(400, 450), randNum(300, 500))
toast("划~下一个~")
}
function rand_sleep() { //随机等待视频加载
sleep_time = randNum(3, 5);
sleep(sleep_time * 1000)
}
function main() { //主程序逻辑,风格想C或者go,哈哈
sleep(2000)
toast("脚本启动")
while (1) { //无限循环,截图识别,判断是否点爱心,下一个。
file_path = screen_png()
// toast("开始识别。。。")
love_status = get_love_status(file_path)
if (love_status) {
get_love_target(file_path)
}
next_video()
rand_sleep()
back() //为了方式点错了,强制返回一下
}
}
main()
效果&总结
效果:
运行了一会,感觉还不错:
有一些缺点讲一下:
衣着识别的深度项目的数据集应该是直接识别衣服的图片,而不是人身上的图片,正确率不是很高,仅供参考吧。 颜值识别还是不错的,就是缺一个性别识别,但是实际情况都是女生的视频很多,会刷到一点点新闻类的男生视频颜值很高会误点,总是可以后面手动取消关注的,哈哈。
感谢观看,谢谢,觉得有趣有用给个赞支持一下~ 哈哈~