当前位置:网站首页>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 .
边栏推荐
- Openbionics robot project introduction | bciduino community finishing
- A. ABC
- All ceramic crowns - current market situation and future development trend
- C import Xls data method summary II (save the uploaded file to the DataTable instance object)
- 1189. Maximum number of "balloons"
- 51 MCU external interrupt
- What is the intelligent monitoring system of sewage lifting pump station and does it play a big role
- The contact data on Jerry's management device supports reading and updating operations [articles]
- The difference between lambda expressions and anonymous inner classes
- Maximum likelihood method, likelihood function and log likelihood function
猜你喜欢

Three layer switching ①

SRCNN:Learning a Deep Convolutional Network for Image Super-Resolution

Three layer switching ②

ES6 deletes an attribute in all array objects through map, deconstruction and extension operators

What is the student party's Bluetooth headset recommendation? Student party easy to use Bluetooth headset recommended

Meta metauniverse female safety problems occur frequently, how to solve the relevant problems in the metauniverse?

Lightweight Pyramid Networks for Image Deraining

Do you know the eight signs of a team becoming agile?

Feign implements dynamic URL

1189. Maximum number of "balloons"
随机推荐
Pyrethroid pesticide intermediates - market status and future development trend
It's corrected. There's one missing < /script >, why doesn't the following template come out?
Make drop-down menu
IPv6 experiment
Huawei cloud micro certification Huawei cloud computing service practice has been stable
Meta metauniverse female safety problems occur frequently. How to solve the related problems in the metauniverse?
C import Xls data method summary IV (upload file de duplication and database data De duplication)
Hunan University | robust Multi-Agent Reinforcement Learning in noisy environment
Reading notes - learn to write: what is writing?
Winter vacation daily question -- a single element in an ordered array
Pytoch residual network RESNET
Write the first CUDA program
String hash, find the string hash value after deleting any character, double hash
Portapack application development tutorial (XVII) nRF24L01 launch C
A fan summed up so many interview questions for you. There is always one you need!
What is the intelligent monitoring system of sewage lifting pump station and does it play a big role
Some other configurations on Huawei's spanning tree
[typora installation package] old typera installation package, free version
Description of setting items of Jerry [chapter]
Why can't it run (unresolved)