py_sport.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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 base64
  8. import random
  9. import urllib.parse
  10. class Spider(Spider): # 元类 默认的元类 type
  11. def getName(self):
  12. return "体育直播"
  13. def init(self,extend=""):
  14. print("============{0}============".format(extend))
  15. pass
  16. def isVideoFormat(self,url):
  17. pass
  18. def manualVideoCheck(self):
  19. pass
  20. def homeContent(self,filter):
  21. result = {}
  22. cateManual = {
  23. "体育直播": "全部"
  24. }
  25. classes = []
  26. for k in cateManual:
  27. classes.append({
  28. 'type_name':k,
  29. 'type_id':cateManual[k]
  30. })
  31. result['class'] = classes
  32. if(filter):
  33. result['filters'] = self.config['filter']
  34. return result
  35. def homeVideoContent(self):
  36. result = self.categoryContent('', 1, False, {})
  37. return result
  38. def categoryContent(self,tid,pg, filter,extend):
  39. result = {}
  40. if int(pg) > 1:
  41. return result
  42. rsp = self.fetch('http://itiyu5.tv/spweb/schedule', headers=self.header)
  43. root = self.html(self.cleanText(rsp.text))
  44. dataList = root.xpath("//div[@class='fixtures']/div[@class='box']")
  45. dateList = root.xpath("//div[contains(@class,'subhead')]")
  46. videos = []
  47. for data in dataList:
  48. pos = dataList.index(data)
  49. for video in data.xpath(".//div[@class='list']/ul/li"):
  50. infosList = video.xpath(".//div[@class='team']/div")
  51. stime = video.xpath(".//p[@class='name']/span/text()")[0].strip()
  52. sdate = dateList[pos].xpath('.//text()')[0].split()[0].strip()
  53. hour = stime.split(':')[0]
  54. if int(hour) < 3:
  55. sdate = sdate.replace(sdate[3:-1], str(int(sdate[3:-1]) - 1))
  56. stime = str(21 + int(hour)) + ':' + stime.split(':')[1]
  57. else:
  58. hour = str(int(hour) - 3)
  59. if len(hour) == 1:
  60. hour = '0' + hour
  61. stime = hour + ':' + stime.split(':')[1]
  62. rid = video.xpath(".//p[contains(@class,'btn')]/a/@href")[0]
  63. state = video.xpath(".//p[contains(@class,'btn')]/a/text()")[0].strip()
  64. if len(infosList) != 2:
  65. home = infosList[0].xpath('.//span/text()')[0].strip()
  66. away = infosList[2].xpath('.//span/text()')[0].strip()
  67. cover = infosList[0].xpath('.//img/@src')[0]
  68. name = home + 'VS' + away
  69. else:
  70. cover = 'https://s1.ax1x.com/2022/10/07/x3NPUO.png'
  71. name = infosList[1].xpath('.//text()')[0].strip()
  72. if state != '已结束':
  73. videos.append({
  74. "vod_id": rid,
  75. "vod_name": name,
  76. "vod_pic": cover,
  77. "vod_remarks": '[{}]|{}'.format(sdate, stime)
  78. })
  79. result['list'] = videos
  80. result['page'] = pg
  81. result['pagecount'] = 9999
  82. result['limit'] = 90
  83. result['total'] = 999999
  84. return result
  85. def detailContent(self, array):
  86. for i in range(1, 5):
  87. rsp = self.fetch('http://itiyu5.tv{}/vid/{}'.format(array[0], i), headers=self.header)
  88. if 'vid/{}'.format(i) not in rsp.text:
  89. title = '比赛尚未开始'
  90. purl = ''
  91. break
  92. if not '\'url\': ' in rsp.text:
  93. title = '比赛尚未开始'
  94. purl = ''
  95. break
  96. else:
  97. purl = self.regStr(reg=r"\'url\': \"(.*?)\"", src=rsp.text)
  98. title = self.regStr(reg=r"\"title\": \"(.*?)\"", src=rsp.text)
  99. if purl == '':
  100. rid = self.regStr(reg=r'config\.iurl = \"(.*?)\"', src=rsp.text)
  101. if '.m3u' in rid:
  102. if rid.count('http') != 1:
  103. replstr = self.regStr(reg=r'(http.*?)http', src=rid)
  104. purl = rid.replace(replstr, '')
  105. else:
  106. rid = self.regStr(reg=r'id=(.*)', src=rid)
  107. rsp = self.fetch('https://info.zb.video.qq.com/?cmd=4', headers=self.header)
  108. country = json.loads(rsp.text)['country']
  109. province = json.loads(rsp.text)['province']
  110. city = json.loads(rsp.text)['city']
  111. ip = json.loads(rsp.text)['ip']
  112. rsp = self.fetch('https://geo.yolll.com/geo', headers=self.header)
  113. cf_ua = json.loads(rsp.text)['ua']
  114. cf_cc = json.loads(rsp.text)['ip']
  115. cf_ip = json.loads(rsp.text)['cc']
  116. rnd = round(random.random() * 100000)
  117. param = {
  118. 'type': 'stream',
  119. 'id': rid,
  120. 'rnd': rnd,
  121. 'ip': ip,
  122. 'country': country,
  123. 'province': province,
  124. 'city': city,
  125. 'tx_ip': ip,
  126. 'tx_country': country,
  127. 'tx_province': province,
  128. 'tx_city': city,
  129. 'cf_ip': cf_ip,
  130. 'cf_cc': cf_cc,
  131. 'cf_ua': cf_ua,
  132. 'ref': 'direct',
  133. 'ua': 'web',
  134. }
  135. self.header['Referer'] = 'https://v.stnye.cc/'
  136. self.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
  137. rsp = self.post('https://cdn.dianshunxinxi.com/data/live.php', data=param, headers=self.header)
  138. jo = json.loads(rsp.text)
  139. if jo['status'] != 'success':
  140. return ''
  141. else:
  142. purl = base64.b64decode(urllib.parse.unquote(jo['playurl'])).decode('utf-8')
  143. purl = base64.b64decode(purl).decode('utf-8')
  144. if '.m3u' in purl:
  145. break
  146. vod = {
  147. "vod_id":array[0],
  148. "vod_name":title,
  149. "vod_pic":'https://s1.ax1x.com/2022/10/07/x3NPUO.png',
  150. "type_name":'',
  151. "vod_year":'',
  152. "vod_area":"",
  153. "vod_remarks":'',
  154. "vod_actor":"",
  155. "vod_director":'',
  156. "vod_content":""
  157. }
  158. vod['vod_play_from'] = '体育直播'
  159. vod['vod_play_url'] = '{}${}'.format(title.replace(' ', ''),purl)
  160. result = {
  161. 'list':[
  162. vod
  163. ]
  164. }
  165. return result
  166. def searchContent(self,key,quick):
  167. result = {
  168. 'list':[]
  169. }
  170. return result
  171. def playerContent(self,flag,id,vipFlags):
  172. result = {}
  173. result["parse"] = 0
  174. result["playUrl"] = ''
  175. result["url"] = id
  176. result["header"] = ''
  177. return result
  178. config = {
  179. "player": {},
  180. "filter": {}
  181. }
  182. header = {
  183. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
  184. }
  185. def localProxy(self,param):
  186. return [200, "video/MP2T", action, ""]