查看: 238|回复: 0

[其他发布] 【源码分享】抖音批量下载作者所有视频

[复制链接]
发表于 2022-5-10 20:14 | 显示全部楼层 |阅读模式
非法程序、 2022-5-10 20:14 238 0 显示全部楼层
纯官方api,无第三方接口,直接放源码

  1. import os

  2. import requests
  3. import re
  4. from multiprocessing.dummy import Pool as ThreadPool


  5. class Douyin:
  6.     def __init__(self, url):
  7.         self.share_url = url
  8.         self.headers = {
  9.             'User-Agent': "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3"
  10.         }
  11.         self.sec_uid = None
  12.         self.nick_name = None

  13.     def get_user_info(self):
  14.         resp = requests.get(self.share_url, headers=self.headers)
  15.         self.sec_uid = re.search(r'sec_uid=[\S]{0,76}&', resp.url).group().strip('&').strip('sec_uid=')
  16.         user_info = f'https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={self.sec_uid}'
  17.         resp = requests.get(user_info, headers=self.headers)
  18.         user_data = {
  19.             'signature': resp.json()['user_info']['signature'],
  20.             'nickname': resp.json()['user_info']['nickname'],
  21.             'aweme_count': resp.json()['user_info']['aweme_count'],
  22.             'following_count': resp.json()['user_info']['following_count'],
  23.             'total_favorited': resp.json()['user_info']['total_favorited'],
  24.             'avatar': resp.json()['user_info']['avatar_larger']['url_list'][0]
  25.         }
  26.         self.nick_name = resp.json()['user_info']['nickname']
  27.         return user_data

  28.     def get_all_video(self):
  29.         max_cursor = 0
  30.         video_has_more = True
  31.         all_video_list = []
  32.         if self.sec_uid is None:
  33.             self.get_user_info()
  34.         while video_has_more is True:
  35.             json_url = f'https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid={self.sec_uid}&' \
  36.                        f'count=21&max_cursor={max_cursor}'
  37.             resp = requests.get(json_url, headers=self.headers)
  38.             video_has_more = resp.json()['has_more']
  39.             max_cursor = resp.json()['max_cursor']
  40.             video_list = resp.json()['aweme_list']
  41.             for i in video_list:
  42.                 all_video_list.append({'desc': i['desc'], 'vid': i['video']['vid'], 'aweme_id': i['aweme_id']})
  43.         return all_video_list

  44.     def down_video(self, down_info):
  45.         if os.path.exists(self.nick_name) is False:
  46.             try:
  47.                 os.makedirs(self.nick_name)
  48.             except FileExistsError:
  49.                 pass
  50.         if down_info['desc'] == '':
  51.             down_info['desc'] = down_info['aweme_id']
  52.         download_url = f'https://aweme.snssdk.com/aweme/v1/play/?video_id={down_info["vid"]}&ratio=1080p'
  53.         response = requests.get(download_url, headers=self.headers)
  54.         with open(f'{self.nick_name}/{down_info["desc"]}.mp4', 'wb') as file:
  55.             file.write(response.content)
  56.         print(down_info['aweme_id'] + ' 下载完毕')


  57. if __name__ == '__main__':
  58.     share_url = re.search(r'[a-zA-z]+://[^\s]*', input('输入分享链接:')).group()
  59.     douyin = Douyin(share_url)
  60.     info = douyin.get_user_info()
  61.     print(f'作者:{info["nickname"]}\n视频数:{info["aweme_count"]}')
  62.     down_list = douyin.get_all_video()
  63.     print(f'视频列表获取完毕开始下载 总视频数')
  64.     pool = ThreadPool(10)
  65.     results = pool.map(douyin.down_video, down_list)
  66.     pool.close()
  67.     pool.join()
复制代码
直接运行,然后输入分享复制的链接就好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表