py_cokemv.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #coding=utf-8
  2. #!/usr/bin/python
  3. import sys
  4. sys.path.append('..')
  5. from base.spider import Spider
  6. import json
  7. import requests
  8. import base64
  9. import re
  10. class Spider(Spider): # 元类 默认的元类 type
  11. def getName(self):
  12. return "COKEMV"
  13. def init(self,extend=""):
  14. print("============{0}============".format(extend))
  15. pass
  16. def homeContent(self,filter):
  17. result = {}
  18. cateManual = {
  19. "电影":"1",
  20. "剧集":"2",
  21. "动漫":"3",
  22. "综艺":"29"
  23. }
  24. classes = []
  25. for k in cateManual:
  26. classes.append({
  27. 'type_name':k,
  28. 'type_id':cateManual[k]
  29. })
  30. result['class'] = classes
  31. if(filter):
  32. result['filters'] = self.config['filter']
  33. return result
  34. def homeVideoContent(self):
  35. rsp = self.fetch("https://cokemv.me/")
  36. root = self.html(rsp.text)
  37. aList = root.xpath("//div[@class='main']//div[contains(@class,'module-items')]/a")
  38. videos = []
  39. for a in aList:
  40. name = a.xpath('./@title')[0]
  41. pic = a.xpath('.//img/@data-original')[0]
  42. mark = a.xpath(".//div[@class='module-item-note']/text()")[0]
  43. sid = a.xpath("./@href")[0]
  44. sid = self.regStr(sid,"/voddetail/(\\S+).html")
  45. videos.append({
  46. "vod_id":sid,
  47. "vod_name":name,
  48. "vod_pic":pic,
  49. "vod_remarks":mark
  50. })
  51. result = {
  52. 'list':videos
  53. }
  54. return result
  55. def categoryContent(self,tid,pg,filter,extend):
  56. result = {}
  57. url = 'https://cokemv.me/index.php/vod/show/id/{0}.html'.format(tid)
  58. rsp = self.fetch(url)
  59. root = self.html(rsp.text)
  60. aList = root.xpath("//div[@class='module']/a")
  61. videos = []
  62. for a in aList:
  63. name = a.xpath('./@title')[0]
  64. pic = a.xpath('.//img/@data-original')[0]
  65. mark = a.xpath(".//div[contains(@class,'module-item-note')]/text()")[0]
  66. sid = a.xpath("./@href")[0]
  67. sid = self.regStr(sid,"/id/(\\d+).html")
  68. videos.append({
  69. "vod_id":sid,
  70. "vod_name":name,
  71. "vod_pic":pic,
  72. "vod_remarks":mark
  73. })
  74. result['list'] = videos
  75. result['page'] = pg
  76. result['pagecount'] = 9999
  77. result['limit'] = 90
  78. result['total'] = 999999
  79. return result
  80. def detailContent(self,array):
  81. tid = array[0]
  82. url = 'https://cokemv.me/index.php/vod/detail/id/{0}.html'.format(tid)
  83. rsp = self.fetch(url)
  84. root = self.html(rsp.text)
  85. divContent = root.xpath("//div[@class='module-main']")[0]
  86. title = divContent.xpath('.//h1/text()')[0]
  87. year = divContent.xpath('.//div/div/div[1]/a/text()')[0]
  88. area = divContent.xpath('.//div/div/div[2]/a/text()')[0]
  89. typ = divContent.xpath('.//div/div/div[3]/a/text()')
  90. type = ','.join(typ)
  91. pic = divContent.xpath(".//div[@class='module-item-pic']/img/@data-original")[0]
  92. detail = root.xpath(".//div[@class='module-info-introduction-content show-desc']/p/text()")[0].strip()
  93. vod = {
  94. "vod_id":tid,
  95. "vod_name":title,
  96. "vod_pic":pic,
  97. "type_name":type,
  98. "vod_year":year,
  99. "vod_area":area,
  100. "vod_content":detail
  101. }
  102. infoArray = divContent.xpath(".//div[@class='module-info-item']")
  103. for info in infoArray:
  104. content = info.xpath('string(.)').replace('\r','').replace('\n','').replace('\t','')
  105. if content.startswith('导演'):
  106. vod['vod_director'] = content.replace("导演:", "").strip('/')
  107. if content.startswith('主演'):
  108. vod['vod_director'] = content.replace("主演:", "").strip('/')
  109. if content.startswith('更新:'):
  110. vod['vod_remarks'] = content.split(',')[1]
  111. vod_play_from = '$$$'
  112. playFrom = []
  113. vodHeader = root.xpath("//div[@class='module-tab-items']/div/div/span/text()")
  114. for v in vodHeader:
  115. playFrom.append(v)
  116. vod_play_from = vod_play_from.join(playFrom)
  117. vod_play_url = '$$$'
  118. playList = []
  119. vodList = root.xpath("//div[@class='module-play-list']")
  120. for vl in vodList:
  121. vodItems = []
  122. aList = vl.xpath('./div/a')
  123. for tA in aList:
  124. href = tA.xpath('./@href')[0]
  125. name = tA.xpath('.//span/text()')[0]
  126. tId = self.regStr(href,'/id/(\\S+).html')
  127. vodItems.append(name + "$" + tId)
  128. joinStr = '#'
  129. joinStr = joinStr.join(vodItems)
  130. playList.append(joinStr)
  131. vod_play_url = vod_play_url.join(playList)
  132. vod['vod_play_from'] = vod_play_from
  133. vod['vod_play_url'] = vod_play_url
  134. result = {
  135. 'list':[
  136. vod
  137. ]
  138. }
  139. return result
  140. def verifyCode(self, url):
  141. retry = 5
  142. header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}
  143. while retry:
  144. try:
  145. session = requests.session()
  146. img = session.get('https://cokemv.me/index.php/verify/index.html?', headers=header).content
  147. code = session.post('https://api.nn.ci/ocr/b64/text', data=base64.b64encode(img).decode()).text
  148. res = session.post(url=f"https://cokemv.me/index.php/ajax/verify_check?type=search&verify={code}", headers=header).json()
  149. if res["msg"] == "ok":
  150. return session
  151. except Exception as e:
  152. print(e)
  153. finally:
  154. retry = retry - 1
  155. def searchContent(self, key, quick):
  156. url = 'https://cokemv.me/index.php/vod/search.html?wd={0}'.format(key)
  157. session = self.verifyCode(url)
  158. rsp = session.get(url)
  159. root = self.html(rsp.text)
  160. vodList = root.xpath("//div[@class='module-card-item module-item']/a[@class='module-card-item-poster']")
  161. videos = []
  162. for vod in vodList:
  163. name = vod.xpath(".//img/@alt")[0]
  164. pic = vod.xpath(".//img/@data-original")[0]
  165. mark = vod.xpath(".//div[@class='module-item-note']/text()")[0]
  166. sid = vod.xpath("./@href")[0]
  167. sid = self.regStr(sid,"/id/(\\S+).html")
  168. videos.append({
  169. "vod_id":sid,
  170. "vod_name":name,
  171. "vod_pic":pic,
  172. "vod_remarks":mark
  173. })
  174. result = {
  175. 'list':videos
  176. }
  177. return result
  178. config = {
  179. "player": {"ddzy":{"show":"蓝光采集","des":"","ps":"0","parse":""},"tkm3u8":{"show":"采集路线","des":"","ps":"0","parse":""},"if101":{"show":"海外(禁國內)","des":"","ps":"0","parse":""}},
  180. "filter": {}
  181. }
  182. header = {
  183. "origin":"https://cokemv.me",
  184. "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
  185. "Accept":" */*",
  186. "Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7",
  187. "Accept-Encoding":"gzip, deflate"
  188. }
  189. def playerContent(self,flag,id,vipFlags):
  190. url = 'https://cokemv.me/index.php/vod/play/id/{0}.html'.format(id)
  191. header = {
  192. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}
  193. rsp = self.fetch(url,headers=header)
  194. root = self.html(rsp.text)
  195. scripts = root.xpath("//script/text()")
  196. jo = {}
  197. result = {}
  198. for script in scripts:
  199. if(script.startswith("var player_")):
  200. target = script[script.index('{'):]
  201. jo = json.loads(target)
  202. break;
  203. if jo['from'] in self.config['player']:
  204. playerConfig = self.config['player'][jo['from']]
  205. if jo['from'] == 'coke12345':
  206. Url = jo['url']
  207. m3u = self.fetch(Url).text.split('\n')[2]
  208. link = re.findall(r"http.*://.*?/", Url)[0].strip('/')
  209. videoUrl = link + m3u
  210. header = {
  211. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
  212. }
  213. result["header"] = header
  214. else:
  215. videoUrl = jo['url']
  216. result["header"] = json.dumps(self.header)
  217. playerUrl = playerConfig['parse']
  218. result["parse"] = playerConfig['ps']
  219. result["playUrl"] = playerUrl
  220. result["url"] = videoUrl
  221. return result
  222. def isVideoFormat(self,url):
  223. pass
  224. def manualVideoCheck(self):
  225. pass
  226. def localProxy(self,param):
  227. return [200, "video/MP2T", action, ""]