基于Python开发的视频下载工具

import os
import requests
import time
import re
from tqdm import tqdm
from Crypto.Cipher import AES
from concurrent.futures import ThreadPoolExecutor,wait

# pip install pycryptodome
headers = {

        'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/117.0.0.0 Safari/537.36'
    }

u_len = 0


def log_file(url):

    timestamp = time.time()    # 转换成localtime
    time_local = time.localtime(timestamp)
    # 转换成新的时间格式(2016-05-05 20:28:54)
    dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)

    url = url + '\t' + dt +' \n'

    if not os.path.exists('./index/log.log'):
        os.mkdir('./index/')
    with open('./index/log.log','a') as f:
        f.write(url)

    pass


def down_index(url):
    global moive_name

    headers = {
        'User-Agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/117.0.0.0 Safari/537.36'
    }


    pro_key = ''
    try:
        page_text = requests.get(url,headers=headers).text
    except Exception as e:
        try:
            page_text = requests.get(url, headers=headers, verify=False).text
        except Exception as e:
            # page_text = '"url":"https://2.bo.com/2020011/PsGhiYT/index."'
            print('网页拒绝链接')

            for i in range(1,11):
                print(11-i,'秒后退出',)
                time.sleep(1)
            exit()

    log_file(url)

    # print(page_text)

    # <h1 class="title"><a href="/index.php/vod/detail/id/401058.html">变形金刚:超能勇士崛起 国语版 HD【无尽资源】</a></h1>
    try:
        moive_name = re.findall(r'<h1 class="title"><a href=".*?">(.*?)</a></h1>',page_text)[0]
        print(moive_name)
    except Exception as e:
        try:
            moive_name = re.findall(r'<h1>(.*?)</h1>', page_text)[0]
            print(moive_name)
        except Exception as e:
            # < title >《洛基第一季》第01集在线观看_九九美剧 < / title >
            moive_name = re.findall(r'<title>(.*?)</title>', page_text)[0]
            print(moive_name)

    if re.search(r'https://(.*?)index.m3u8',page_text):

        try:
            index_url = re.findall(r'now="(.*?)index.m3u8',page_text)[0]
            index = index_url + 'index.m3u8'
            print(index,'=================')
            page_data = requests.get(index,headers=headers).text
            page_text = page_data.split('\n')
            print(page_text)
        except:
            #
            index_url = re.findall(r'link_pre":"","url":"(.*?)index.m3u8"', page_text)[0]
            print(index_url, '===========++++++++++')
            index_url = index_url.replace('\\', '')
            index = index_url + 'index.m3u8'
            print(index, 200, '次请求')
            page_data = requests.get(index,headers=headers).text

            page_text = page_data.split('\n')

            if '' in page_text:
                page_text.remove('')
            if len(page_text) == 1 and page_text[0] =='file not found':
                print(page_text[0], 304, '没有文件')
                return 0
            print(page_text, 200, '次--请求')

        if len(page_data) < 500:

            if len(page_text[-1]) > 20:
                pro_key = index_url[:8]+index_url[8:-1].split('/')[0] + '\n'
                next_url = index_url[:8]+index_url[8:-1].split('/')[0] + page_text[-1]
                # print(next_url)
                print('--网址的头:', pro_key)
                pass
            else:
                next_url = index_url +  page_text[-1]
                # print(next_url,'0000000')
                pro_key = next_url[:-10] + '\n'
                print('++网址的头:',pro_key.strip())
            print(next_url,'拿到m3u8')
            page_text = requests.get(next_url,headers=headers).text
            # print(page_data)
    else:
    # print(page_text)
        url_suffix = re.findall(r'url(.*?)url_next', page_text)[0][3:-3]
        # print(url_suffix)
        profix_url = 'https://zj.sp-flv.com:8443/?url='

        video_url = profix_url + url_suffix

        print('跳转iframe的网页地址')
        page_text = requests.get(video_url, ).text
        url = re.findall(r'video_url = (.*?);', page_text)[0][1:-1]
        print(url,'   iframe的网页地址,拿到index.m3u8文件')

        pro_key = url.split('index.m3u8')[0] + '\n' #网址的请求头部分

        page_text = requests.get(url, headers=headers).text
        # print(page_text,'----------+++++++-----','二次请求')

        if len(page_text) < 500:
            page_text = page_text.split('\n')
            if '' in page_text:
                page_text.remove('')
            print('--------------')

            pro_list = pro_key.strip()[8:].split('/')
            if '' in pro_list:
                pro_list.remove('')

            if page_text[-1].strip().startswith('https:'):
                next_url = page_text[-1].strip()
            else:

                suf_list = page_text[-1].strip().split('/')
                if '' in suf_list:
                    suf_list.remove('')

                print(pro_list, suf_list,'查看地址中是否有重负的字段')
                for i in suf_list:
                    if i in pro_list:
                        pro_list.remove(i)


                next_url = pro_key.strip()[:8]+ '/'.join(pro_list+suf_list)
                print('-------',next_url,3,'次请求')
            # 获取m3u8文件
            page_text = requests.get(next_url,headers=headers).text
            # print(page_text)
            pro_key = next_url[:-10] + '\n'

    # 将获取的m3u8文件写入到本地的inde/index.m3u8下
    with open('./index/index.m3u8', mode='w', encoding='utf8') as f:
        f.writelines(pro_key)
        f.write(page_text)
    # print(page_text)
    log_file(url)
    pass

# 处理下载下来的index.m3u8文件
def get_key():
    '''有加密的拿到加密的然后进行解密,下载地址也做了判断全地址的直接保存,不是的会进行拼接'''
    url_key = ''
    # 读取index.m3u8文件
    with open('./index/index.m3u8', 'r') as f:
        keys = f.readlines()
    # print(keys)

    pro_url_key = keys[0].strip()

    keys.pop(0)
    print(pro_url_key)
    for i in range(10):
        if re.findall(r'URI="(.*?)"',keys[i].strip()):
            if re.findall(r'URI="(.*?)"', keys[i].strip())[0].startswith('http'):
                url_key = re.findall(r'URI="(.*?)"', keys[i].strip())[0]
            else:
                url_key = pro_url_key + re.findall(r'URI="(.*?)"', keys[i].strip())[0]
            break

    # 做个标记文件是否是加密视频,是写入秘钥,否写入222
    if url_key == '':
        page_text = '222'
    else:
        page_text = requests.get(url_key).text
        print(page_text)
        pass

    pass_url = ['7ce9fef4fac0493266.ts', '7ce9fef4fac0493267.ts', '7ce9fef4fac0493268.ts', '7ce9fef4fac0493269.ts']

    with open('./index/url.txt', 'w') as f:
        f.write(page_text+'\n')
        for i in keys:
            # if len(i.strip()) >=60 and len(i.strip()) <=62:
            #     f.write(i)
            if not i.startswith('#'):
                if i.startswith('http'):
                    f.write(i)
                else:
                    try:
                        int(i.strip().split('.')[0][-5:])
                        f.write(pro_url_key + i)
                    except Exception as e:
                        if len(i.strip().split('/')[-1]) > 15:
                            pass
                        else:
                            try:
                                int(i.strip().split('.')[0][-1:])
                                f.write(pro_url_key + i)
                            except:
                                if i in pass_url:
                                    pass
                                f.write(pro_url_key + i)


def add_video(path='./video/'):
    global moive_name
    new_name = path + moive_name + '.mp4'
    if not os.path.exists('./video/'):
        os.mkdir('./video/')

    print("正在合并文件")
    file_list = os.listdir('./ts01/')

    file_list = sorted(file_list, key=lambda x:int(x.split('.')[0]))

    num = len(os.listdir(path))
    video_name = path + 'video'+str(num)+'.ts'


    for i in tqdm(file_list):
        file_path = './ts01/' + i
        with open(file_path, mode='rb',) as fr:
            content= fr.read()
        with open(video_name, mode='ab', ) as f:
            f.write(content)
    for i in file_list:
        file_path = './ts01/' + i
        os.remove(file_path)
    os.removedirs('./ts01/')
    os.renames(video_name,new_name)

    print("合并完成")



def down_ts(url, name):
    global header
    global u_len
    if len(url) - u_len < 7:
        try:
            page_data = requests.get(url,headers=headers,timeout=15).content
        except:
            down_ts(url, name)
            # page_data = requests.get(url,headers=headers, timeout=15).content

        # print(type(file))
        file_dir = './ts01/'
        if not os.path.exists(file_dir):
            os.mkdir(file_dir)
        file_name =  file_dir + str(name) + '.ts'
        with open(file_name, mode='wb') as f:
            f.write(page_data)
        for i in range(1000):
            for j in range(10):
                i = i+j
        print(url, name, file_name)
    else:
        pass


def down_decode_ts(key,url, name):
    global headers
    global u_len
    if len(url) -u_len < 7:

        try:
            page_data = requests.get(url,headers=headers,timeout=15).content
        except:
            down_decode_ts(key, url, name)
            # page_data = requests.get(url,headers=headers, timeout=15).content

        key = key.encode()
        # print(key)
        aes = AES.new(key=key,IV=b'0000000000000000', mode=AES.MODE_CBC)
        file = aes.decrypt(page_data)
        # print(type(file))
        file_dir = './ts01/'
        if not os.path.exists(file_dir):
            os.mkdir(file_dir)
        file_name =  file_dir + str(name)+'.ts'
        with open(file_name, mode='wb') as f:
            f.write(file)

        print(url, name, file_name)
    else:
        pass


def down_file(thred_num=75):
    global header
    global u_len

    url_list = []
    with open('./index/url.txt', 'r') as f:
        url_list = f.readlines()

    pool = ThreadPoolExecutor(thred_num)
    task = []
    u_len = len(url_list[2].strip())
    if url_list[0].strip() == '222':
        url_list.pop(0)
        num = 0
        for i in url_list:
            # down_ts(i.strip(), num)
            # break
            task.append(pool.submit(down_ts, i.strip(), num))
            num += 1
            # time.sleep(1)
            for i in range(1000):
                for j in range(500):
                    i = i + j
        wait(task)
    else:
        key = url_list[0].strip()

        url_list.pop(0)
        num = 0
        for i in url_list:
            name = i.strip().split('/')[-1]
            # print(name)

            # print(page_content)
            task.append(pool.submit(down_decode_ts,key, i.strip() , num))
            num += 1
            # break
        wait(task)
        pass


if __name__ == '__main__':
    moive_name = ''

    if not os.path.exists('./index/'):
        os.mkdir('./index/')

    url = input("输入要下载的网址:")
    down_index(url)
    get_key()
    down_file(100)
    add_video()






certifi2023.11.17
chardet
5.2.0
charset-normalizer3.3.2
click
8.1.7
colorama0.4.6
colorlog
6.8.0
comtypes1.2.1
dacite
1.8.1
docker6.1.3
Faker
18.13.0
Flask2.2.5
idna
3.6
importlib-metadata6.7.0
itsdangerous
2.1.2
Jinja23.1.3
lxml
5.1.0
MarkupSafe2.1.3
Naked
0.1.32
packaging23.2
pocsuite3
2.0.7
prettytable3.7.0
pycryptodome
3.20.0
pycryptodomex3.20.0
pypiwin32
223
PySocks1.7.1
python-dateutil
2.8.2
PyUserInput0.1.10
pywifi
1.1.12
pywin32306
PyYAML
6.0.1
requests2.31.0
requests-toolbelt
1.0.0
scapy2.5.0
shellescape
3.8.1
six1.16.0
termcolor
2.3.0
tqdm4.66.1
typing-extensions
4.7.1
urllib32.0.7
wcwidth
0.2.13
websocket-client1.6.1
Werkzeug
2.2.3
zipp==3.15.0


  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛应用于软件开发的高级编程语言,而Django是一个基于Python的开源Web框架。本文将使用300字中文回答如何开发一个Django的Demo项目视频。 首先,我们需要准备环境。确保已经安装了Python和Django。可以通过官方网站下载并按照相应的说明安装,或者使用包管理工具来安装。安装完成后,可以通过运行`python --version`和`django-admin --version`来验证环境是否正常。 接下来,在一个合适的目录下创建一个新的Django项目。可以使用`django-admin startproject myproject`命令来创建,其中`myproject`是项目的名称。 然后,使用`cd myproject`进入项目目录,并运行`python manage.py startapp myapp`来创建一个新的应用。这个应用将包含我们项目的所有逻辑。 现在,我们可以开始编写代码了。在`myapp`目录下,打开`views.py`文件,并按照需求编写视图函数。视图函数是处理HTTP请求的核心,它将接收请求并返回相应的内容。 在`views.py`文件中,我们可以定义多个视图函数,每个函数代表一个URL路径的处理逻辑。可以使用`@django.shortcuts.render`装饰器来渲染HTML模板,并将数据动态传递给模板。 同时,在`myapp`目录下创建一个`templates`目录,并在其中创建一个HTML模板文件。可以使用Django的模板语言来动态生成HTML内容,并根据需要添加CSS和Javascript代码。 接下来,在`myproject`目录下的`urls.py`文件中配置URL路由。可以为每个视图函数添加一个URL路径,并指定要调用的处理函数。 完成代码编写后,可以运行`python manage.py runserver`命令来启动Django服务器。在浏览器中输入`http://localhost:8000/`即可访问我们开发的Demo项目。 最后,我们可以使用屏幕录制工具来录制我们开发的Demo项目视频。在视频中,可以展示如何创建项目、编写代码、启动服务器,并演示在浏览器中访问项目的效果。 总之,本文以300字中文回答了如何开发一个Django的Demo项目视频。通过准备环境、创建项目、编写代码、配置路由和启动服务器,我们可以展示项目的开发过程,并用视频的形式分享给其他人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值