Last active 1747754028

从基本文件格式,生成标准化JSON,用于表情包

USAGE.md Raw

整理好表情包为如下格式:

. 📂 owo
└── 📂 bilibili/
│  ├── 📄 bilibili-doge.png
│  ├── 📄 bilibili-大佬.png
│  ├── 📄 …………
└── 📂 blobcat/
│  ├── 📄 blobcat0_0.png
│  ├── 📄 blobcatalt.png
│  ├── 📄 blobcatangry.png
│  ├── 📄 …………
└── 📂 linedog/
│  ├── 📄 linedog-不要.gif
│  ├── 📄 linedog-写不完了.gif
│  ├── 📄 linedog-准备.gif
│  ├── 📄 …………
└── 📂 liushen/
│  ├── 📄 liushen-angry.png
│  ├── 📄 liushen-chowdown.png
│  ├── 📄 liushen-cold.png
│  ├── 📄 …………
├── 📄 main.py

执行脚本即可,注意修改脚本中的文件夹列表和映射关系

generate-owo-artalk.py Raw
1import os
2import json
3
4def generate_artalk_emojis(base_url, emoji_folders, output_path='.json/artalk-emoji.json', origin=None):
5 """
6 生成 Artalk 表情包 JSON 文件
7
8 参数:
9 base_url: 基础 BASE URL
10 emoji_folders: 包含表情包的文件夹列表
11 output_path: 输出 JSON 文件的路径
12 origin: 原始表情包数据,包含网址到名称的映射关系
13 """
14 result = []
15
16 # 创建网址到名称的映射字典
17 url_to_key_map = {}
18 if origin:
19 for group in origin:
20 for item in group.get("items", []):
21 if "val" in item and "key" in item:
22 # 去除可能存在的反引号
23 val = item["val"].replace("`", "").strip()
24 url_to_key_map[val] = item["key"]
25
26 for folder in emoji_folders:
27 if not os.path.isdir(folder):
28 print(f"警告: {folder} 不是一个文件夹,已跳过")
29 continue
30
31 emoji_group = {
32 "name": folder,
33 "type": "image",
34 "items": []
35 }
36
37 # 获取文件夹中的所有文件
38 files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]
39
40 for file in files:
41 # 获取文件名(不带扩展名)
42 filename_without_ext = os.path.splitext(file)[0]
43
44 # 构建完整URL
45 full_url = f"{base_url}/{folder}/{file}"
46
47 # 检查是否在原始数据中存在该URL,如果存在则使用原始key
48 key = url_to_key_map.get(full_url, filename_without_ext)
49
50 # 创建表情项
51 emoji_item = {
52 "key": key,
53 "val": full_url
54 }
55
56 emoji_group["items"].append(emoji_item)
57
58 if emoji_group["items"]: # 只添加非空的表情组
59 result.append(emoji_group)
60
61 # 确保输出目录存在
62 os.makedirs(os.path.dirname(output_path), exist_ok=True)
63
64 # 写入 JSON 文件
65 with open(output_path, 'w', encoding='utf-8') as f:
66 json.dump(result, f, ensure_ascii=False, indent=2)
67
68 print(f"表情包 JSON 文件已生成: {output_path}")
69
70if __name__ == "__main__":
71 base_url = "https://jsd.example.com/gh/willow-god/owo/"
72 folders = ["liushen", "blobcat", "linedog", "bilibili"]
73 origin_json = ".json/artalk-emoji.json"
74 output = ".json/artalk-emoji.json"
75
76 # 加载原始表情包数据(如果存在)
77 origin_data = None
78 try:
79 with open(origin_json, 'r', encoding='utf-8') as f:
80 origin_data = json.load(f)
81 print(f"已加载原始表情包数据: {origin_json}")
82 except FileNotFoundError:
83 print(f"未找到原始表情包数据文件: {origin_json}")
84 except json.JSONDecodeError:
85 print(f"原始表情包数据文件格式错误: {origin_json}")
86
87 generate_artalk_emojis(base_url, folders, output, origin_data)
generate-owo-twikoo.py Raw
1import os
2import json
3
4def generate_twikoo_emojis(base_url, emoji_folders, output_path='.json/twikoo-emojis.json', origin=None):
5 """
6 生成 Twikoo 表情包 JSON 文件
7
8 参数:
9 base_url: 基础 URL
10 emoji_folders: 包含表情包的文件夹列表
11 output_path: 输出 JSON 文件的路径
12 origin: 原始表情包数据,包含网址到名称的映射关系
13 """
14 result = {}
15
16 # 创建网址到名称的映射字典
17 url_to_text_map = {}
18 if origin:
19 for category, data in origin.items():
20 if "container" in data:
21 for item in data["container"]:
22 if "icon" in item and "text" in item:
23 # 从 icon 中提取 URL
24 import re
25 url_match = re.search(r"src=['\"]([^'\"]+)['\"]", item["icon"])
26 if url_match:
27 url = url_match.group(1).replace("`", "").strip()
28 url_to_text_map[url] = item["text"]
29
30 for folder in emoji_folders:
31 if not os.path.isdir(folder):
32 print(f"警告: {folder} 不是一个文件夹,已跳过")
33 continue
34
35 # 为每个文件夹创建一个类别
36 category_name = folder
37 # 可以根据文件夹名称自定义类别显示名称
38 display_names = {
39 "blobcat": "可爱猫",
40 "linedog": "线条狗",
41 "bilibili": "小电视",
42 "liushen": "流沙",
43 # 可以添加更多映射
44 }
45
46 category_display_name = display_names.get(folder, folder)
47
48 emoji_category = {
49 "type": "image",
50 "container": []
51 }
52
53 # 获取文件夹中的所有文件
54 files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]
55
56 for file in files:
57 # 获取文件名(不带扩展名)
58 filename_without_ext = os.path.splitext(file)[0]
59
60 # 构建完整URL
61 full_url = f"{base_url}/{folder}/{file}"
62
63 # 检查是否在原始数据中存在该URL,如果存在则使用原始text
64 text = url_to_text_map.get(full_url, f"{filename_without_ext}")
65
66 # 创建表情项
67 emoji_item = {
68 "text": text,
69 "icon": f"<img src='{full_url}'>"
70 }
71
72 emoji_category["container"].append(emoji_item)
73
74 if emoji_category["container"]: # 只添加非空的表情组
75 result[category_display_name] = emoji_category
76
77 # 确保输出目录存在
78 os.makedirs(os.path.dirname(output_path), exist_ok=True)
79
80 # 写入 JSON 文件
81 with open(output_path, 'w', encoding='utf-8') as f:
82 json.dump(result, f, ensure_ascii=False, indent=2)
83
84 print(f"Twikoo 表情包 JSON 文件已生成: {output_path}")
85
86if __name__ == "__main__":
87 base_url = "https://jsd.example.com/gh/willow-god/owo/"
88 folders = ["liushen", "blobcat", "linedog", "bilibili"]
89 origin_json = ".json/twikoo.json"
90 output = ".json/twikoo-emoji.json"
91
92 # 加载原始表情包数据(如果存在)
93 origin_data = None
94 try:
95 with open(origin_json, 'r', encoding='utf-8') as f:
96 origin_data = json.load(f)
97 print(f"已加载原始表情包数据: {origin_json}")
98 except FileNotFoundError:
99 print(f"未找到原始表情包数据文件: {origin_json}")
100 except json.JSONDecodeError:
101 print(f"原始表情包数据文件格式错误: {origin_json}")
102
103 generate_twikoo_emojis(base_url, folders, output, origin_data)