py_可可.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. # coding=utf-8
  2. # !/usr/bin/python
  3. # 嗷呜
  4. import sys
  5. from base64 import b64decode
  6. sys.path.append('..')
  7. from base.spider import Spider
  8. import re
  9. from bs4 import BeautifulSoup
  10. from Crypto.Cipher import AES
  11. from Crypto.Util.Padding import unpad
  12. class Spider(Spider):
  13. def getName(self):
  14. return "可可"
  15. def init(self, extend=""):
  16. pass
  17. def isVideoFormat(self, url):
  18. pass
  19. def manualVideoCheck(self):
  20. pass
  21. def destroy(self):
  22. pass
  23. def cleanText(self, src):
  24. clean = re.sub('[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\U0001F1E0-\U0001F1FF]', '',
  25. src)
  26. return clean
  27. def jsp(self, content):
  28. return BeautifulSoup(content, "html.parser")
  29. host = "https://www.kkys02.com"
  30. header = {
  31. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  32. "Chrome/94.0.4606.54 Safari/537.36"
  33. }
  34. phost="https://vres.jxlfl.cn"
  35. def homeContent(self, filter):
  36. result = {}
  37. data = self.fetch(self.host, headers=self.header)
  38. htmld = self.jsp(self.cleanText(data.text))
  39. list = htmld.select('.main ul[class="fs-margin menu"]')[1]
  40. self.hlist = htmld.find('div', class_='module-box module-v-box module-one-row-box')
  41. classes = []
  42. for li in list.find_all('li', class_='menu-item'):
  43. classes.append({
  44. 'type_name': li.find('div', class_='menu-item-label').get_text(),
  45. 'type_id': re.findall(r'\d+', li.a.get('href'))[0]
  46. })
  47. result['class'] = classes
  48. return result
  49. def homeVideoContent(self):
  50. videos = []
  51. for li in self.hlist.select('.module-box-inner .module-item'):
  52. id = li.a.get('href')
  53. name = li.find('div', class_='v-item-footer').find_all('div')[1].get_text(strip=True)
  54. pic = li.find_all('img')[-1].get('data-original')
  55. remark = li.find('div', class_='v-item-bottom').find_all('span')[1].get_text(strip=True)
  56. year = li.find('div', class_='v-item-top-left').get_text(strip=True)
  57. videos.append({
  58. "vod_id": id,
  59. "vod_name": name,
  60. "vod_pic": self.phost + pic,
  61. "vod_remarks": remark,
  62. "vod_year": year
  63. })
  64. result = {
  65. 'list': videos
  66. }
  67. return result
  68. def categoryContent(self, tid, pg, filter, extend):
  69. result = {}
  70. url = f'{self.host}/show/{tid}-----3-{pg}.html'
  71. html = self.fetch(url, headers=self.header)
  72. data = self.jsp(self.cleanText(html.text))
  73. list = data.find('div', class_='module-box-inner')
  74. videos = []
  75. for li in list.select('.module-box-inner .module-item'):
  76. id = li.a.get('href')
  77. name = li.find('div', class_='v-item-footer').find_all('div')[1].get_text(strip=True)
  78. pic = li.find_all('img')[-1].get('data-original')
  79. remark = li.find('div', class_='v-item-bottom').find_all('span')[1].get_text(strip=True)
  80. year = li.find('div', class_='v-item-top-left').get_text(strip=True)
  81. videos.append({
  82. "vod_id": id,
  83. "vod_name": name,
  84. "vod_pic": self.phost + pic,
  85. "vod_remarks": remark,
  86. "vod_year": year
  87. })
  88. result['list'] = videos
  89. result['page'] = pg
  90. result['pagecount'] = 9999
  91. result['limit'] = 90
  92. result['total'] = 999999
  93. return result
  94. def detailContent(self, ids):
  95. tid = ids[0]
  96. url = self.host + tid
  97. html = self.fetch(url, headers=self.header)
  98. data = (self.jsp(self.cleanText(html.text)))
  99. data1 = data.find('div', class_='detail-box fs-margin-section')
  100. data2 = data.find('div', id='detail-source-swiper')
  101. vod_play_from = []
  102. index = None
  103. for idx, li in enumerate(data2.find_all('span', class_='source-item-label', id=True), start=0):
  104. li_text = li.get_text(strip=True)
  105. if '4K' in li_text:
  106. index = idx
  107. continue
  108. vod_play_from.append(li_text)
  109. data3 = data.find_all('div', class_='episode-list')
  110. if index:
  111. del data3[index]
  112. vod_play_url = []
  113. for li in data3:
  114. dd = []
  115. for lii in li.find_all('a'):
  116. dd.append(lii.get_text(strip=True) + "$" + lii.get('href'))
  117. vod_play_url.append('#'.join(dd))
  118. vod = {
  119. "vod_name": data1.find('div', class_='detail-title').find_all('strong')[1].get_text(strip=True),
  120. "vod_content": data1.find('div', class_='detail-desc').get_text(strip=True),
  121. "vod_play_from": '$$$'.join(vod_play_from),
  122. "vod_play_url": '$$$'.join(vod_play_url)
  123. }
  124. result = {
  125. 'list': [
  126. vod
  127. ]
  128. }
  129. return result
  130. # 未写搜索下面的可忽略
  131. def searchContent(self, key, quick, pg="1"):
  132. result = {}
  133. url = f'{self.host}/search?k={key}&page={pg}'
  134. html = self.fetch(url, headers=self.header)
  135. data = self.jsp(self.cleanText(html.text))
  136. list = data.find('div', class_='search-result-list fs-margin-section')
  137. videos = []
  138. for li in list.find_all('a', class_='search-result-item'):
  139. id = li.get('href')
  140. name = li.find('div', class_='search-result-item-main').find_all('div')[1].get_text(strip=True)
  141. pic = li.find_all('img')[-1].get('data-original')
  142. ddd = li.find('div', class_='tags').find_all('span')
  143. remark = ddd[-1].get_text(strip=True)
  144. year = ddd[0].get_text(strip=True)
  145. videos.append({
  146. "vod_id": id,
  147. "vod_name": name,
  148. "vod_pic": self.phost + pic,
  149. "vod_remarks": remark,
  150. "vod_year": year
  151. })
  152. result = {
  153. 'list': videos,
  154. 'pg': pg
  155. }
  156. return result
  157. def playerContent(self, flag, id, vipFlags):
  158. url = self.host + id
  159. html = self.fetch(url, headers=self.header)
  160. data = self.cleanText(html.text).strip()
  161. data1 = re.search(r"TMDPPPP = '(.*?)';", data)[1]
  162. def decrypt(encrypted_word):
  163. key = "FNF9aVQF!G*0ux@2hAigUeB3".encode('utf-8')
  164. encrypted_word_bytes = b64decode(encrypted_word)
  165. cipher = AES.new(key, AES.MODE_ECB)
  166. decrypted = unpad(cipher.decrypt(encrypted_word_bytes), AES.block_size)
  167. return decrypted.decode('utf-8')
  168. result = {}
  169. result["parse"] = 0
  170. result["url"] = decrypt(data1)
  171. result["header"] = self.header
  172. return result
  173. def localProxy(self, param):
  174. pass