当前位置:网站首页>Yyds dry goods inventory hand-in-hand teach you the development of Tiktok series video batch Downloader
Yyds dry goods inventory hand-in-hand teach you the development of Tiktok series video batch Downloader
2022-07-04 01:51:00 【Python advanced】
Application demonstration
Hello everyone , I'm Xiaoming . Here we have developed a Tiktok Video Downloader , The opening effect is as follows :
If the local Google viewer has never visited the Tiktok homepage before , Click the start download button and the following output will appear :
At this point, we just need to click Visit Tiktok Homepage , The program will use the local Google viewer to access the Tiktok homepage . Click the download button again :
You can see that this video is a collection video :
Then the program only needs to check the first option to download the whole collection :
In this way, the whole collection can be downloaded at one time :
Development process
First of all, according to the previous article : Extract Google viewer Cookie Five realms of
Read the location of Google Explorer installation and local Tiktok related cookie:
"""
Xiao Ming's code
CSDN Home page :https://blog.csdn.net/as604049322
"""
__author__ = ' Xiaoming '
__time__ = '2022/1/23'
import base64
import json
import os
import sqlite3
import winreg
import win32crypt
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def load_local_key(localStateFilePath):
" Read chrome Save in json In the document key Proceed again base64 Decoding and DPAPI Decrypt to get the real AESGCM key"
with open(localStateFilePath, encoding='u8') as f:
encrypted_key = json.load(f)['os_crypt']['encrypted_key']
encrypted_key_with_header = base64.b64decode(encrypted_key)
encrypted_key = encrypted_key_with_header[5:]
key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
return key
def decrypt_value(key, data):
"AESGCM Decrypt "
nonce, cipherbytes = data[3:15], data[15:]
aesgcm = AESGCM(key)
plaintext = aesgcm.decrypt(nonce, cipherbytes, None).decode('u8')
return plaintext
def fetch_host_cookie(host):
" Get all under the specified domain name cookie"
userDataDir = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data'
localStateFilePath = userDataDir + r'\Local State'
cookiepath = userDataDir + r'\Default\Cookies'
# 97 The version has already Cookies Move to Network Under the table of contents
if not os.path.exists(cookiepath) or os.stat(cookiepath).st_size == 0:
cookiepath = userDataDir + r'\Default\Network\Cookies'
# print(cookiepath)
sql = f"select name,encrypted_value from cookies where host_key like '%.{host}'"
cookies = {}
key = load_local_key(localStateFilePath)
with sqlite3.connect(cookiepath) as conn:
cu = conn.cursor()
for name, encrypted_value in cu.execute(sql).fetchall():
cookies[name] = decrypt_value(key, encrypted_value)
return cookies
def get_chrome_path():
try:
key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r"ChromeHTML\Application")
path = winreg.QueryValueEx(key, "ApplicationIcon")[0]
chrome_path = path[:path.rfind(",")]
return chrome_path
except FileNotFoundError as e:
return
if __name__ == '__main__':
print(fetch_host_cookie("douyin.com"))
print(get_chrome_path())
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
With this tool class , We no longer need to use selenium.
Then the core code of video parsing is as follows :
def get_video_url(url, cookies):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
"referer": "https://www.douyin.com"
}
res = requests.get(url, headers=headers, cookies=cookies)
if res.status_code == 200:
RENDER_DATA, = re.findall(
r'<script id="RENDER_DATA" type="application/json">([^<>]+)</script>', res.text)
data = json.loads(unquote(RENDER_DATA))
key = '8' if url.find("collection") != -1 else '34'
try:
detail = data[key]['aweme']['detail']
title = detail['desc']
except Exception as e:
print(f"{url} Invalid , Wrong report key:", e)
return
if not title:
title, = re.findall("<title[^>]+>\s*([^>]+)\s*</title>", res.text)
video_url = urljoin(url, detail['video']['playApi'])
collection_urls = set(re.findall("//www.douyin.com/collection/\d+/\d+", res.text))
collection_urls = [urljoin("https://www.douyin.com", url) for url in collection_urls]
collection_urls.sort(key=lambda s: int(s[s.rfind("/") + 1:]))
collection_title = re.findall("<h2 [^>]+>([^<>]+)</h2>", res.text)[0]
return video_url, title, collection_urls, collection_title
else:
print(' Video link request failed !!!')
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
The core code of video download :
def download_video(video_url, title, folder):
start_time = time.time()
res = requests.get(url=video_url, stream=True)
done_size, total = 0, int(res.headers['content-length'])
chunk_size = 1024 * 1024
title = format_filename(title)
file_size = round(int(res.headers['content-length']) / 1024 / 1024, 2)
basename = f"{title}.mp4"
filename = f"{folder}/{title}.mp4"
if os.path.exists(filename):
print(basename, " Already exists , skip ...")
return
print("-----------------------------------")
print(f' Start downloading files :{basename}\n Current file size :{file_size}MB')
with open(filename, 'wb') as f:
for chunk in res.iter_content(chunk_size):
f.write(chunk)
done_size += len(chunk)
cost_time = time.time() - start_time
yield done_size, cost_time, total
# print(f" speed of progress :{done_size / total:.2%},{done_size / cost_time / 1024 / 1024:.2f}MB/s")
cost_time = time.time() - start_time
print(f' file :{basename} Download complete !\n Time consuming :{cost_time:0.2f} second ')
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
Analysis of video links , You can refer to brother Cai's article :
《 use Python Shake it X No watermark short video download 》
link :https://mp.weixin.qq.com/s/NNVT6IH6dpT0rTeu1-oD6w
UI The core code of interface design is as follows :
layout = [
[sg.Text(' Tiktok video address :', font=(" Regular script ", 12)),
sg.In(key='url', size=(70, 1), text_color="#bb8b59",
default_text="https://www.douyin.com/video/6803929443069988103")],
[sg.Checkbox(' If it is a collection, download the whole collection ', key="download_collection", default=False),
sg.Button(' Start the download '),
sg.Button(' Clear output '),
sg.Button(' Visit Tiktok Homepage '),
sg.Button(' Visit the current address '),
],
[sg.Output(size=(85, 10), key="out", text_color="#15d36a")],
[
sg.ProgressBar(1000, size=(20, 20), key='video_bar', bar_color=("#bb8b59", "#295273")),
sg.Text('000.0MB,00/00\n00:00<00:00', key="message_video"),
sg.ProgressBar(1000, size=(20, 20), key='progressbar', bar_color=("#15d36a", "#295273")),
sg.Text('00.00MB/00.00MB\n00.00MB/s', key="message")
],
[sg.Text(' The output directory :', font=(" Regular script ", 12)),
sg.In(size=(35, 1), key="save_dir"),
sg.FolderBrowse('...', target='save_dir', initial_folder="."),
sg.Checkbox(' After downloading \n Open the directory ', key="open_folder", default=True),
sg.Button(' Open the output directory '),
],
[sg.Text("@ Xiaoming :https://blog.csdn.net/as604049322"), ],
]
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
Program download
The complete code of the tool and the download address of the packaged tool :
https://gitcode.net/as604049322/python_gui/-/tree/master/douyin
- 1.
friends , Practice it quickly ! If in the process of learning , Any problems encountered , Welcome to add my friend , I'll pull you in Python The learning exchange group discusses learning together .
边栏推荐
- mysql使用視圖報錯,EXPLAIN/SHOW can not be issued; lacking privileges for underlying table
- When the watch system of Jerry's is abnormal, it is used to restore the system [chapter]
- The reasons why QT fails to connect to the database and common solutions
- Hamburg University of Technology (tuhh) | intelligent problem solving as integrated hierarchical reinforcement learning
- File contains vulnerability summary
- Jerry's update contact [article]
- Setting function of Jerry's watch management device [chapter]
- What are the advantages and disadvantages of data center agents?
- How to view the computing power of GPU?
- The latest analysis of hoisting machinery command in 2022 and free examination questions of hoisting machinery command
猜你喜欢
Openbionics exoskeleton project introduction | bciduino community finishing
What is the student party's Bluetooth headset recommendation? Student party easy to use Bluetooth headset recommended
Iclr2022 | ontoprotein: protein pre training integrated with gene ontology knowledge
What is the intelligent monitoring system of sewage lifting pump station and does it play a big role
When the watch system of Jerry's is abnormal, it is used to restore the system [chapter]
After listening to the system clear message notification, Jerry informed the device side to delete the message [article]
LeetCode 168. Detailed explanation of Excel list name
Maximum likelihood method, likelihood function and log likelihood function
Valentine's Day - 9 jigsaw puzzles with deep love in wechat circle of friends
Hash table, string hash (special KMP)
随机推荐
C import Xls data method summary IV (upload file de duplication and database data De duplication)
LeetCode226. Flip binary tree
Gee: create a new feature and set corresponding attributes
Iclr2022 | ontoprotein: protein pre training integrated with gene ontology knowledge
MySQL statement learning record
Gnupg website
Huawei rip and BFD linkage
Neo4j learning notes
Introduction to Tianchi news recommendation: 4 Characteristic Engineering
It's corrected. There's one missing < /script >, why doesn't the following template come out?
When tidb meets Flink: tidb efficiently enters the lake "new play" | tilaker team interview
MPLS③
What is the intelligent monitoring system of sewage lifting pump station and does it play a big role
Servlet simple verification code generation
The automatic control system of pump station has powerful functions and diverse application scenarios
[leetcode daily question] a single element in an ordered array
C import Xls data method summary V (complete code)
Luogu p1309 Swiss wheel
Three layer switching ②
Idea if a class cannot be found, it will be red