autoUrl.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import base64
  2. import re
  3. import datetime
  4. import requests
  5. import json
  6. import urllib3
  7. from Crypto.Cipher import AES
  8. def main():
  9. urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
  10. with open('./url.json', 'r', encoding='utf-8') as f:
  11. urlJson = json.load(f)
  12. nameList = []
  13. reList = ["https://ghproxy.net/https://raw.githubusercontent.com", "https://raw.kkgithub.com",
  14. "https://gcore.jsdelivr.net/gh", "https://mirror.ghproxy.com/https://raw.githubusercontent.com",
  15. "https://github.moeyy.xyz/https://raw.githubusercontent.com", "https://fastly.jsdelivr.net/gh"]
  16. reRawList = [False, False,
  17. True, False,
  18. False, True]
  19. for item in urlJson:
  20. urlData = get_json(item["url"])
  21. for reI in range(len(reList)):
  22. urlName = item["name"]
  23. urlPath = item["path"]
  24. reqText = urlData
  25. if urlName != "gaotianliuyun_0707":
  26. reqText = reqText.replace("'./", "'" + urlPath) \
  27. .replace('"./', '"' + urlPath)
  28. if reRawList[reI]:
  29. reqText = reqText.replace("/raw/", "@")
  30. else:
  31. reqText = reqText.replace("/raw/", "/")
  32. reqText = reqText.replace("'https://github.com", "'" + reList[reI]) \
  33. .replace('"https://github.com', '"' + reList[reI]) \
  34. .replace("'https://raw.githubusercontent.com", "'" + reList[reI]) \
  35. .replace('"https://raw.githubusercontent.com', '"' + reList[reI])
  36. fp = open("./tv/" + str(reI) + "/" + urlName + ".json", "w+", encoding='utf-8')
  37. fp.write(reqText)
  38. collectionJson = {
  39. "urls": []
  40. }
  41. for item in urlJson:
  42. if "_" in item["name"]:
  43. urlItem = {
  44. "url": "./"+ item["name"] + ".json",
  45. "name": item["name"]
  46. }
  47. collectionJson["urls"].append(urlItem)
  48. collectionJson_data = json.dumps(collectionJson, ensure_ascii=False, indent=4)
  49. for reI in range(len(reList)):
  50. fp = open("./tv/" + str(reI) + "/collection.json", "w+", encoding='utf-8')
  51. fp.write(collectionJson_data)
  52. now = datetime.datetime.now()
  53. fp = open('README.md', "w+", encoding='utf-8')
  54. fp.write("# 提示\n\n")
  55. fp.write("感谢各位大佬的无私奉献.\n\n")
  56. fp.write(
  57. "如果有收录您的配置,您也不希望被收录请[issues](https://github.com/hl128k/tvbox/issues),必将第一时间移除\n\n")
  58. fp.write("# 免责声明\n\n")
  59. fp.write("本项目(tvbox)的源代码是按“原样”提供,不带任何明示或暗示的保证。使用者有责任确保其使用符合当地法律法规。\n\n")
  60. fp.write(
  61. "所有以任何方式查看本仓库内容的人、或直接或间接使用本仓库内容的使用者都应仔细阅读此声明。本仓库管理者保留随时更改或补充此免责声明的权利。一旦使用、复制、修改了本仓库内容,则视为您已接受此免责声明。\n\n")
  62. fp.write(
  63. "本仓库管理者不能保证本仓库内容的合法性、准确性、完整性和有效性,请根据情况自行判断。本仓库内容,仅用于测试和学习研究,禁止用于商业用途,不得将其用于违反国家、地区、组织等的法律法规或相关规定的其他用途,禁止任何公众号、自媒体进行任何形式的转载、发布,请不要在中华人民共和国境内使用本仓库内容,否则后果自负。\n\n")
  64. fp.write(
  65. "本仓库内容中涉及的第三方硬件、软件等,与本仓库内容没有任何直接或间接的关系。本仓库内容仅对部署和使用过程进行客观描述,不代表支持使用任何第三方硬件、软件。使用任何第三方硬件、软件,所造成的一切后果由使用的个人或组织承担,与本仓库内容无关。\n\n")
  66. fp.write(
  67. "所有直接或间接使用本仓库内容的个人和组织,应 24 小时内完成学习和研究,并及时删除本仓库内容。如对本仓库内容的功能有需求,应自行开发相关功能。所有基于本仓库内容的源代码,进行的任何修改,为其他个人或组织的自发行为,与本仓库内容没有任何直接或间接的关系,所造成的一切后果亦与本仓库内容和本仓库管理者无关 \n\n")
  68. fp.write("# 介绍\n\n")
  69. fp.write("自用请勿宣传\n\n")
  70. fp.write("所有数据全部搜集于网络,不保证可用性\n\n")
  71. fp.write("因电视对GitHub访问问题,所以将配置中的GitHub换成镜像源\n\n")
  72. fp.write("本次自动更新时间为:" + now.strftime("%Y-%m-%d %H:%M:%S") + "\n\n")
  73. fp.write("当前内容来源详情请查看url.json\n\n")
  74. fp.write("如果感兴趣,请复制项目后自行研究使用\n\n")
  75. fp.close()
  76. def get_json(url):
  77. key = url.split(";")[2] if ";" in url else ""
  78. url = url.split(";")[0] if ";" in url else url
  79. data = get_data(url)
  80. if not data:
  81. raise Exception()
  82. if is_valid_json(data):
  83. return data
  84. if "**" in data:
  85. data = base64_decode(data)
  86. if data.startswith("2423"):
  87. data = cbc_decrypt(data)
  88. if key:
  89. data = ecb_decrypt(data, key)
  90. return data
  91. def get_ext(ext):
  92. try:
  93. return base64_decode(get_data(ext[4:]))
  94. except Exception:
  95. return ""
  96. def get_data(url):
  97. if url.startswith("http"):
  98. urlReq = requests.get(url, verify=False)
  99. return urlReq.text
  100. return ""
  101. def ecb_decrypt(data, key):
  102. spec = AES.new(pad_end(key).encode(), AES.MODE_ECB)
  103. return spec.decrypt(bytes.fromhex(data)).decode("utf-8")
  104. def cbc_decrypt(data):
  105. decode = bytes.fromhex(data).decode().lower()
  106. key = pad_end(decode[decode.index("$#") + 2:decode.index("#$")])
  107. iv = pad_end(decode[-13:])
  108. key_spec = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
  109. data = data[data.index("2324") + 4:-26]
  110. decrypt_data = key_spec.decrypt(bytes.fromhex(data))
  111. return decrypt_data.decode("utf-8")
  112. def base64_decode(data):
  113. extract = extract_base64(data)
  114. return base64.b64decode(extract).decode("utf-8") if extract else data
  115. def extract_base64(data):
  116. match = re.search(r"[A-Za-z0-9]{8}\*\*", data)
  117. return data[data.index(match.group()) + 10:] if match else ""
  118. def pad_end(key):
  119. return key + "0000000000000000"[:16 - len(key)]
  120. def is_valid_json(json_str):
  121. try:
  122. json.loads(json_str)
  123. return True
  124. except json.JSONDecodeError:
  125. return False
  126. main()