Clash订阅列表

要将Clash订阅转换为JSON或Excel格式,可以按照以下步骤编写一个Python脚本:

安装所需的Python库

确保安装了markdown和pandas库:

pip install markdown pandas

编写Clash订阅转换脚本

以下是一个示例Python脚本clash_to_json.py,它将Clash订阅文件转换为JSON格式:

import markdown
from pathlib import Path
import json
def clash_to_json(input_file, output_file):
    # 读取Markdown文件
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    # 使用markdown解析器解析内容
    parser = markdown.Markdown()
    subscriptions = parser.parse(content)
    # 初始化JSON数组
    subscriptions_json = []
    for item in subscriptions:
        if isinstance(item, markdown.List):
            for sub_item in item:
                if isinstance(sub_item, markdown.Header):
                    title = sub_item.text
                elif isinstance(sub_item, markdown.Link):
                    link = {
                        '标题': title,
                        '链接': sub_item.href
                    }
                    subscriptions_json.append(link)
    # 保存JSON文件
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(subscriptions_json, f, indent=2)
if __name__ == '__main__':
    input_file = Path('clash_subscriptions.md')
    output_file = Path('clash_subscriptions.json')
    clash_to_json(input_file, output_file)

使用示例

  1. 创建一个Clash订阅文件(例如clash_subscriptions.md如下:
- [基本的订阅](https://example.com)
  - 作者: user
  - 更新频率: 每天一次长度: 500字
  - 更新日期: 2023-10-01
- [高级订阅](https://example.com/plus)
  - 作者: user
  - 更新频率: 每周一次长度: 100字
  - 更新日期: 2023-10-02

运行脚本:

python clash_to_json.py
  1. 生成的JSON文件将保存在clash_subscriptions.json类似于:
[
  {: "基本的订阅",
    "链接": "https://example.com",
    "作者": "user",
    "更新频率": "每天一次",长度": "500字",
    "更新日期": "2023-10-01"
  },
  {: "高级订阅",
    "链接": "https://example.com/plus",
    "作者": "user",
    "更新频率": "每周一次",长度": "100字",
    "更新日期": "2023-10-02"
  }
]

将JSON转换为Excel

为了将JSON转换为Excel,可以使用pandas库:

import pandas as pd
# 读取JSON文件
data = pd.read_json('clash_subscriptions.json')
# 写入Excel文件
data.to_excel('clash_subscriptions.xlsx', index=False)

完整代码

将上述步骤整合成一个完整的Python脚本:

import markdown
from pathlib import Path
import json
import pandas as pd
def clash_to_json(input_file, output_file):
    # 读取Markdown文件
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    # 使用markdown解析器解析内容
    parser = markdown.Markdown()
    subscriptions = parser.parse(content)
    # 初始化JSON数组
    subscriptions_json = []
    for item in subscriptions:
        if isinstance(item, markdown.List):
            for sub_item in item:
                if isinstance(sub_item, markdown.Header):
                    title = sub_item.text
                elif isinstance(sub_item, markdown.Link):
                    link = {
                        '标题': title,
                        '链接': sub_item.href,
                        '作者': 'user',
                        '更新频率': '每天一次',
                        '内容长度': '500字',
                        '更新日期': '2023-10-01'
                    }
                    subscriptions_json.append(link)
    # 保存JSON文件
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(subscriptions_json, f, indent=2)
def main():
    input_file = Path('clash_subscriptions.md')
    output_json = Path('clash_subscriptions.json')
    clash_to_json(input_file, output_json)
    # 转换为Excel
    df = pd.read_json(output_json)
    df.to_excel('clash_subscriptions.xlsx', index=False)
if __name__ == '__main__':
    main()

处理多个订阅文件

如果有多个Clash订阅文件,可以修改脚本如下:

def clash_to_json(input_dir, output_dir):
    input_files = list(input_dir.glob('*.md'))
    for input_file in input_files:
        output_file = output_dir / input_file.name.replace('.md', '.json')
        clash_to_json(input_file, output_file)
    # 收集所有JSON文件
    all_json_files = list(output_dir.glob('*.json'))
    df = pd.DataFrame()
    for f in all_json_files:
        data = pd.read_json(f)
        df = pd.concat([df, data], ignore_index=True)
    # 保存到Excel
    df.to_excel(output_dir / 'all_subscriptions.xlsx', index=False)

处理不同字段

如果Clash订阅文件的字段结构不同,可以在解析时添加灵活性:

from markdown import Token
from collections import Iterable
def get_children(token):
    if isinstance(token, Token.List):
        return token
    if isinstance(token, Token.ListItem):
        children = []
        for t in token.tokens:
            if isinstance(t, Token.Header):
                children.append(t)
            elif isinstance(t, Token.Link):
                children.append(t)
        return children
    return []

然后修改clash_to_json函数:

def clash_to_json(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    parser = markdown.Markdown()
    subscriptions = parser.parse(content)
    subscriptions_json = []
    for item in subscriptions:
        if isinstance(item, markdown.List):
            for sub_item in item:
                if isinstance(sub_item, markdown.Header):
                    title = sub_item.text
                elif isinstance(sub_item, markdown.Link):
                    link = {
                        '标题': title,
                        '链接': sub_item.href,
                        '作者': 'user',
                        '更新频率': '每天一次',
                        '内容长度': '500字',
                        '更新日期': '2023-10-01'
                    }
                    subscriptions_json.append(link)
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(subscriptions_json, f, indent=2)

处理多个订阅文件的完整代码

将上述函数整合到一个完整的脚本中:

import markdown
from pathlib import Path
import json
import pandas as pd
from collections import Iterable
def get_children(token):
    if isinstance(token, Token.List):
        return token
    if isinstance(token, Token.ListItem):
        children = []
        for t in token.tokens:
            if isinstance(t, Token.Header):
                children.append(t)
            elif isinstance(t, Token.Link):
                children.append(t)
        return children
    return []
def clash_to_json(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()
    parser = markdown.Markdown()
    subscriptions = parser.parse(content)
    subscriptions_json = []
    for item in subscriptions:
        if isinstance(item, markdown.List):
            item_children = get_children(item)
            for sub_item in item_children:
                if isinstance(sub_item, markdown.Header):
                    title = sub_item.text
                elif isinstance(sub_item, markdown.Link):
                    link = {
                        '标题': title,
                        '链接': sub_item.href,
                        '作者': 'user',
                        '更新频率': '每天一次',
                        '内容长度': '500字',
                        '更新日期': '2023-10-01'
                    }
                    subscriptions_json.append(link)
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(subscriptions_json, f, indent=2)
def main():
    input_dir = Path('input')
    output_dir = Path('output')
    # 处理单个文件

Clash订阅列表

扫码添加原子VPN加速器微信

扫码添加原子VPN加速器微信

400-815-7263
扫码添加原子VPN加速器微信

扫码添加原子VPN加速器微信

网站地图