# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: JHC000abc@gmail.com
@file: test_download.py
@time: 2024/7/5 14:54
@desc:
"""
from sdk.temp.temp_supports import IsSolution, DM
from sdk.utils.util_network import NetWorkRequests
from sdk.utils.util_encrypt import EncryptProcess
class Solution(IsSolution):
def __init__(self, **kwargs):
super(Solution, self).__init__()
self.__dict__.update({k: v for k, v in [
i for i in locals().values() if isinstance(i, dict)][0].items()})
self.net = NetWorkRequests()
self.encrypt = EncryptProcess()
self.name_lis = []
@DM.add_project()
def mit(self, url, name, headers):
"""
:param url:
:param save_file:
:return:
"""
result = self.net.download_videos(url=url, headers=headers, file=f"videos/{name}.mp4", max_size=1024 * 100000)
print(result)
return result
def process(self, **kwargs):
"""
:param kwargs:
:return:
"""
def get_url(self, pcursor="", userId="3xs9sbmjg9hhtic"):
"""
:param pcursor:
:param userId:
:return:
"""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"content-type": "application/json",
}
cookies = {
"did": "换成自己的",
"userId": "换成自己的",
"kuaishou.server.web_st": "换成自己的",
}
url = "https://www.kuaishou.com/graphql"
data = {
"variables": {
"userId": f"{userId}",
"pcursor": pcursor,
"page": "profile"
},
"query": "fragment photoContent on PhotoEntity {\n __typename\n id\n duration\n caption\n originCaption\n likeCount\n viewCount\n commentCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n musicBlocked\n riskTagContent\n riskTagUrl\n}\n\nfragment recoPhotoFragment on recoPhotoEntity {\n __typename\n id\n duration\n caption\n originCaption\n likeCount\n viewCount\n commentCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n musicBlocked\n riskTagContent\n riskTagUrl\n}\n\nfragment feedContent on Feed {\n type\n author {\n id\n name\n headerUrl\n following\n headerUrls {\n url\n __typename\n }\n __typename\n }\n photo {\n ...photoContent\n ...recoPhotoFragment\n __typename\n }\n canAddComment\n llsid\n status\n currentPcursor\n tags {\n type\n name\n __typename\n }\n __typename\n}\n\nquery visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n hostName\n pcursor\n __typename\n }\n}\n"
}
status, response = self.net._requests(url, headers=headers, cookies=cookies, json=data)
# print(response.json())
pcursor = response.json()["data"]["visionProfilePhotoList"]["pcursor"]
for arg in response.json()["data"]["visionProfilePhotoList"]["feeds"]:
url = arg["photo"]["photoUrl"]
name = self.encrypt.make_md5(data=arg["photo"]["caption"])
print(name, url)
# 下载视频
self.mit(url, name, headers)
self.name_lis.append(name)
print("pcursor", pcursor)
if pcursor and pcursor != "no_more":
self.get_url(pcursor)
else:
print("self.name_lis", self.name_lis)
DM.close_pool()
self.merge_result()
return None
实测:多线程连续下几千条没什么问题