[Python] Первый выпуск: пакетная загрузка всех видео без водяных знаков одного пользователя на Douyin.
[Python] Первый выпуск: пакетная загрузка всех видео без водяных знаков одного пользователя на Douyin.

Прежде всего заявлено, что этот метод предназначен только для личного обучения и общения, а незаконная прибыль строго запрещена.

  1. Получите ссылку для общего доступа на домашней странице пользователя: нажмите в правом верхнем углу домашней страницы пользователя, чтобы получить ссылку для общего доступа.

Получите похожие ссылки для обмена: Запишите прекрасную жизнь на Douyin! https://v.douyin.com/eSN7g1c/

  1. Запустите программу, чтобы пакетно загружать видео пользователя без водяных знаков:
  • Получите никнейм пользователя TikTok и создайте папку с таким же именем для его хранения.
  • Проверьте, публиковал ли пользователь видео во все периоды времени.,Если количество чеков равно 0, пропустите его.,Если не 0, скачайте
  • Скачайте и сохраните, номер такой же, как номер на главной странице пользователя.
  • Проверьте это, водяного знака действительно нет, бинго!
  1. Поделитесь идеями программы

1. Извлеките URL-адрес на основе ссылки, опубликованной на странице пользователя. 2. Сделайте запрос на основе URL-адреса, получите headers['location'], отключив перенаправление, а затем извлеките из него sec_id. 3. Объедините весь запрос списка видео. URL-адреса пользователя, а затем загрузите и сохраните их. Пример параметров запроса приведен ниже: params = { 'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk', #Разное для каждого пользователя'count' : '200', #Количество видео в списке видео, возвращаемое для каждого запроса, не рекомендуется быть слишком большим'min_cursor': '1612108800000', #Время начала пользовательского видео с меткой времени в миллисекундах 'max_cursor': '1619251716404', # Время окончания пользовательского видео с меткой времени в миллисекундах 'aid': '1128', #Неизвестный параметр, необязательный' _signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR' #Значение подписи, скопируйте его прямо из параметров запроса и всегда сможете его использовать}

  1. Ключевой код: 1). Извлеките URL-адрес из общей ссылки.
Язык кода:javascript
копировать
string = input('Вставьте ссылку для общего доступа:')
shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]

2) Запросите указанный выше URL-адрес, отключите перенаправление, чтобы получить значение местоположения, и извлеките sec_id в регулярное выражение.

Язык кода:javascript
копировать
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]

3) Объедините URL-адрес запроса информации о пользователе, чтобы получить псевдоним пользователя. Здесь можно получить только псевдоним.

Язык кода:javascript
копировать
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']

4).Создайте папку с тем же именем, что и никнейм пользователя, и переключитесь на этот путь.

Язык кода:javascript
копировать
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)

5) При создании временных меток видео можно напрямую использовать большой период времени. Однако в ходе теста было обнаружено, что если временной интервал слишком велик, количество загруженных видео будет уменьшаться. определили, что интервал 1 месяц, годы с 2018 по 2021, более ранних видео практически нет, так?

Язык кода:javascript
копировать
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)

6). На этом этапе вы получили все параметры в params, напрямую подключили URL-адрес списка видео и сохранили возвращаемый результат в формате json.

Язык кода:javascript
копировать
awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
       awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
       data = json.loads(awemehtml)

7) Извлеките нужный нам контент непосредственно из json {"Количество видео", "Название видео", "URL-адрес видео без водяных знаков"}, а затем чего же вы ждете, загрузите его?

Язык кода:javascript
копировать
awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')

Полное совместное использование кода:

Язык кода:javascript
копировать
import requests
import json
import os
import time
import re
"""
1. Извлеките короткий URL-адрес на основе строки, общей для страницы пользователя.
2. Получите местоположение на основе короткого URL-адреса плюс 302 и извлеките sec_id.
3. URL-адрес запроса на объединение списка видео
params = {
    'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk',
    'count' : '200',
    'min_cursor' : '1612108800000',
    'max_cursor' : '1619251716404',
    'aid' : '1128',
    '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
}
"""
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Mobile Safari/537.36"
}
# string  = «На Доуине запишите прекрасную жизнь!» https://v.douyin.com/ekkTsYw/'
string = input('Вставьте ссылку для общего доступа:')
 
shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]
print(shroturl)
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']
print(userinfo['user_info']['nickname'])
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)
 
"""new function"""
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)
 
        params = {
            'sec_uid' : sec_uid,
            'count' : 200,
            'min_cursor' : t1,
            'max_cursor' : t2,
            'aid' : 1128,
            '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
        }
        awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
        awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
        data = json.loads(awemehtml)
        # print(data)
        # print(type(data))
        awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose