mirror of
				https://github.com/qist/tvbox.git
				synced 2025-10-26 01:32:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import requests
 | |
| import re
 | |
| import demjson3 as demjson
 | |
| import json
 | |
| 
 | |
| # 下载伪 JSON 文本
 | |
| def fetch_raw_json():
 | |
|     url = "https://ua.fongmi.eu.org/box.php?url=https%3A%2F%2Fwww.xn--sss604efuw.com%2Ftv"
 | |
|     resp = requests.get(url, timeout=10)
 | |
|     resp.encoding = 'utf-8'
 | |
|     return resp.text
 | |
| 
 | |
| # 下载 spider 文件
 | |
| def extract_and_save_spider(json_text):
 | |
|     match = re.search(r'"spider"\s*:\s*"([^"]+)"', json_text)
 | |
|     if not match:
 | |
|         raise ValueError("未找到 spider 字段")
 | |
|     full_spider = match.group(1)
 | |
|     spider_url = full_spider.split(";")[0]
 | |
|     print(f"📥 下载 spider 文件: {spider_url}")
 | |
|     resp = requests.get(spider_url, timeout=10)
 | |
|     with open("fan.txt", "wb") as f:
 | |
|         f.write(resp.content)
 | |
|     print("✅ 已保存为 fan.txt")
 | |
| 
 | |
| # 删除不需要的 sites 项 + 替换链接
 | |
| def clean_data(raw_text):
 | |
|     raw_text = raw_text.replace(
 | |
|         "https://gh-proxy.net/https://raw.githubusercontent.com/fantaiying7/EXT/refs/heads/main",
 | |
|         "./FTY"
 | |
|     )
 | |
|     data = demjson.decode(raw_text)
 | |
| 
 | |
|     keywords = [
 | |
|         "豆", "饭太硬", "广告", "PanSso", "YpanSo", "xzso", "米搜", "夸搜", "Aliso", "YiSo"
 | |
|     ]
 | |
|     original_count = len(data.get("sites", []))
 | |
|     data["sites"] = [s for s in data["sites"] if not any(kw in s.get("key", "") or kw in s.get("name", "") for kw in keywords)]
 | |
|     print(f"🧹 清理 {original_count - len(data['sites'])} 条 sites")
 | |
|     return data
 | |
| 
 | |
| # 格式美化保存
 | |
| class CompactJSONEncoder(json.JSONEncoder):
 | |
|     def iterencode(self, o, _one_shot=False):
 | |
|         def _compact_list(lst, indent_level):
 | |
|             pad = '  ' * indent_level
 | |
|             if all(isinstance(i, dict) for i in lst):
 | |
|                 return '[\n' + ',\n'.join([pad + '  ' + json.dumps(i, ensure_ascii=False, separators=(',', ': ')) for i in lst]) + '\n' + pad + ']'
 | |
|             return json.dumps(lst, ensure_ascii=False, indent=2)
 | |
|         def _encode(obj, indent_level=0):
 | |
|             pad = '  ' * indent_level
 | |
|             if isinstance(obj, dict):
 | |
|                 lines = [f'"{k}": {_encode(v, indent_level+1)}' for k, v in obj.items()]
 | |
|                 return '{\n' + pad + '  ' + (',\n' + pad + '  ').join(lines) + '\n' + pad + '}'
 | |
|             elif isinstance(obj, list):
 | |
|                 return _compact_list(obj, indent_level)
 | |
|             return json.dumps(obj, ensure_ascii=False)
 | |
|         return iter([_encode(o)])
 | |
| 
 | |
| def save_json(data, filename="tvbox_cleaned.json"):
 | |
|     with open(filename, "w", encoding="utf-8") as f:
 | |
|         json.dump(data, f, ensure_ascii=False, indent=2, cls=CompactJSONEncoder)
 | |
|     print(f"✅ 最终 JSON 保存为 {filename}")
 | |
| 
 | |
| # 主流程
 | |
| if __name__ == "__main__":
 | |
|     try:
 | |
|         raw_text = fetch_raw_json()
 | |
|         extract_and_save_spider(raw_text)
 | |
|         data = clean_data(raw_text)
 | |
|         save_json(data)
 | |
|     except Exception as e:
 | |
|         print(f"❌ 错误: {e}")
 | |
| 
 |