抖音上好看的小姐姐,Python给你都下载了
liuian 2025-06-09 23:31 54 浏览
阅读文本大概需要 15 分钟。
1
目 标 场 景
相信大家平时刷抖音短视频的时候,看到颜值高的小姐姐,都有随手点赞关注的习惯。
如果一条条去刷确实很耗时间,如果 Python 能帮忙筛选出颜值高的小姐姐那就省了很多事。
本篇文章是借助「百度人脸识别」API,帮我们识别出抖音上颜值高的小姐姐,然后下载到手机相册中。
2
准 备 工 作
首先,项目需要对页面元素进行一些精准的操作,需要提前准备一部 Android 设备,激活开发者选项,并在开发者选项中打开 「USB 调试和指针位置」两处设置。
为了确保 adb 命令能正常使用,需要提前配置好 adb 开发环境。
页面元素中的部分元素没法利用 name 等常用属性获取到,可能需要获取到完整的「UI 树」,再利用 Airtest 判断是否存在某个 UI 元素。
另外,项目中会对视频进行人脸识别,获取到出现的所有人脸,再进行性别识别及颜值判断。
这里需要进行百度云后台,注册一个人脸识别的应用,获取到一组 「API Key 和 Secret Key」值。
然后利用官网提供的 API 文档即可获取到「access token」,由于 ak 的有效期为一个月,所以只需要初始化一次,后面就可以利用人脸识别接口进行正常的识别了。
appid = '你注册应用的appid'
api_key = '你注册应用的ak'
secret_key = '你注册应用的sk'
def get_access_token():
"""
其关access_token有效期一般有一个月
"""
# 此变量赋值成自己API Key的值
client_id = api_key
# 此变量赋值成自己Secret Key的值
client_secret = secret_key
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_token3
编 写 脚 本
在上面已经配置好了 adb 环境的情况下,可以直接借助 python 中的 os 模块执行 adb 命令打开抖音 App。
# 抖音App的应用包名和初始Activity
package_name = 'com.ss.android.ugc.aweme'
activity_name = 'com.ss.android.ugc.aweme.splash.SplashActivity'
def start_my_app(package_name, activity_name):
"""
打开应用
adb shell am start -n com.tencent.mm/.ui.LauncherUI
:param package_name:
:return:
"""
os.popen('adb shell am start -n %s/%s' % (package_name, activity_name))接着,我们需要截取当前播放视频的截图到本地。
需要注意的是,抖音视频播放界面包含视频创作者头像、BGM 创作者头像等一些杂乱的元素,可能对人脸识别的结果产生一些误差,所以需要对屏幕截图之后的图像进行「二次裁剪」处理。
def get_screen_shot_part_img(image_name):
"""
获取手机截图的部分内容
:return:
"""
# 截图
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')
# 图片的原宽、高(1080*2160)
w, h = img.size
# 截取部分,去掉其头像、其他内容杂乱元素
img = img.crop((0, 0, 900, 1500))
img.thumbnail((int(w / 1.5), int(h / 1.5)))
# 保存到本地
img.save(image_name)
return image_name现在可以使用百度提供的 API 获取到上面截图的人脸列表。
def parse_face_pic(pic_url, pic_type, access_token):
"""
人脸识别
5秒之内
:param pic_url:
:param pic_type:
:param access_token:
:return:
"""
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:
print('未识别到人脸')
return None
else:
# 返回所有的人脸
return json_faces从上述的人脸列表中筛选出性别为女,年龄为 18-30 岁之间,颜值超过 70 的小姐姐。
def analysis_face(face_list):
"""
分析人脸,判断颜值是否达标
18-30之间,女,颜值大于80
:param face_list:识别的脸的列表
:return:
"""
# 是否能找到高颜值的美女
find_belle = False
if face_list:
print('一共识别到%d张人脸,下面开始识别是否有美女~' % len(face_list))
for face in face_list:
# 判断是男、女
if face['gender']['type'] == 'female':
age = face['age']
beauty = face['beauty']
if 18 <= age <= 30 and beauty >= 70:
print('颜值为:%d,及格,满足条件!' % beauty)
find_belle = True
break
else:
print('颜值为:%d,不及格,继续~' % beauty)
continue
else:
print('性别为男,继续~')
continue
else:
print('图片中没有发现人脸.')
return find_belle由于视频是连续播放的,很难通过截取视频某一帧,判断视频有出现颜值高的小姐姐。
另外,大部分短视频播放时长为「10s+」,这里需要对每一个视频多次截图去做人脸识别,直到识别到颜值高的小姐姐。
# 一条视频最长的识别时间
RECOGNITE_TOTAL_TIME = 10
# 识别次数
recognite_count = 1
# 对当前视频截图去人脸识别
while True:
# 获取截图
print('开始第%d次截图' % recognite_count)
# 截取屏幕有用的区域,过滤视频作者的头像、BGM作者的头像
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.now()
# 这一条视频出现了颜值高的小姐姐
if recognite_result:
pass
else:
print('超时!!!这是一条没有吸引力的视频!')
# 跳出里层循环
break一旦当前播放的视频识别出有颜值高的小姐姐,就需要模拟保存视频到本地的操作。
获取「分享」和「保存本地」两个按钮的坐标位置,依次利用 adb 执行点击操作即可下载视频到本地。
def save_video_met():
"""
:return:
"""
# 分享
os.system("adb shell input tap 1000 1500")
time.sleep(0.05)
# 保存到本地
os.system("adb shell input tap 350 1700")另外,由于下载视频的过程是一个耗时操作,在下载进度对话框还未消失之前,需要做一个「模拟等待」的操作。
def wait_for_download_finished(poco):
"""
从点击下载,到下载完全
:return:
"""
element = Element()
while True:
# 由于是对话框,不能利用Element类来判断是否存在某个元素来准确处理
# element_result = element.findElementByName('正在保存到本地')
# 当前页面UI树元素信息
# 注意:保存的时候可能会获取元素异常,这里需要抛出,并终止循环
# com.netease.open.libpoco.sdk.exceptions.NodeHasBeenRemovedException: Node was no longer alive when query attribute "visible". Please re-select.
try:
ui_tree_content = json.dumps(poco.agent.hierarchy.dump(), indent=4).encode('utf-8').decode('unicode_escape')
except Exception as e:
print(e)
print('异常,按下载处理~')
break
if '正在保存到本地' in ui_tree_content:
print('还在下载中~')
time.sleep(0.5)
continue
else:
print('下载完成~')
break在视频保存到本地之后,就可以模拟向上滑动的操作,跳到播放「下一条视频」。
循环上面的操作,即可筛选出所有颜值高的小姐姐,并保存到本地。
def play_next_video():
"""
下一个视频
从下往上滑动
:return:
"""
os.system("adb shell input swipe 540 1300 540 500 100")在脚本一条条刷视频的过程中,可能会遇到一下广告,我们需要对这类视频进行过滤。
def is_a_ad():
"""
判断的当前页面上是否是一条广告
:return:
"""
element = Element()
ad_tips = ['去玩一下', '去体验', '立即下载']
find_result = False
for ad_tip in ad_tips:
try:
element_result = element.findElementByName(ad_tip)
# 是一条广告,直接跳出
find_result = True
break
except Exception as e:
find_result = False
return find_result4
结 果 结 论
运行上面的脚本,会自动打开抖音,对每一条小视频多次进行人脸识别,直到识别到颜值高的小姐姐,保存视频到本地,然后继续刷下一条短视频。
最后,小编想说:我是一名python开发工程师,
整理了一套最新的python系统学习教程,
想要这些资料的可以关注私信小编“01”即可(免费分享哦)希望能对你有所帮助
相关推荐
- win7正版怎么下载(我告诉你怎么下载win7)
-
如题,题主想在红警之家下载红警,很简单,可以用迅雷下载软件下载,下载以后用解压软件解压就行了,但是红警这款软件在winxp系统下,是最理想的,7系统下面会出现闪退的情况。下载很容易的,闪退的时候,设置...
- 电脑关机脚本bat命令(win10关机bat脚本)
-
bat关机命令需要使用文本文档。使用文本文档制作bat关机命令步骤如下所示:1、在电脑桌面空白处点击鼠标右键。2、在鼠标右键菜单中,选择新建文本文档。3、点击打开文本文档。4、在新建文本文档中输入关机...
- fat32格式是什么意思(u盘fAT32格式是什么意思)
-
是一种分区格式。这种格式使用32位文件分配表,大大提高了磁盘的管理能力,打破了每个分区只有4GB的FAT16限制。对于使用FAT32文件系统的每个逻辑盘内部空间又可划分为三部分,依次是引导区(BOO...
-
- 手机系统更新软件(手机系统更新软件不更新会怎样)
-
第一步:打开苹果手机的设置,点击“通用”选项进入。第二步:选择“软件更新”选项进入第三步:在软件更新界面,如果有新的更新,点击“下载并安装”即可!应用商店里一键更新。在手机软件里,为了更新最新版本可以进软件商店里面找一下,更新点一下,然后它...
-
2026-01-14 09:37 liuian
- 联想小新如何重装系统(联想小新重装系统怎么操作)
-
联想小新重装系统,方法∶在关机状态下,按下电脑的一键恢复按钮(需确保笔记本屏盖在打开状态)。首先找到按键孔,用针对准插孔,捅一下,电脑启动,进入启动选择界面,选择systemrecovery,按回车...
- 麦克风没声音(win11麦克风没声音)
-
一.先确保你的麦克风能正常使用。请确保麦克风本身是好的,连接线没有问题,请确保你的测试软件已正确设置,如YY之类的软件。二.确认你的麦克风是否插入正确的插孔一般麦克风是插入红色插孔中。三.确认你...
- vs2015官网下载(vs2015 下载)
-
VisualStudio2015下载完成之后,会有一个名为“vs2015.pro_chs.iso”的光盘镜像文件。光盘镜像文件将光盘镜像文件在虚拟光驱中加载之后,可以打开查看光盘内容。安装文件双...
- u盘自我保护怎么解除(怎么样取消u盘的自我保护)
-
要解除U盘保护,首先插入U盘后打开“我的电脑”,右击选择U盘图标,点击“属性”。在弹出的对话框中,选择“安全”标签,然后点击“编辑”按钮,根据自己的需要选择或取消“对于系统用户完全控制”权限,点击“确...
- 如何设置自动关机win10(windows 10如何设置自动关机)
-
Win10设置自动关机,需要以下步骤:1.按“Win+R”组合键,呼出“运行”;2.将定时关机命令设置为“shutdown-s-t7200”;3.在“运行”内输入命令,点击“确定”即可;4.如果设置错...
- 公版驱动(公版驱动和专用驱动的区别)
-
公版这个名词特指显卡本身,与驱动无关。一般采用芯片制造商自己设计的显卡,称为公版。显卡驱动只有WHQL版本、Beta版本、兼容版、定制版之分。兼容版一般称为万能驱动,不会给显卡带来多少优化,只是让你能...
- nod32是什么软件(nod32是哪个国家的)
-
起源于捷克斯洛伐克总部现在美国下面是nod32的由来:nod是根据一部电视剧(城市边缘的医院)起的,原意是“磁盘边的医院”32是源于当16-bitNOD-ICE很成熟的时候32位处理器出来了升级适应3...
- 欧拉linux系统官网(欧拉系统命令)
-
在华为欧拉服务器上配置Linux网络,首先需要编辑网络配置文件,位于/etc/sysconfig/network-scripts目录下,根据网络需求配置对应的网络接口,IP地址、子网掩码、网关等信息,...
- deepin安装显卡驱动(deepin安装显卡驱动后无法进入图形界面)
-
1、首先必须使用rufus制作U盘启动,必须选择DD格式2、从其他linux镜像比如Ubantu或其他拷贝出EFI的引导文件,具体是镜像中的EFI—boot—grubx86.efi这个文件,把这个文件...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
