社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

好看小姐姐的抖音短视频,我用Python一键全保存

51CTO官微 • 5 年前 • 840 次点击  



目 标 场 景



相信大家平时刷抖音短视频的时候,看到颜值高的小姐姐,都有随手点赞关注的习惯。


如果一条条去刷确实很耗时间,如果 Python 能帮忙筛选出颜值高的小姐姐那就省了很多事。


本篇文章是借助「百度人脸识别」API,帮我们识别出抖音上颜值高的小姐姐,然后下载到手机相册中。



准 备 工 作



首先,项目需要对页面元素进行一些精准的操作,需要提前准备一部 Android 设备,激活开发者选项,并在开发者选项中打开 「USB 调试和指针位置」两处设置。


为了确保 adb 命令能正常使用,需要提前配置好 adb 开发环境。


页面元素中的部分元素没法利用 name 等常用属性获取到,可能需要获取到完整的「UI 树」,再利用 Airtest 判断是否存在某个 UI 元素。



# 安装依赖pip3 install pocoui



另外,项目中会对视频进行人脸识别,获取到出现的所有人脸,再进行性别识别及颜值判断。


这里需要进行百度云后台,注册一个人脸识别的应用,获取到一组 API Key 和 Secret Key」值


https://console.bce.baidu.com



然后利用官网提供的 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_token



编  写  脚  本



在上面已经配置好了 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((009001500))

    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_result


结 果 结 论



运行上面的脚本,会自动打开抖音,对每一条小视频多次进行人脸识别,直到识别到颜值高的小姐姐,保存视频到本地,然后继续刷下一条短视频。



我已经将全部源码上传到后台上,公众号后台回复「 小姐姐 」即可获得。

如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。

文章转自AirPython,微信号( AirPython),版权归原作者所有,仅供分享使用。欢迎转发留言或者点“在看”。



近期热文

☟☟☟(点击下方文字即可查看)



全国6.5亿网民月收入不足5000元?网友板凳坐不住了

透过蒋凡揭秘阿里,何为M7?何谓合伙人?

程序员崩溃的40多个瞬间!!!太形象了,你遇到过几个?

一根网线发起的攻击

如何用一句话激怒程序员!

网易云音乐坚决姓“社”

雷军的代码像诗一样优雅(94年写的),网友直呼:跪着读完!

我想过39岁找工作会辛苦,没想到会这么残酷

互联网社畜鄙视链:你会是最先被裁的那个吗?

开眼界了,迅雷宫斗背后的权力游戏

字节跳动只剩下小米这一个朋友了


我知道你  在看  哦



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62473
 
840 次点击