LREEOK.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. # -*- coding: utf-8 -*-
  2. # by @嗷呜
  3. # 温馨提示:官方APP数据是错误的,你们可以给官方反馈,然后就可以写APP
  4. import re
  5. import sys
  6. from Crypto.Hash import MD5
  7. sys.path.append("..")
  8. import json
  9. import time
  10. from pyquery import PyQuery as pq
  11. from base.spider import Spider
  12. class Spider(Spider):
  13. def init(self, extend=""):
  14. pass
  15. def getName(self):
  16. pass
  17. def isVideoFormat(self, url):
  18. pass
  19. def manualVideoCheck(self):
  20. pass
  21. def action(self, action):
  22. pass
  23. def destroy(self):
  24. pass
  25. host = 'https://www.lreeok.vip'
  26. headers = {
  27. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
  28. 'Accept': 'application/json, text/javascript, */*; q=0.01',
  29. 'sec-ch-ua-platform': '"macOS"',
  30. 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="134", "Google Chrome";v="134"',
  31. 'Origin': host,
  32. 'Referer': f"{host}/",
  33. }
  34. def homeContent(self, filter):
  35. data = self.getpq(self.fetch(self.host, headers=self.headers).text)
  36. result = {}
  37. classes = []
  38. for k in data('.head-more.box a').items():
  39. i = k.attr('href')
  40. if i and '/vod' in i:
  41. classes.append({
  42. 'type_name': k.text(),
  43. 'type_id': re.search(r'\d+', i).group(0)
  44. })
  45. result['class'] = classes
  46. result['list'] = self.getlist(data('.border-box.diy-center .public-list-div'))
  47. return result
  48. def homeVideoContent(self):
  49. pass
  50. def categoryContent(self, tid, pg, filter, extend):
  51. body = {'type': tid, 'class': '', 'area': '', 'lang': '', 'version': '', 'state': '', 'letter': '', 'page': pg}
  52. data = self.post(f"{self.host}/index.php/api/vod", headers=self.headers, data=self.getbody(body)).json()
  53. result = {}
  54. result['list'] = data['list']
  55. result['page'] = pg
  56. result['pagecount'] = 9999
  57. result['limit'] = 90
  58. result['total'] = 999999
  59. return result
  60. def detailContent(self, ids):
  61. data = self.getpq(self.fetch(f"{self.host}/voddetail/{ids[0]}.html", headers=self.headers).text)
  62. v = data('.detail-info.lightSpeedIn .slide-info')
  63. vod = {
  64. 'vod_year': v.eq(-1).text(),
  65. 'vod_remarks': v.eq(0).text(),
  66. 'vod_actor': v.eq(3).text(),
  67. 'vod_director': v.eq(2).text(),
  68. 'vod_content': data('.switch-box #height_limit').text()
  69. }
  70. np = data('.anthology.wow.fadeInUp')
  71. ndata = np('.anthology-tab .swiper-wrapper .swiper-slide')
  72. pdata = np('.anthology-list .anthology-list-box ul')
  73. play, names = [], []
  74. for i in range(len(ndata)):
  75. n = ndata.eq(i)('a')
  76. n('span').remove()
  77. names.append(n.text())
  78. vs = []
  79. for v in pdata.eq(i)('li').items():
  80. vs.append(f"{v.text()}${v('a').attr('href')}")
  81. play.append('#'.join(vs))
  82. vod["vod_play_from"] = "$$$".join(names)
  83. vod["vod_play_url"] = "$$$".join(play)
  84. result = {"list": [vod]}
  85. return result
  86. def searchContent(self, key, quick, pg="1"):
  87. # data = self.getpq(self.fetch(f"{self.host}/vodsearch/{key}----------{pg}---.html", headers=self.headers).text)
  88. # return {'list': self.getlist(data('.row-right .search-box .public-list-bj')), 'page': pg}
  89. data = self.fetch(
  90. f"{self.host}/index.php/ajax/suggest?mid={pg}&wd={key}&limit=999&timestamp={int(time.time() * 1000)}",
  91. headers=self.headers).json()
  92. videos = []
  93. for i in data['list']:
  94. videos.append({
  95. 'vod_id': i['id'],
  96. 'vod_name': i['name'],
  97. 'vod_pic': i['pic']
  98. })
  99. return {'list': videos, 'page': pg}
  100. def playerContent(self, flag, id, vipFlags):
  101. h, p = {"User-Agent": "okhttp/3.14.9"}, 1
  102. url = f"{self.host}{id}"
  103. data = self.getpq(self.fetch(url, headers=self.headers).text)
  104. try:
  105. jstr = data('.player .player-left script').eq(0).text()
  106. jsdata = json.loads(jstr.split('aaa=')[-1])
  107. body = {'url': jsdata['url']}
  108. if not re.search(r'\.m3u8|\.mp4', body['url']):
  109. data = self.post(f"{self.host}/okplay/api_config.php", headers=self.headers,
  110. data=self.getbody(body)).json()
  111. url = data.get('url') or data.get('data', {}).get('url')
  112. p = 0
  113. except Exception as e:
  114. print('错误信息:', e)
  115. pass
  116. result = {}
  117. result["parse"] = p
  118. result["url"] = url
  119. result["header"] = h
  120. return result
  121. def localProxy(self, param):
  122. pass
  123. def getbody(self, params):
  124. t = int(time.time())
  125. h = MD5.new()
  126. h.update(f"DS{t}DCC147D11943AF75".encode('utf-8'))
  127. key = h.hexdigest()
  128. params.update({'time': t, 'key': key})
  129. return params
  130. def getlist(self, data):
  131. videos = []
  132. for i in data.items():
  133. id = i('a').attr('href')
  134. if id:
  135. id = re.search(r'\d+', id).group(0)
  136. img = i('img').attr('data-src')
  137. if img and 'url=' in img: img = f'{self.host}{img}'
  138. videos.append({
  139. 'vod_id': id,
  140. 'vod_name': i('img').attr('alt'),
  141. 'vod_pic': img,
  142. 'vod_remarks': i('.public-prt').text() or i('.public-list-prb').text()
  143. })
  144. return videos
  145. def getpq(self, data):
  146. try:
  147. return pq(data)
  148. except Exception as e:
  149. print(f"{str(e)}")
  150. return pq(data.encode('utf-8'))