吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2136|回复: 29
上一主题 下一主题
收起左侧

[Python 原创] 某瓜视频下载python脚本

  [复制链接]
跳转到指定楼层
楼主
xinxiu 发表于 2024-4-27 21:18 回帖奖励
感谢@LoveCode大佬的 https://www.52pojie.cn/thread-1917707-1-1.html 分析,弄了个脚本出来,大神们请略过
音、视频分开的情况,需要自己配置FFMPEG路径。没有弄合集下载,有兴趣的大佬,请帮弄好贴上来,谢谢。

[Python] 纯文本查看 复制代码
'''
by 52pojie-xinxiu
2024.4.27  一种情况是有dynamic_video的,一种情况是没有dynamic_video的情况视频和音频分开,下载后需要合并
另一种是video_list只有视频包含音频,代码自动判断可能出现的情况,并下载
'''
import base64
import json
import os.path
import re
import subprocess
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import requests
from tqdm import tqdm

headers = {
    "cookie": "填入你自己的cookie,不然运行代码会出错",
    "Referer": "https://www.ixigua.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

def aes_decrypt(data: str, key: str) -> str:
    data = base64.b64decode(data)
    key = key.encode()
    iv = key[:16]

    # mode 为 CBC、pad 为 PKcs7
    cipher = AES.new(key, AES.MODE_CBC, iv)
    res = cipher.decrypt(data)
    res = unpad(res, AES.block_size)
    res = base64.b64decode(res).decode()
    return res

def downloadFile(url, name):
    print(f'开始下载: {name}')
    resp = requests.get(url, headers=headers)
    if not os.path.exists('movie'):
        os.mkdir('movie')
    with open(f'movie/{name}', mode='wb') as f:
        f.write(resp.content)
    print(f'完成下载: {name}')


def downloadAll(video_url, audio_url, title):
    if not os.path.exists('movie'):
        os.mkdir('movie')
    if not os.path.exists(f'movie/{title}-merger.mp4'):
        if audio_url:  # 如果音频链接存在,说明需要合并
            downloadFile(video_url, title + '.mp4')
            downloadFile(audio_url, title + '.mp3')
            command = f'ffmpeg -i movie/{title}.mp4 -i movie/{title}.mp3 -c:v copy -c:a aac -strict experimental movie/{title}-merger.mp4'
            print('开始合并音频视频......')
            subprocess.run(command, shell=True)
            os.remove(f'movie/{title}.mp4')
            os.remove(f'movie/{title}.mp3')
            print(f'完成合并,见目录: movie/{title}-merger.mp4')
        else:  # 如果音频链接不存在,直接下载视频文件
            downloadFile(video_url, title + '.mp4')
            print(f'完成下载: {title}.mp4')



def main(url):
    resp = requests.get(url=url, headers=headers)
    resp.encoding = 'utf-8'
    if resp.status_code == 200:
        res_html = resp.text
        if 'pseries_more_v2' not in url:
            json_str = re.findall('window._SSR_HYDRATED_DATA=(.*?)</script>', res_html)[0]
            json_str = json_str.replace('undefined', 'null')
            json_data = json.loads(json_str)
            # video_resource = json_data['anyVideo']['gidInformation']['packerData']['video']['videoResource']['dash']
            video_resource = json_data['anyVideo']['gidInformation']['packerData']['video']['videoResource']['normal']

            # 初始化视频链接和音频链接为 None
            video_url = None
            audio_url = None

            # 检查是否存在 dynamic_video,如果存在则获取视频链接
            if 'dynamic_video' in video_resource:
                video_url = video_resource['dynamic_video']['dynamic_video_list'][-1]['main_url']
                audio_url = video_resource['dynamic_video']['dynamic_audio_list'][-1]['main_url']
                ptk = video_resource['ptk']
            # 如果不存在 dynamic_video,则尝试获取 video_list 中的视频链接
            elif 'video_list' in video_resource:
                video_url = next(iter(video_resource['video_list'].values()))['main_url']
                ptk = video_resource['ptk']

            # 如果 video_url 不为空,则进行解密处理
            if video_url:
                title = json_data['anyVideo']['gidInformation']['packerData']['video']['title']
                title = re.sub(r"[\/\\\:\*\?\"\<\>\|]", "_", title).replace(" ", "")
                video_url = aes_decrypt(data=video_url, key=ptk)
                print(video_url)
                if audio_url:
                    audio_url = aes_decrypt(data=audio_url, key=ptk)

                downloadAll(video_url, audio_url, title)
            else:
                print("无法获取视频链接")

        else:
            json_data = json.loads(res_html)
            for item in json_data['data']:
                title = item['title']
                video_url = item['preloadVideoResource']['dynamic_video']['dynamic_video_list'][-1]['backup_url_1']
                audio_url = item['preloadVideoResource']['dynamic_video']['dynamic_audio_list'][-1]['backup_url_1']
                video_url = base64.b64decode(video_url).decode()
                audio_url = base64.b64decode(audio_url).decode()
                title = re.sub(r"[\/\\\:\*\?\"\<\>\|]", "_", title).replace(" ", "")
                downloadAll(video_url, audio_url, title)





if __name__ == '__main__':
    # 单个视频 [url]https://www.ixigua.com/6895255008762135051[/url]
    # 视频合集 [url]https://www.ixigua.com/api/videov2/pseries_more_v2?pSeriesId=7069375938756411911&rank=0&tailCount=30[/url]
    # 关于下载视频合集的几个参数 rank:每页的起始数字  tailCount: 一页展示多少个
    # 比如第一页: rank=0&tailCount=30 第二页: rank=30&tailCount=30 第三页: rank=60&tailCount=30
    # 直接复制地址栏中长数字(类似:6895255008762135051)替换到链接中即可

    # 单个视频下载
    # 原链接:[url]https://www.ixigua.com/7360279127813063202[/url]  ,[url]https://www.ixigua.com/7354353866864853515[/url]
    main('https://www.ixigua.com/7343202047816434211?logTag=1f46f01173fd5dcf7d14')

    # 合集视频下载
    # 原链接: [url]https://www.ixigua.com/6888602680952881676?id=6887944298654859780[/url]
    # 将6888602680952881676 替换到下面链接中
    # main('https://www.ixigua.com/api/videov2/pseries_more_v2?pSeriesId=6888602680952881676&rank=0&tailCount=30')

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
bluewatercom + 1 + 1 用心讨论,共获提升!
liyy297 + 1 谢谢@Thanks!
chinawolf2000 + 1 + 1 热心回复!
LoveCode + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
gxr2010 发表于 2024-4-30 17:11
西瓜视频中的电影好像解密方式是不一样的,"cenc-aes-ctr",能否分析一下。比如杀手之五:https://www.ixigua.com/6551332086433710600
                                           "quality_type": 1,
                                            "definition": "1080p",
                                            "quality": "normal",
                                            "vtype": "dash",
                                            "vwidth": 1920,
                                            "vheight": 1080,
                                            "bitrate": 4371594,
                                            "codec_type": "h264",
                                            "size": 2120385323,
                                            "file_id": "b06cb89abb644b0ea4b8e108c70e1381",
                                            "fps": 25,
                                            "file_hash": "a553e72dbe363f1c2988f90b6cad2afa",
                                            "real_bitrate": 2883067,
                                            "avg_bitrate": 2755245,
                                            "init_range": "0-1280",
                                            "index_range": "1281-16096",
                                            "first_moof_range": "16097-17200",
                                            "encrypt": true,
                                            "kid": "634a6edb6c39fca369f6f8230003043b",
                                            "spade_a": "orws9Hy8NMFluDX0TLkA9Uy4NfR5jADESbwzwU6\u002FBfaFgc19fQ==",
                                            "encryption_method": "cenc-aes-ctr",
                                            "backup_url_1": "NQbjT+dkrjwfEvWHEqGDEaWYi7jl498c2+dGkhejtQy1QZLW03+RIf+Dc+TBH4J8Etv2j4FvoS78wTwS1x1WCNqdXMuai+Eqd62c\u002F5lhD7j2hfGJ8pYeGCVcWJUaJYkX9nyt52a8dWvYcd+qfsem\u002F4UUyLESnFUZ9XT27lD9bX2swnuv4R\u002FG9KuPHP3eibFEK6QY5K5K5QAxZ\u002FYKVfOFBFJlFX7o68kXNPH6vDSWTHAAlcMnExX2hrvBDpkOMoTY3eEiTi3iGiAkYD79m5aaud3HRgj5xeT5hrKdEYqEMkK24HPRHOMBLD0R\u002FqSJlkmB3RAQ93+hNDcpLMeNaekf8LRLIb1IMkCIpZh12zkOKoU1CVPLCyRB7bHhN9hv6+XgqmU0gArGODZmNb28cVIMzZVaq\u002FiV4Jv8xEbpOeywHx1MyKtJLLtekVrDjQffaTz495LZHB4nlp2vw5G+Qx7MxO+V\u002FfpmkEuX+iA2t9sxXQZuX7kNLzPTlPAusoaSZ8LklBjBaXgohjowcqQq2H7afk\u002FGbYbTyYqq4zYXpbhdQNDTz9M5DWov2nRT\u002FvN8uyru1QHknNAaUajjR5JPxNDIxw=="
                                        }],
推荐
 楼主| xinxiu 发表于 2024-4-30 18:53 |楼主
gxr2010 发表于 2024-4-30 17:11
西瓜视频中的电影好像解密方式是不一样的,"cenc-aes-ctr",能否分析一下。比如杀手之五:https://www.ixig ...

视频在这里:
[Python] 纯文本查看 复制代码
['anyVideo']['gidInformation']['packerData']['videoResource']['dash']['dynamic_video']['dynamic_video_list']

音频改为['dynamic_audio_list']

PTK在dash下面


一样有video_list,你搜索一下
沙发
吖力锅 发表于 2024-4-27 21:36
3#
Romain0818 发表于 2024-4-27 21:43
感谢分享值得学习学习
4#
sihua3000 发表于 2024-4-27 22:07
感谢分享,牛掰
5#
LJW352 发表于 2024-4-27 22:51
感谢楼主分享干货
6#
Corgibro 发表于 2024-4-28 08:17
厉害了,真是技术流啊
7#
xd1471 发表于 2024-4-28 08:53
感谢大佬的分享!先复制下来,去PYTHON上面研究学习一下!
8#
狗熊仔 发表于 2024-4-28 08:57
感谢分享
9#
414246704 发表于 2024-4-28 09:43
感谢分享
10#
yuanfangdeshi 发表于 2024-4-28 10:26
感谢分享,太厉害了!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 10:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表