github 上で無料ノードを取得し、購読リンクリストを自分で追加できます。理論的には毎日無数のノードがあり、洋物を崇拝せず、騙されないようにし、情報のカンフルを打破し、独立して考えましょう。
import requests
import yaml
import base64
# 定義された購読リンクリスト
SUBSCRIPTION_URLS = ["https://raw.githubusercontent.com/Surfboardv2ray/TGParse/main/splitted/mixed"
"https://raw.githubusercontent.com/ripaojiedian/freenode/main/sub"
"https://raw.githubusercontent.com/roosterkid/openproxylist/main/V2RAY_RAW.txt"
"https://github.com/andrewji8/V2ray-Configs/blob/main/All_Configs_base64_Sub.txt"
]
def fetch_subscription(url):
"""購読内容を取得する"""
try:
response = requests.get(url, timeout=10, verify=False) # SSL検証を無効にする
if response.status_code == 200:
return response.text.strip() # 不要な空白文字を削除
else:
print(f"{url} の内容を取得できませんでした。ステータスコード: {response.status_code}")
return None
except Exception as e:
print(f"{url} のリクエストに失敗しました: {e}")
return None
def decode_base64(content):
"""Base64エンコードされた内容をデコードする"""
try:
decoded_content = base64.b64decode(content).decode("utf-8")
return decoded_content
except Exception as e:
print(f"Base64デコードに失敗しました: {e}")
return None
def parse_yaml(content):
"""YAML内容を解析する"""
try:
data = yaml.safe_load(content)
if isinstance(data, dict): # 辞書型の場合、そのまま返す
return data
elif isinstance(data, str): # 文字列型の場合、辞書にラップする
return {"proxies": [data]} # 内容がプロキシノードのリストであると仮定
else:
print(f"解析結果は辞書または文字列型ではありません: {type(data)}")
return None
except Exception as e:
print(f"YAMLの解析に失敗しました: {e}")
return None
def merge_subscriptions(subscriptions):
"""複数の購読内容をマージし、重複を除去する"""
merged_data = {}
for sub in subscriptions:
if not sub or not isinstance(sub, dict): # 購読内容が辞書型であることを確認
print("無効な購読内容をスキップします")
continue
for key, value in sub.items():
if key not in merged_data:
merged_data[key] = value
elif isinstance(value, list) and isinstance(merged_data[key], list):
# リストをマージし、重複を除去
merged_data[key] = list(set(merged_data[key] + value))
elif isinstance(value, dict) and isinstance(merged_data[key], dict):
# 辞書型の場合、再帰的にマージ
merged_data[key].update(value)
return merged_data
def save_to_files(data, group_size=12000, base_filename="subscription_group"):
"""データをグループ化して複数のファイルに保存する"""
if "proxies" not in data:
print("グループ化できるプロキシノードがありません")
return
proxies = data["proxies"]
total_groups = (len(proxies) + group_size - 1) // group_size # グループ数を計算
for i in range(total_groups):
group_proxies = proxies[i * group_size:(i + 1) * group_size]
group_data = {**data, "proxies": group_proxies} # グループデータを作成
filename = f"{base_filename}_{i + 1}.yaml"
with open(filename, "w", encoding="utf-8") as f:
yaml.dump(group_data, f, allow_unicode=True)
print(f"グループ {i + 1} が {filename} に保存されました")
def split_yaml_file(input_filename, output_base_filename="split_subscription", num_splits=3):
"""
YAMLファイルを複数のファイルに分割する。
:param input_filename: 入力するYAMLファイル名
:param output_base_filename: 出力ファイルの基本名
:param num_splits: 分割するファイルの数
"""
try:
# 入力のYAMLファイルを読み込む
with open(input_filename, "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
if "proxies" not in data:
print("分割できるプロキシノードがありません")
return
proxies = data["proxies"]
total_proxies = len(proxies)
print(f"総ノード数: {total_proxies}")
# 各グループのサイズを計算
group_size = (total_proxies + num_splits - 1) // num_splits # 切り上げ
# 分割して複数のファイルに保存
for i in range(num_splits):
start_index = i * group_size
end_index = min((i + 1) * group_size, total_proxies)
group_proxies = proxies[start_index:end_index]
if not group_proxies:
print(f"グループ {i + 1} にノードがないため、保存をスキップします")
continue
# グループデータを作成
group_data = {**data, "proxies": group_proxies}
output_filename = f"{output_base_filename}_{i + 1}.yaml"
# ファイルに保存
with open(output_filename, "w", encoding="utf-8") as f:
yaml.dump(group_data, f, allow_unicode=True)
print(f"グループ {i + 1} が {output_filename} に保存されました")
except Exception as e:
print(f"ファイルの分割に失敗しました: {e}")
def main():
# すべての購読内容を取得
subscription_contents = [fetch_subscription(url) for url in SUBSCRIPTION_URLS]
# Base64をデコードし、YAML形式に解析
parsed_subscriptions = []
for content in subscription_contents:
if content:
print(f"元の内容: {content[:100]}...") # 最初の100文字を表示
decoded_content = decode_base64(content)
if decoded_content:
print(f"デコード後の内容: {decoded_content[:100]}...") # 最初の100文字を表示
data = parse_yaml(decoded_content)
print(f"解析後のデータ型: {type(data)}")
parsed_subscriptions.append(data)
# 購読内容をマージ
merged_data = merge_subscriptions(parsed_subscriptions)
# 複数のファイルにグループ化して保存(各グループ12000ノード)
if merged_data:
save_to_files(merged_data, group_size=12000) # 各グループ12000ノード
else:
print("マージできる有効な購読内容がありません")
# 生成された最初のグループファイルを3つのサブファイルに分割
input_filename = "subscription_group_1.yaml"
split_yaml_file(input_filename, output_base_filename="split_subscription", num_splits=3)
if __name__ == "__main__":
main()