胖虎.py 7.0 KB

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