update.py 8.6 KB
Newer Older
H
hjdhnx 已提交
1 2 3 4 5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File  : update.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2022/9/6
H
hjdhnx 已提交
6
import re
H
hjdhnx 已提交
7
from time import time as getTime
8
import sys
H
hjdhnx 已提交
9 10
import requests
import os
H
hjdhnx 已提交
11
import zipfile
H
hjdhnx 已提交
12
import shutil # https://blog.csdn.net/weixin_33130113/article/details/112336581
H
hjdhnx 已提交
13
from utils.log import logger
H
hjdhnx 已提交
14
from utils.web import get_interval
H
hjdhnx 已提交
15
from utils.htmlParser import jsoup
H
hjdhnx 已提交
16
import ujson
H
hjdhnx 已提交
17

H
hjdhnx 已提交
18 19 20 21 22
headers = {
        'Referer': 'https://gitcode.net/',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
}

H
hjdhnx 已提交
23
def getHotSuggest1(url='http://4g.v.sogou.com/hotsugg',size=0):
H
hjdhnx 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    jsp = jsoup(url)
    pdfh = jsp.pdfh
    pdfa = jsp.pdfa
    pd = jsp.pd
    try:
        r = requests.get(url,headers=headers,timeout=2)
        html = r.text
        data = pdfa(html,'ul.hot-list&&li')
        suggs = [{'title':pdfh(dt,'a&&Text'),'url':pd(dt,'a&&href')} for dt in data]
        # print(html)
        # print(suggs)
        return suggs
    except:
        return []

H
hjdhnx 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
def getHotSuggest2(url='https://pbaccess.video.qq.com/trpc.videosearch.hot_rank.HotRankServantHttp/HotRankHttp',size=0):
    size = int(size) if size else 50
    pdata = ujson.dumps({"pageNum":0,"pageSize":size})
    try:
        r = requests.post(url,headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36', 'content-type': 'application/json'},data=pdata,timeout=2)
        html = r.json()
        # print(html)
        data = html['data']['navItemList'][0]['hotRankResult']['rankItemList']
        suggs = [{'title':dt['title'],'url':dt['url']} for dt in data]
        # print(html)
        # print(suggs)
        return suggs
    except:
        return []

def getHotSuggest(s_from,size):
    if s_from == 'sougou':
        return getHotSuggest1(size=size)
    else:
        return getHotSuggest2(size=size)

H
hjdhnx 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73
def getLocalVer():
    base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))  # 上级目录
    version_path = os.path.join(base_path, f'js/version.txt')
    if not os.path.exists(version_path):
        with open(version_path,mode='w+',encoding='utf-8') as f:
            version = '1.0.0'
            f.write(version)
    else:
        with open(version_path,encoding='utf-8') as f:
            version = f.read()
    return version

def getOnlineVer():
    ver = '1.0.1'
74
    msg = ''
H
hjdhnx 已提交
75
    try:
H
hjdhnx 已提交
76
        r = requests.get('https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/version.txt',timeout=(2,2))
H
hjdhnx 已提交
77 78
        ver = r.text
    except Exception as e:
H
hjdhnx 已提交
79
        # print(f'{e}')
80 81 82
        msg = f'{e}'
        logger.info(msg)
    return ver,msg
H
hjdhnx 已提交
83 84 85

def checkUpdate():
    local_ver = getLocalVer()
86
    online_ver,msg = getOnlineVer()
H
hjdhnx 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    if local_ver != online_ver:
        return True
    return False


def del_file(filepath):
    """
    删除execl目录下的所有文件或文件夹
    :param filepath: 路径
    :return:
    """
    del_list = os.listdir(filepath)
    for f in del_list:
        file_path = os.path.join(filepath, f)
        if os.path.isfile(file_path):
            os.remove(file_path)

104 105 106
def copytree(src, dst, ignore=None):
    if ignore is None:
        ignore = []
107
    dirs = os.listdir(src)  # 获取目录下的所有文件包括文件夹
H
1  
hjdhnx 已提交
108
    logger.info(f'{dirs}')
109 110 111 112 113 114
    for dir in dirs:  # 遍历文件或文件夹
        from_dir = os.path.join(src, dir)  # 将要复制的文件夹或文件路径
        to_dir = os.path.join(dst, dir)  # 将要复制到的文件夹或文件路径
        if os.path.isdir(from_dir):  # 判断是否为文件夹
            if not os.path.exists(to_dir):  # 判断目标文件夹是否存在,不存在则创建
                os.mkdir(to_dir)
115
            copytree(from_dir, to_dir,ignore)  # 迭代 遍历子文件夹并复制文件
116
        elif os.path.isfile(from_dir):  # 如果为文件,则直接复制文件
117 118 119 120 121 122 123
            if ignore:
                regxp = '|'.join(ignore).replace('\\','/') # 组装正则
                to_dir_str = str(to_dir).replace('\\','/')
                if not re.search(rf'{regxp}', to_dir_str, re.M):
                    shutil.copy(from_dir, to_dir)  # 复制文件
            else:
                shutil.copy(from_dir, to_dir)  # 复制文件
124 125


126
def force_copy_files(from_path, to_path, exclude_files=None):
H
hjdhnx 已提交
127
    # print(f'开始拷贝文件{from_path}=>{to_path}')
128 129
    if exclude_files is None:
        exclude_files = []
H
hjdhnx 已提交
130
    logger.info(f'开始拷贝文件{from_path}=>{to_path}')
H
hjdhnx 已提交
131 132
    if not os.path.exists(to_path):
        os.makedirs(to_path,exist_ok=True)
133 134
    try:
        if sys.version_info < (3, 8):
135
            copytree(from_path, to_path,exclude_files)
136
        else:
137 138 139 140
            if len(exclude_files) > 0:
                shutil.copytree(from_path, to_path, dirs_exist_ok=True,ignore=shutil.ignore_patterns(*exclude_files))
            else:
                shutil.copytree(from_path, to_path, dirs_exist_ok=True)
141 142 143

    except Exception as e:
        logger.info(f'拷贝文件{from_path}=>{to_path}发生错误:{e}')
H
hjdhnx 已提交
144

H
hjdhnx 已提交
145 146 147 148 149
def copy_to_update():
    base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))  # 上级目录
    tmp_path = os.path.join(base_path, f'tmp')
    dr_path = os.path.join(tmp_path, f'dr_py-master')
    if not os.path.exists(dr_path):
H
hjdhnx 已提交
150 151
        # print(f'升级失败,找不到目录{dr_path}')
        logger.info(f'升级失败,找不到目录{dr_path}')
H
hjdhnx 已提交
152
        return False
H
hjdhnx 已提交
153
    # 千万不能覆盖super,base
H
hjdhnx 已提交
154
    paths = ['js','models','controllers','libs','static','templates','utils','txt','jiexi','py','whl','doc']
H
hjdhnx 已提交
155
    exclude_files = ['txt/pycms0.json','txt/pycms1.json','txt/pycms2.json','base/rules.db']
H
hjdhnx 已提交
156
    for path in paths:
157
        force_copy_files(os.path.join(dr_path, path),os.path.join(base_path, path),exclude_files)
H
hjdhnx 已提交
158 159 160 161
    try:
        shutil.copy(os.path.join(dr_path, 'app.py'), os.path.join(base_path, 'app.py'))  # 复制文件
    except Exception as e:
        logger.info(f'更新app.py发生错误:{e}')
H
hjdhnx 已提交
162
    logger.info(f'升级程序执行完毕,全部文件已拷贝覆盖')
H
hjdhnx 已提交
163 164
    return True

H
hjdhnx 已提交
165
def download_new_version():
H
hjdhnx 已提交
166
    t1 = getTime()
H
hjdhnx 已提交
167 168 169 170 171 172 173 174 175 176 177
    base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))  # 上级目录
    tmp_path = os.path.join(base_path, f'tmp')
    os.makedirs(tmp_path,exist_ok=True)
    url = 'https://gitcode.net/qq_32394351/dr_py/-/archive/master/dr_py-master.zip'
    # tmp_files = os.listdir(tmp_path)
    # for tp in tmp_files:
    #     print(f'清除缓存文件:{tp}')
    #     os.remove(os.path.join(tmp_path, tp))
    del_file(tmp_path)
    msg = ''
    try:
H
hjdhnx 已提交
178 179
        # print(f'开始下载:{url}')
        logger.info(f'开始下载:{url}')
H
hjdhnx 已提交
180 181 182 183 184
        r = requests.get(url,headers=headers,timeout=(20,20))
        rb = r.content
        download_path = os.path.join(tmp_path, 'dr_py.zip')
        with open(download_path,mode='wb+') as f:
            f.write(rb)
H
hjdhnx 已提交
185 186
        # print(f'开始解压文件:{download_path}')
        logger.info(f'开始解压文件:{download_path}')
H
hjdhnx 已提交
187 188 189 190
        f = zipfile.ZipFile(download_path, 'r')  # 压缩文件位置
        for file in f.namelist():
            f.extract(file, tmp_path)  # 解压位置
        f.close()
H
hjdhnx 已提交
191 192
        # print('解压完毕,开始升级')
        logger.info('解压完毕,开始升级')
H
hjdhnx 已提交
193
        ret = copy_to_update()
H
hjdhnx 已提交
194 195
        logger.info(f'升级完毕,结果为:{ret}')
        # print(f'升级完毕,结果为:{ret}')
H
hjdhnx 已提交
196
        msg = '升级成功'
H
hjdhnx 已提交
197
    except Exception as e:
H
hjdhnx 已提交
198
        msg = f'升级失败:{e}'
H
hjdhnx 已提交
199
    logger.info(f'系统升级共计耗时:{get_interval(t1)}毫秒')
H
hjdhnx 已提交
200 201 202 203 204
    return msg

def download_lives(live_url:str):
    t1 = getTime()
    base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))  # 上级目录
H
hjdhnx 已提交
205
    live_path = os.path.join(base_path, f'base/直播.txt')
H
hjdhnx 已提交
206 207 208
    logger.info(f'尝试同步{live_url}远程内容到{live_path}')
    try:
        r = requests.get(live_url,headers=headers,timeout=3)
209 210 211 212
        auto_encoding = r.apparent_encoding
        if auto_encoding.lower() in ['utf-8','gbk','bg2312','gb18030']:
            r.encoding = auto_encoding
        # print(r.encoding)
H
hjdhnx 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225
        html = r.text
        # print(len(html))
        if re.search('cctv|.m3u8',html,re.M|re.I) and len(html) > 1000:
            logger.info(f'直播源同步成功,耗时{get_interval(t1)}毫秒')
            with open(live_path,mode='w+',encoding='utf-8') as f:
                f.write(html)
            return True
        else:
            logger.info(f'直播源同步失败,远程文件看起来不是直播源。耗时{get_interval(t1)}毫秒')
            return False
    except Exception as e:
        logger.info(f'直播源同步失败,耗时{get_interval(t1)}毫秒\n{e}')
        return False