夏天来了,用Auto.js寻找这个夏天最凉快的小姐姐

604 阅读7分钟

我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛

1、项目说明

Autojs是一个非常好用的工具,主要功能就是开发一些自动化脚本,看到身处上海的掘友看到有人用它来开发一些抢菜脚本,点赞量非常多。 基于Auto.js写抢菜脚本

然后自己做了一个随机粽子基于Tkinter的GUI界面程序:# 端午节不知道先吃什么口味的粽子?Tkinter粽子选择器你值得拥有!(还能自动关机,选择困难症克星),没什么人气,有点小郁闷。

然后自己看到有位掘友的文章:夏天来了,怎么用Python查询全国各个城市的温度呢?下面的评论:

image.png

点子来了!满足这个大兄弟的愿望:夏天来了,用Auto.js寻找这个夏天最凉快的小姐姐,使用Auto.js脚本来识别抖音上的小姐姐,颜值要高,衣着要凉快。

需要颜值识别衣着识别这两个接口,这两个接口我自己全部在本地实现了,没有接入第三方接口识别。参考:

颜值识别(自己改别人的):koala9527/face_rank
衣服图片识别:ousheobin/what_dress

本地接口部署

颜值识别去去年花了一点时间弄了一个Docker镜像,最初是在某个公众号还是文章上看到的 ,挺好玩的,我GitHUb上面找到源码都是接入了百度或者腾讯云的接口,不够稳定,GitHub上面也有类似的项目,但是很冷门很早的项目,自己有一段时间对深度学习非常感兴趣,也有实现了几个项目的训练和预测,但是学了好久基础知识半途而废了,基础太差了,制作这个镜像的时候花了好久尝试安装不同版本的包~

今天又在GitHub上找到了一个衣服图片识别的接口,又是一个远古项目,使用的是tensorflow1.X,装了一下CUDA和cuDNN(用于优化深度学习的显卡驱动)

颜值识别

颜值识别,去年把别人的项目拉了下来,制作了Docker镜像,根据README.md文件直接从阿里云拉取镜像本地运行就行了,注意本地运行的时候注意宿主机的端口,不要跟第二个接口的端口从冲突了。

image.png

image.png
接口会直接返回颜值评分,10分为满分。

衣服识别

这个项目很冷门,自己安装了一些基础依赖包,直接运行就可以了,也没有改接口内容,会直接返回两个种类预测的结果:

image.png

两个衣服分类列表以执行度从高到低排列。分别为上衣,和下装,在源码中找到了两个大类的所有子类:

九分裤,九分裙,七分裙,长裙,五分裤,五分裙,短裙,七分裤,短裤,中裙

九分袖,无袖,七分袖,短袖,五分袖,杯袖,长袖,超长袖

这个项目后面看用的人多不多,多的话我还是花点精力做一个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()

效果&总结

效果:

33.gif 运行了一会,感觉还不错:

b0f0b784a90de8a58258c20708c798c.jpg 有一些缺点讲一下:

衣着识别的深度项目的数据集应该是直接识别衣服的图片,而不是人身上的图片,正确率不是很高,仅供参考吧。 颜值识别还是不错的,就是缺一个性别识别,但是实际情况都是女生的视频很多,会刷到一点点新闻类的男生视频颜值很高会误点,总是可以后面手动取消关注的,哈哈。

感谢观看,谢谢,觉得有趣有用给个赞支持一下~ 哈哈~