草庐IT

基于Python实现自动刷抖音,进行人脸识别,不是小姐姐自动划走下一个!

轻松学Python 2023-03-28 原文

昨天木子问我能不能做自动刷某音短视频,还要自动刷小哥哥,不是小哥哥就划走。

我心想,这女人真麻烦,怎么这么多事。

不好好工作天天想着小哥哥!

为了不得罪她,当时我就先答应了下来,然而实际上我把小哥哥变成了小姐姐,刷什么小哥哥,多没品味!

好了,话不多说,我们直接上代码!

代码实战

首先导入需要使用的模块

import base64
import urllib
import json
import requests
import sys

 

获取接口

获取 access_token 有效期一般有一个月

client_id = api_key
client_secret = secret_key
# 完整代码我都放在这个群了 872937351 
# 直接加它领取
auth_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
header_dict = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
    "Content-Type": "application/json"
}

 

请求获取到token的接口

response_at = requests.get(auth_url, headers=header_dict)
json_result = json.loads(response_at.text)
access_token = json_result['access_token']
return access_token

 

调用人脸识别的接口,返回识别到的人脸列表。

headers ={
    'Content-Type': 'application/json; charset=UTF-8'
}

if pic_type == TYPE_IMAGE_NETWORK:
    image = pic_url
    image_type = 'URL'
else:
    with open(pic_url, 'rb') as file:
        image = base64.b64encode(file.read())
    image_type = 'BASE64'

post_data ={
    'image': image,
    'image_type': image_type,
    'face_field': 'facetype,gender,age,beauty',  # expression,faceshape,landmark,race,quality,glasses
    'max_face_num': 2
}

response_fi = requests.post(url_fi, headers=headers, data=post_data)
json_fi_result = json.loads(response_fi.text)

 

如果人脸识别成功,返回人脸列表,否则返回None

if not json_fi_result or json_fi_result['error_msg'] != 'SUCCESS':
    return None
else:
    return json_fi_result['result']['face_list']

 

人脸识别,返回人脸列表。

def parse_face_pic(pic_url, pic_type, access_token):
    url_fi = 'https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=' + access_token

    # 调用identify_faces,获取人脸列表
    json_faces = identify_faces(pic_url, pic_type, url_fi)

    if not json_faces:
        return None
    else:
        return json_faces

 

解析人脸识别结果,判断颜值是否达标。

条件:性别女,颜值大于等于 70

def analysis_face(face_list):
    # 是否能找到漂亮小姐姐
    find_plxjj = False
    if face_list:
        for face in face_list:
            # 判断是男、女
            if face['gender']['type'] == 'female':
                age = face['age']
                beauty = face['beauty']

                if beauty >= 70:
                    print('发现一个 ' + str(age) + ' 岁的美女,颜值为:%d,满足条件!' % beauty)
                    find_plxjj = True
                    break
                else:
                    print('发现一个 ' + str(age) + ' 岁的女生,颜值为:%d,不及格,继续~' % beauty)
                    continue

    return find_plxjj

 

App的应用包名和初始Activity

package_name = 'com.ss.android.ugc.aweme'
activity_name = 'com.ss.android.ugc.aweme.splash.SplashActivity'

 

打开 Android 应用

def start_my_app(package_name, activity_name):

    os.popen('adb shell am start -n %s/%s' % (package_name, activity_name))

 

保存截图以及点赞

def save_video_met(screen_name, find_girl_num):

    img = Image.open(screen_name).convert('RGB')
    img.save("漂亮的小姐姐/DYGirl_%d.jpg" % find_girl_num)
    os.system("adb shell input tap 666 800")

 

向上划屏幕,播放下一段视频

def play_next_video():
    os.system("adb shell input swipe 540 1300 540 500 100")

 

截图并修剪保存

def get_screen_shot_part_img(image_name):
    # 截图
    os.system("adb shell /system/bin/screencap -p /sdcard/screenshot.jpg")
    os.system("adb pull /sdcard/screenshot.jpg %s" % image_name)
    # 打开图片
    img = Image.open(image_name).convert('RGB')
    # 图片的原宽、高
    w, h = img.size
    # 截取部分,去掉其头像、其他内容杂乱元素
    img = img.crop((0, 400, 1200, 2750))
    img.thumbnail((int(w / 1.5), int(h / 1.5)))
    # 保存到本地
    img.save(image_name)
    return image_name

 

人脸识别时长、次数

设置一条视频最长的识别时间,要是墨迹 10 秒还不露脸,也不管她了,直接下一个。

access_token = get_access_token()
# 识别时长
RECOGNITE_TOTAL_TIME = 10
# 识别次数
recognite_count = 0

 

视频识别

start_my_app(package_name, activity_name)
time.sleep(3)
print("开始播放视频~")
find_girl_num = 0
# 对当前视频截图去人脸识别
while True:
    # 开始识别的时间
    recognite_time_start = datetime.datetime.now()
    # 识别次数
    recognite_count = 1
    # 循环地去刷抖音
    while True:
        # 获取截图
        screen_name = get_screen_shot_part_img('images/temp%d.jpg' % recognite_count)
        # 人脸识别
        recognite_result = analysis_face(parse_face_pic(screen_name, TYPE_IMAGE_LOCAL, access_token))
        recognite_count += 1
        # 第n次识别结束后的时间
        recognite_time_end = datetime.datetime.now()
        # 这是一个美女
        if recognite_result:
            find_girl_num += 1
            save_video_met(screen_name, find_girl_num)
            print("已经发现 %d 个漂亮小姐姐" % find_girl_num)
            break
        else:
            if (recognite_time_end - recognite_time_start).seconds < RECOGNITE_TOTAL_TIME:
                continue
            else:
                print('跳过!!!!只想刷美女视频')
                # 跳出里层循环
                break

 

删除临时文件

shutil.rmtree('./images')
time.sleep(0.05)
os.mkdir('./images')

 

播放下一条视频

print('==' * 30)
time.sleep(1)
print('准备播放下一个视频~')
play_next_video()
import random
time.sleep(random.uniform(0,1))

 

最后

好了,今天的分享就到这里结束了!

大家觉得有用的话可以来个免费的点赞+收藏+关注,防止下次我悄悄更新了好东西却不知道!

有关基于Python实现自动刷抖音,进行人脸识别,不是小姐姐自动划走下一个!的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

随机推荐