File size: 4,686 Bytes
18d67d5
 
762894e
 
 
 
 
 
 
18d67d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762894e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import json
import os
import random
import re
import urllib.parse
from base64 import b64decode

import requests

# 获取当前文件所在的目录
current_dir = os.path.dirname(os.path.realpath(__file__))
# 读取配置文件
with open(os.path.join(current_dir, 'uu.json'), 'r') as f:
    config = json.load(f)

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'max-age=0',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}

def decode_base64_with_filter(encoded_str):
    # 定义合法的 Base64 字符集(包括字母、数字、加号、斜杠和等号)
    base64_pattern = re.compile(r'[^A-Za-z0-9+/=]')
    # 过滤掉非 Base64 字符
    filtered_str = base64_pattern.sub('', encoded_str)
    # 确保字符串长度是4的倍数(Base64编码要求)
    while len(filtered_str) % 4:
        filtered_str += '='
    try:
        # 解码
        decoded_bytes = b64decode(filtered_str)
        return decoded_bytes.decode('utf-8')
    except Exception as e:
        return f"解码失败: {e}"


def truncate_encoded_string(encoded_string, max_length=8):
    """
    解码 URL 编码的字符串,根据指定的最大长度截断,并将处理后的字符串重新编码为原始的 URL 编码格式。
    如果解码后的字符串长度超过最大长度,则保留前 max_length 个字符,并在后面加上 '...'。

    参数:
        encoded_string (str): URL 编码的字符串。
        max_length (int): 最大保留长度,默认为 12。

    返回:
        tuple: (解码前的字符串, 处理后的字符串)
    """
    # 解码字符串
    decoded_string = urllib.parse.unquote(encoded_string)

    # 判断解码后字符串的长度
    if len(decoded_string) > max_length:
        # 如果长度大于 max_length,保留前 max_length 位,后面用'...'代替
        truncated_string = decoded_string[:max_length] + "..."
    else:
        truncated_string = decoded_string

    # 将处理后的字符串重新编码为 URL 编码格式
    processed_encoded_string = urllib.parse.quote(truncated_string)

    # 返回解码前的字符串和处理后的字符串(已重新编码)
    return processed_encoded_string

def subscription_link_list(fileName: str) -> list:
    SubscribeUrlList = []
    with open(fileName, "r") as f:
        lines = f.readlines()
    for line in lines:
        subscription_url = line.strip().split(",")[1]
        SubscribeUrlList.append(subscription_url)
    return SubscribeUrlList



## 作用不大的部分
def is_subscription_link_valid(subscribeUrl: str) -> bool:
    try:
        result = requests.get(subscribeUrl,headers=headers).text
        if "error" in result:
            return False
        return True
    except Exception as e:
        #这里如果只是请求超时那么认为正常返回true,比如juzi sub判断时候连接超时
        print('判断sub link是否有效时候发生错误:',e)
        return True

def delete_invalid_url_in_txt(fileName: str) -> "void":
    valid_lines = []
    with open(fileName, "r") as file:
        lines = file.readlines()
    for line in lines:
        email = line.strip().split(",")[0]
        subscription_url = line.strip().split(",")[1]
        if is_subscription_link_valid(subscription_url):
            valid_lines.append(line)
        else:
            print(email + "订阅已经不可用")
    # 将有效行重新写回文件
    with open(fileName, "w") as file:
        file.writelines(valid_lines)


def subscription_link_valid_list(SubscribeUrlList: list) -> list:
    valid_link_list = list(filter(lambda f: is_subscription_link_valid(f), SubscribeUrlList))
    ##返回可用订阅链接前对原始文件进行删除不可用链接操作:
    return valid_link_list

def read_random_line(fileName: str) -> str:
    with open(fileName, "r") as file:
        lines = file.readlines()
    return random.choice(lines)


def getRandomSubscribeUrl(validSubscribeUrlList: list) -> str:
    # 返回一个可用的订阅链接信息
    return random.choice(validSubscribeUrlList)
## 作用不大的部分