mirror of
https://github.com/imgyh/tiktok.git
synced 2025-04-06 03:35:44 +08:00
282 lines
9.1 KiB
Python
282 lines
9.1 KiB
Python
#!/usr/bin/env python
|
||
# -*- encoding: utf-8 -*-
|
||
|
||
'''
|
||
@Description:TikTok.py
|
||
@Date :2023/02/11 13:06:23
|
||
@Author :imgyh
|
||
@version :1.0
|
||
@Github :https://github.com/imgyh
|
||
@Mail :admin@imgyh.com
|
||
-------------------------------------------------
|
||
Change Log :
|
||
-------------------------------------------------
|
||
'''
|
||
|
||
import time
|
||
import copy
|
||
|
||
class Result(object):
|
||
def __init__(self):
|
||
# 作者信息
|
||
self.authorDict = {
|
||
"avatar_thumb": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"avatar": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"cover_url": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
# 喜欢的作品数
|
||
"favoriting_count": "",
|
||
# 粉丝数
|
||
"follower_count": "",
|
||
# 关注数
|
||
"following_count": "",
|
||
# 昵称
|
||
"nickname": "",
|
||
# 是否允许下载
|
||
"prevent_download": "",
|
||
# 用户 url id
|
||
"sec_uid": "",
|
||
# 是否私密账号
|
||
"secret": "",
|
||
# 短id
|
||
"short_id": "",
|
||
# 签名
|
||
"signature": "",
|
||
# 总获赞数
|
||
"total_favorited": "",
|
||
# 用户id
|
||
"uid": "",
|
||
# 用户自定义唯一id 抖音号
|
||
"unique_id": "",
|
||
# 年龄
|
||
"user_age": "",
|
||
|
||
}
|
||
# 图片信息
|
||
self.picDict = {
|
||
"height": "",
|
||
"mask_url_list": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
}
|
||
# 音乐信息
|
||
self.musicDict = {
|
||
"cover_hd": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"cover_large": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"cover_medium": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"cover_thumb": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
# 音乐作者抖音号
|
||
"owner_handle": "",
|
||
# 音乐作者id
|
||
"owner_id": "",
|
||
# 音乐作者昵称
|
||
"owner_nickname": "",
|
||
"play_url": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_key": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
# 音乐名字
|
||
"title": "",
|
||
}
|
||
# 视频信息
|
||
self.videoDict = {
|
||
"play_addr": {
|
||
"uri": "",
|
||
"url_list": "",
|
||
},
|
||
"cover_original_scale": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"dynamic_cover": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"origin_cover": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
},
|
||
"cover": {
|
||
"height": "",
|
||
"uri": "",
|
||
"url_list": [],
|
||
"width": ""
|
||
}
|
||
}
|
||
# 作品信息
|
||
self.awemeDict = {
|
||
# 作品创建时间
|
||
"create_time": "",
|
||
# awemeType=0 视频, awemeType=1 图集, awemeType=2 直播
|
||
"awemeType": "",
|
||
# 作品 id
|
||
"aweme_id": "",
|
||
# 作者信息
|
||
"author": self.authorDict,
|
||
# 作品描述
|
||
"desc": "",
|
||
# 图片
|
||
"images": [],
|
||
# 音乐
|
||
"music": self.musicDict,
|
||
# 视频
|
||
"video": self.videoDict,
|
||
# 作品信息统计
|
||
"statistics": {
|
||
"admire_count": "",
|
||
"collect_count": "",
|
||
"comment_count": "",
|
||
"digg_count": "",
|
||
"play_count": "",
|
||
"share_count": ""
|
||
}
|
||
}
|
||
# 用户作品信息
|
||
self.awemeList = []
|
||
# 直播信息
|
||
self.liveDict = {
|
||
# awemeType=0 视频, awemeType=1 图集, awemeType=2 直播
|
||
"awemeType": "",
|
||
# 是否在播
|
||
"status": "",
|
||
# 直播标题
|
||
"title": "",
|
||
# 直播cover
|
||
"cover": "",
|
||
# 头像
|
||
"avatar": "",
|
||
# 观看人数
|
||
"user_count": "",
|
||
# 昵称
|
||
"nickname": "",
|
||
# sec_uid
|
||
"sec_uid": "",
|
||
# 直播间观看状态
|
||
"display_long": "",
|
||
# 推流
|
||
"flv_pull_url": "",
|
||
# 分区
|
||
"partition": "",
|
||
"sub_partition": "",
|
||
# 最清晰的地址
|
||
"flv_pull_url0": "",
|
||
}
|
||
|
||
# 将得到的json数据(dataRaw)精简成自己定义的数据(dataNew)
|
||
# 转换得到的数据
|
||
def dataConvert(self, awemeType, dataNew, dataRaw):
|
||
for item in dataNew:
|
||
try:
|
||
# 作品创建时间
|
||
if item == "create_time":
|
||
dataNew['create_time'] = time.strftime(
|
||
"%Y-%m-%d %H.%M.%S", time.localtime(dataRaw['create_time']))
|
||
continue
|
||
# 设置 awemeType
|
||
if item == "awemeType":
|
||
dataNew["awemeType"] = awemeType
|
||
continue
|
||
# 当 解析的链接 是图片时
|
||
if item == "images":
|
||
if awemeType == 1:
|
||
for image in dataRaw[item]:
|
||
for i in image:
|
||
self.picDict[i] = image[i]
|
||
# 字典要深拷贝
|
||
self.awemeDict["images"].append(copy.deepcopy(self.picDict))
|
||
continue
|
||
# 当 解析的链接 是视频时
|
||
if item == "video":
|
||
if awemeType == 0:
|
||
self.dataConvert(awemeType, dataNew[item], dataRaw[item])
|
||
continue
|
||
# 将小头像放大
|
||
if item == "avatar":
|
||
for i in dataNew[item]:
|
||
if i == "url_list":
|
||
for j in self.awemeDict["author"]["avatar_thumb"]["url_list"]:
|
||
dataNew[item][i].append(j.replace("100x100", "1080x1080"))
|
||
elif i == "uri":
|
||
dataNew[item][i] = self.awemeDict["author"]["avatar_thumb"][i].replace("100x100",
|
||
"1080x1080")
|
||
else:
|
||
dataNew[item][i] = self.awemeDict["author"]["avatar_thumb"][i]
|
||
continue
|
||
|
||
# 原来的json是[{}] 而我们的是 {}
|
||
if item == "cover_url":
|
||
self.dataConvert(awemeType, dataNew[item], dataRaw[item][0])
|
||
continue
|
||
|
||
# 根据 uri 获取 1080p 视频
|
||
if item == "play_addr":
|
||
dataNew[item]["uri"] = dataRaw["bit_rate"][0]["play_addr"]["uri"]
|
||
# 使用 这个api 可以获得1080p
|
||
dataNew[item]["url_list"] = "https://aweme.snssdk.com/aweme/v1/play/?video_id=%s&ratio=1080p&line=0" \
|
||
% dataNew[item]["uri"]
|
||
continue
|
||
|
||
# 常规 递归遍历 字典
|
||
if isinstance(dataNew[item], dict):
|
||
self.dataConvert(awemeType, dataNew[item], dataRaw[item])
|
||
else:
|
||
# 赋值
|
||
dataNew[item] = dataRaw[item]
|
||
except Exception as e:
|
||
# 删除这个警告, 总是让人误会出错了
|
||
# print("[ 警告 ]:转换数据时在接口中未找到 %s\r" % (item))
|
||
pass
|
||
|
||
def clearDict(self, data):
|
||
for item in data:
|
||
# 常规 递归遍历 字典
|
||
if isinstance(data[item], dict):
|
||
self.clearDict(data[item])
|
||
elif isinstance(data[item], list):
|
||
data[item] = []
|
||
else:
|
||
data[item] = "" |