py_次元.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. # coding=utf-8
  2. # !/usr/bin/python
  3. # 嗷呜
  4. import sys
  5. sys.path.append("..")
  6. import re
  7. from base.spider import Spider
  8. from Crypto.Cipher import AES
  9. from Crypto.Util.Padding import pad, unpad
  10. from base64 import b64encode, b64decode
  11. import json
  12. import time
  13. class Spider(Spider):
  14. def getName(self):
  15. return "次元"
  16. def init(self, extend=""):
  17. pass
  18. def isVideoFormat(self, url):
  19. pass
  20. def manualVideoCheck(self):
  21. pass
  22. def action(self, action):
  23. pass
  24. def destroy(self):
  25. pass
  26. host = "http://www.ecydm.top"
  27. t = str(int(time.time()))
  28. def header(self):
  29. header = {
  30. "User-Agent": "okhttp/3.14.9",
  31. "app-version-code": "167",
  32. "app-ui-mode": "light",
  33. "app-user-device-id": "25f869d32598d3d3089a929453dff0bb7",
  34. "app-api-verify-time": self.t,
  35. "app-api-verify-sign": self.aes("encrypt", self.t),
  36. "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
  37. }
  38. return header
  39. def homeContent(self, filter):
  40. data = self.fetch(
  41. "{0}/api.php/getappapi.index/initV119".format(self.host),
  42. headers=self.header(),
  43. ).json()
  44. data1 = self.aes("decrypt", data["data"])
  45. dy = {
  46. "class": "类型",
  47. "area": "地区",
  48. "lang": "语言",
  49. "year": "年份",
  50. "letter": "字母",
  51. "by": "排序",
  52. "sort": "排序",
  53. }
  54. filters = {}
  55. classes = []
  56. json_data = json.loads(data1)["type_list"]
  57. self.homedata = json.loads(data1)["banner_list"]
  58. for item in json_data:
  59. if item["type_name"] == "全部":
  60. continue
  61. has_non_empty_field = False
  62. jsontype_extend = json.loads(item["type_extend"])
  63. self.homedata.extend(item["recommend_list"])
  64. jsontype_extend["sort"] = "最新,最热,最赞,日榜,月榜,周榜"
  65. classes.append({"type_name": item["type_name"], "type_id": item["type_id"]})
  66. for key in dy:
  67. if key in jsontype_extend and jsontype_extend[key].strip() != "":
  68. has_non_empty_field = True
  69. break
  70. if has_non_empty_field:
  71. filters[str(item["type_id"])] = []
  72. for dkey in jsontype_extend:
  73. if dkey in dy and jsontype_extend[dkey].strip() != "":
  74. values = jsontype_extend[dkey].split(",")
  75. value_array = [
  76. {"n": value.strip(), "v": value.strip()}
  77. for value in values
  78. if value.strip() != ""
  79. ]
  80. filters[str(item["type_id"])].append(
  81. {"key": dkey, "name": dy[dkey], "value": value_array}
  82. )
  83. result = {}
  84. result["class"] = classes
  85. result["filters"] = filters
  86. return result
  87. def homeVideoContent(self):
  88. result = {"list": self.homedata}
  89. return result
  90. def categoryContent(self, tid, pg, filter, extend):
  91. body = {
  92. "area": extend.get('area', '全部'),
  93. "year": extend.get('year', '全部'),
  94. "type_id": tid,
  95. "page": pg,
  96. "sort": extend.get('sort', '最新'),
  97. "lang": extend.get('lang', '全部'),
  98. "class": extend.get('class', '全部')
  99. }
  100. result = {}
  101. url = "{0}/api.php/getappapi.index/typeFilterVodList".format(self.host)
  102. data = self.post(url, headers=self.header(), data=body).json()
  103. data1 = self.aes("decrypt", data["data"])
  104. result["list"] = json.loads(data1)["recommend_list"]
  105. result["page"] = pg
  106. result["pagecount"] = 9999
  107. result["limit"] = 90
  108. result["total"] = 999999
  109. return result
  110. def detailContent(self, ids):
  111. body = f"vod_id={ids[0]}"
  112. url = "{0}/api.php/getappapi.index/vodDetail".format(self.host)
  113. data = self.post(url, headers=self.header(), data=body).json()
  114. data1 = json.loads(self.aes("decrypt", data["data"]))
  115. vod = data1["vod"]
  116. play = []
  117. names = []
  118. for itt in data1["vod_play_list"]:
  119. a = []
  120. names.append(itt["player_info"]["show"])
  121. parse = itt["player_info"]["parse"]
  122. for it in itt["urls"]:
  123. if re.search(r"mp4|m3u8", it["url"]):
  124. a.append(f"{it['name']}${it['url']}")
  125. elif re.search(r"www.yemu.xyz", it["parse_api_url"]):
  126. a.append(f"{it['name']}${it['parse_api_url']}")
  127. else:
  128. a.append(
  129. f"{it['name']}${'parse_api=' + parse + '&url=' + self.aes('encrypt', it['url']) + '&token=' + it['token']}")
  130. play.append("#".join(a))
  131. vod["vod_play_from"] = "$$$".join(names)
  132. vod["vod_play_url"] = "$$$".join(play)
  133. result = {"list": [vod]}
  134. return result
  135. def searchContent(self, key, quick, pg="1"):
  136. body = f"keywords={key}&type_id=0&page={pg}"
  137. url = "{0}/api.php/getappapi.index/searchList".format(self.host)
  138. data = self.post(url, headers=self.header(), data=body).text
  139. data1 = json.loads(data)["data"]
  140. data2 = self.aes("decrypt", data1)
  141. result = {"list": json.loads(data2)["search_list",'page':pg]}
  142. return result
  143. def playerContent(self, flag, id, vipFlags):
  144. def edu(str):
  145. def replacer(match):
  146. from urllib.parse import quote_plus
  147. return match.group(1) + quote_plus(match.group(2)) + match.group(3)
  148. return re.sub(r"(url=)(.*?)(&token)", replacer, str)
  149. url = id
  150. p = 0
  151. if "m3u8" not in url and "mp4" not in url:
  152. try:
  153. body = edu(url)
  154. data = self.post("{0}/api.php/getappapi.index/vodParse".format(self.host), headers=self.header(),
  155. data=body).json()
  156. data1 = json.loads(self.aes("decrypt", data["data"]))["json"]
  157. url = json.loads(data1)["url"]
  158. except Exception as e:
  159. url = id
  160. p = 1
  161. if not url.startswith("https://www.yemu.xyz"):
  162. url = "https://www.yemu.xyz/?url={0}".format(id)
  163. result = {}
  164. headers = self.header().copy()
  165. del headers["Content-Type"]
  166. result["parse"] = p
  167. result["url"] = url
  168. result["header"] = headers
  169. return result
  170. def localProxy(self, param):
  171. pass
  172. def aes(self, operation, text):
  173. key = "20c79c979da8db0f".encode("utf-8")
  174. iv = key
  175. if operation == "encrypt":
  176. cipher = AES.new(key, AES.MODE_CBC, iv)
  177. ct_bytes = cipher.encrypt(pad(text.encode("utf-8"), AES.block_size))
  178. ct = b64encode(ct_bytes).decode("utf-8")
  179. return ct
  180. elif operation == "decrypt":
  181. cipher = AES.new(key, AES.MODE_CBC, iv)
  182. pt = unpad(cipher.decrypt(b64decode(text)), AES.block_size)
  183. return pt.decode("utf-8")