原理:通过网上某个Instagram下载网站接口 实现模拟python下载
功能:有pyqt6实现的界面,输入 url地址 一键批量下载
1.提取接口环节
地址:aHR0cHM6Ly9pZ2xvZy53emp1bi5jb20vemgtY24=
F12 抓包分析
提取的视频地址在这 ,发现有个token值是密文,找来找去发现就在这个接口响应里面
然后通过python切割提取一下就行
接口很容易就解决了,也不需要逆向分析
然后很简单吧,就设计一个pyqt界面
博主也是第一天接触pyqt6 ,AI 帮写的,代码分享仅供学习
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/12/24 0:08
# @AuThor : 理想爱爬虫
# @file : demo4.py
import sys
import threading
import requests
import json
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTextEdit, QLabel
from PyQt6.QtCore import Qt, pyqtSignal, QObject
# 下载视频的函数
def download_video(insurl, save_path, callback):
try:
headers = {
####################
}
url = ##自己去接口拿###
data = {"url": insurl}
response = requests.post(url, headers=headers, data=data)
if response.status_code != 200:
callback(f"请求失败,状态码:{response.status_code},URL:{insurl}")
return False
data = response.json()
token1 = data['data']['progressive'][0]['video']['videourl'].split('=')[1].split('&')[0]
headers2 = {
######################
}
url2 =########自己去接口拿######
params = {"token": token1}
response = requests.get(url2, headers=headers2, params=params)
if response.status_code == 206:
with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
callback(f"部分视频文件已下载并保存为 '{save_path}'")
return True
elif response.status_code == 200:
with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
callback(f"视频文件已下载并保存为 '{save_path}'")
return True
else:
callback(f"请求失败,状态码:{response.status_code},URL:{insurl}")
return False
except Exception as e:
callback(f"下载视频时发生错误: {e}")
return False
# 多线程下载
def download_thread(insurl, save_path, callback):
threading.Thread(target=download_video, args=(insurl, save_path, callback)).start()
# UI 界面类
class VideoDownloaderUI(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Instagram 视频下载器")
self.setGeometry(100, 100, 500, 300)
# 布局
layout = QVBoxLayout()
self.url_input = QTextEdit(self)
self.url_input.setPlaceholderText("输入多个 Instagram 视频 URL,一行一个")
layout.addWidget(self.url_input)
self.download_button = QPushButton("开始下载", self)
self.download_button.clicked.connect(self.start_download)
layout.addWidget(self.download_button)
self.status_label = QLabel("状态: 等待下载", self)
layout.addWidget(self.status_label)
self.setLayout(layout)
# 处理下载状态信息
def update_status(self, status_message):
self.status_label.setText(f"状态: {status_message}")
def start_download(self):
urls = self.url_input.toPlainText().splitlines()
if not urls:
self.update_status("状态: 请先输入 URL")
return
# 显示状态
self.update_status("状态: 下载中...")
# 多线程下载
for i, url in enumerate(urls):
save_path = f"D:/spider/Instagram下载/downloads/video_{i+1}.mp4"
download_thread(url, save_path, self.update_status)
# 启动 PyQt6 应用程序
if __name__ == "__main__":
app = QApplication(sys.argv)
window = VideoDownloaderUI()
window.show()
sys.exit(app.exec())
|