py_cctv.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  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 time
  8. import base64
  9. import re
  10. from urllib import request, parse
  11. import urllib
  12. import urllib.request
  13. import time
  14. class Spider(Spider): # 元类 默认的元类 type
  15. def getName(self):
  16. return "中央电视台"#可搜索
  17. def init(self,extend=""):
  18. print("============{0}============".format(extend))
  19. pass
  20. def isVideoFormat(self,url):
  21. pass
  22. def manualVideoCheck(self):
  23. pass
  24. def homeContent(self,filter):
  25. result = {}
  26. cateManual = {
  27. "栏目大全": "栏目大全",
  28. "特别节目": "特别节目",
  29. "纪录片": "纪录片",
  30. "电视剧": "电视剧",
  31. "动画片": "动画片"
  32. }
  33. classes = []
  34. for k in cateManual:
  35. classes.append({
  36. 'type_name':k,
  37. 'type_id':cateManual[k]
  38. })
  39. result['class'] = classes
  40. if(filter):
  41. result['filters'] = self.config['filter']
  42. return result
  43. def homeVideoContent(self):
  44. result = {
  45. 'list':[]
  46. }
  47. return result
  48. def categoryContent(self,tid,pg,filter,extend):
  49. result = {}
  50. month = ""#月
  51. year = ""#年
  52. area=''#地区
  53. channel=''#频道
  54. datafl=''#类型
  55. letter=''#字母
  56. pagecount=24
  57. if tid=='动画片':
  58. id=urllib.parse.quote(tid)
  59. if 'datadq-area' in extend.keys():
  60. area=urllib.parse.quote(extend['datadq-area'])
  61. if 'dataszm-letter' in extend.keys():
  62. letter=extend['dataszm-letter']
  63. if 'datafl-sc' in extend.keys():
  64. datafl=urllib.parse.quote(extend['datafl-sc'])
  65. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955899450127&area={0}&sc={4}&fc={1}&letter={2}&p={3}&n=24&serviceId=tvcctv&topv=1&t=json'.format(area,id,letter,pg,datafl)
  66. elif tid=='纪录片':
  67. id=urllib.parse.quote(tid)
  68. if 'datapd-channel' in extend.keys():
  69. channel=urllib.parse.quote(extend['datapd-channel'])
  70. if 'datafl-sc' in extend.keys():
  71. datafl=urllib.parse.quote(extend['datafl-sc'])
  72. if 'datanf-year' in extend.keys():
  73. year=extend['datanf-year']
  74. if 'dataszm-letter' in extend.keys():
  75. letter=extend['dataszm-letter']
  76. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955924871139&fc={0}&channel={1}&sc={2}&year={3}&letter={4}&p={5}&n=24&serviceId=tvcctv&topv=1&t=json'.format(id,channel,datafl,year,letter,pg)
  77. elif tid=='电视剧':
  78. id=urllib.parse.quote(tid)
  79. if 'datafl-sc' in extend.keys():
  80. datafl=urllib.parse.quote(extend['datafl-sc'])
  81. if 'datadq-area' in extend.keys():
  82. area=urllib.parse.quote(extend['datadq-area'])
  83. if 'datanf-year' in extend.keys():
  84. year=extend['datanf-year']
  85. if 'dataszm-letter' in extend.keys():
  86. letter=extend['dataszm-letter']
  87. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955853485115&area={0}&sc={1}&fc={2}&year={3}&letter={4}&p={5}&n=24&serviceId=tvcctv&topv=1&t=json'.format(area,datafl,id,year,letter,pg)
  88. elif tid=='特别节目':
  89. id=urllib.parse.quote(tid)
  90. if 'datapd-channel' in extend.keys():
  91. channel=urllib.parse.quote(extend['datapd-channel'])
  92. if 'datafl-sc' in extend.keys():
  93. datafl=urllib.parse.quote(extend['datafl-sc'])
  94. if 'dataszm-letter' in extend.keys():
  95. letter=extend['dataszm-letter']
  96. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955953877151&channel={0}&sc={1}&fc={2}&bigday=&letter={3}&p={4}&n=24&serviceId=tvcctv&topv=1&t=json'.format(channel,datafl,id,letter,pg)
  97. elif tid=='栏目大全':
  98. cid=''#频道
  99. if 'cid' in extend.keys():
  100. cid=extend['cid']
  101. fc=''#分类
  102. if 'fc' in extend.keys():
  103. fc=extend['fc']
  104. fl=''#字母
  105. if 'fl' in extend.keys():
  106. fl=extend['fl']
  107. url = 'https://api.cntv.cn/lanmu/columnSearch?&fl={0}&fc={1}&cid={2}&p={3}&n=20&serviceId=tvcctv&t=json&cb=ko'.format(fl,fc,cid,pg)
  108. pagecount=20
  109. else:
  110. url = 'https://tv.cctv.com/epg/index.shtml'
  111. videos=[]
  112. htmlText =self.webReadFile(urlStr=url,header=self.header)
  113. if tid=='栏目大全':
  114. index=htmlText.rfind(');')
  115. if index>-1:
  116. htmlText=htmlText[3:index]
  117. videos =self.get_list1(html=htmlText,tid=tid)
  118. else:
  119. videos =self.get_list(html=htmlText,tid=tid)
  120. #print(videos)
  121. result['list'] = videos
  122. result['page'] = pg
  123. result['pagecount'] = 9999 if len(videos)>=pagecount else pg
  124. result['limit'] = 90
  125. result['total'] = 999999
  126. return result
  127. def detailContent(self,array):
  128. result={}
  129. aid = array[0].split('###')
  130. tid = aid[0]
  131. logo = aid[3]
  132. lastVideo = aid[2]
  133. title = aid[1]
  134. id= aid[4]
  135. vod_year= aid[5]
  136. actors= aid[6]
  137. brief= aid[7]
  138. fromId='CCTV'
  139. if tid=="栏目大全":
  140. lastUrl = 'https://api.cntv.cn/video/videoinfoByGuid?guid={0}&serviceId=tvcctv'.format(id)
  141. htmlTxt = self.webReadFile(urlStr=lastUrl,header=self.header)
  142. topicId=json.loads(htmlTxt)['ctid']
  143. Url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d=&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId)
  144. htmlTxt = self.webReadFile(urlStr=Url,header=self.header)
  145. else:
  146. Url='https://api.cntv.cn/NewVideo/getVideoListByAlbumIdNew?id={0}&serviceId=tvcctv&p=1&n=100&mode=0&pub=1'.format(id)
  147. jRoot = ''
  148. videoList = []
  149. try:
  150. if tid=="搜索":
  151. fromId='中央台'
  152. videoList=[title+"$"+lastVideo]
  153. else:
  154. htmlTxt=self.webReadFile(urlStr=Url,header=self.header)
  155. jRoot = json.loads(htmlTxt)
  156. data=jRoot['data']
  157. jsonList=data['list']
  158. videoList=self.get_EpisodesList(jsonList=jsonList)
  159. if len(videoList)<1:
  160. htmlTxt=self.webReadFile(urlStr=lastVideo,header=self.header)
  161. if tid=="电视剧" or tid=="纪录片":
  162. patternTxt=r"'title':\s*'(?P<title>.+?)',\n{0,1}\s*'brief':\s*'(.+?)',\n{0,1}\s*'img':\s*'(.+?)',\n{0,1}\s*'url':\s*'(?P<url>.+?)'"
  163. elif tid=="特别节目":
  164. patternTxt=r'class="tp1"><a\s*href="(?P<url>https://.+?)"\s*target="_blank"\s*title="(?P<title>.+?)"></a></div>'
  165. elif tid=="动画片":
  166. patternTxt=r"'title':\s*'(?P<title>.+?)',\n{0,1}\s*'img':\s*'(.+?)',\n{0,1}\s*'brief':\s*'(.+?)',\n{0,1}\s*'url':\s*'(?P<url>.+?)'"
  167. elif tid=="栏目大全":
  168. patternTxt=r'href="(?P<url>.+?)" target="_blank" alt="(?P<title>.+?)" title=".+?">'
  169. videoList=self.get_EpisodesList_re(htmlTxt=htmlTxt,patternTxt=patternTxt)
  170. fromId='央视'
  171. except:
  172. pass
  173. if len(videoList) == 0:
  174. return {}
  175. vod = {
  176. "vod_id":array[0],
  177. "vod_name":title,
  178. "vod_pic":logo,
  179. "type_name":tid,
  180. "vod_year":vod_year,
  181. "vod_area":"",
  182. "vod_remarks":'',
  183. "vod_actor":actors,
  184. "vod_director":'',
  185. "vod_content":brief
  186. }
  187. vod['vod_play_from'] = fromId
  188. vod['vod_play_url'] = "#".join(videoList)
  189. result = {
  190. 'list':[
  191. vod
  192. ]
  193. }
  194. return result
  195. def get_lineList(self,Txt,mark,after):
  196. circuit=[]
  197. origin=Txt.find(mark)
  198. while origin>8:
  199. end=Txt.find(after,origin)
  200. circuit.append(Txt[origin:end])
  201. origin=Txt.find(mark,end)
  202. return circuit
  203. def get_RegexGetTextLine(self,Text,RegexText,Index):
  204. returnTxt=[]
  205. pattern = re.compile(RegexText, re.M|re.S)
  206. ListRe=pattern.findall(Text)
  207. if len(ListRe)<1:
  208. return returnTxt
  209. for value in ListRe:
  210. returnTxt.append(value)
  211. return returnTxt
  212. def searchContent(self,key,quick):
  213. key=urllib.parse.quote(key)
  214. Url='https://search.cctv.com/ifsearch.php?page=1&qtext={0}&sort=relevance&pageSize=20&type=video&vtime=-1&datepid=1&channel=&pageflag=0&qtext_str={0}'.format(key)
  215. htmlTxt=self.webReadFile(urlStr=Url,header=self.header)
  216. videos=self.get_list_search(html=htmlTxt,tid='搜索')
  217. result = {
  218. 'list':videos
  219. }
  220. return result
  221. def playerContent(self,flag,id,vipFlags):
  222. result = {}
  223. url=''
  224. parse=0
  225. headers = {
  226. 'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
  227. }
  228. if flag=='CCTV':
  229. url=self.get_m3u8(urlTxt=id)
  230. else:
  231. try:
  232. html=self.webReadFile(urlStr=id,header=self.header)
  233. guid=self.get_RegexGetText(Text=html,RegexText=r'var\sguid\s*=\s*"(.+?)";',Index=1)
  234. url=self.get_m3u8(urlTxt=guid)
  235. except :
  236. url=id
  237. parse=1
  238. if url.find('https:')<0:
  239. url=id
  240. parse=1
  241. result["parse"] = parse#1=嗅探,0=播放
  242. result["playUrl"] = ''
  243. result["url"] = url
  244. result["header"] =headers
  245. return result
  246. config = {
  247. "player": {},
  248. "filter": {
  249. "电视剧":[
  250. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"谍战","v":"谍战"},{"n":"悬疑","v":"悬疑"},{"n":"刑侦","v":"刑侦"},{"n":"历史","v":"历史"},{"n":"古装","v":"古装"},{"n":"武侠","v":"武侠"},{"n":"军旅","v":"军旅"},{"n":"战争","v":"战争"},{"n":"喜剧","v":"喜剧"},{"n":"青春","v":"青春"},{"n":"言情","v":"言情"},{"n":"偶像","v":"偶像"},{"n":"家庭","v":"家庭"},{"n":"年代","v":"年代"},{"n":"革命","v":"革命"},{"n":"农村","v":"农村"},{"n":"都市","v":"都市"},{"n":"其他","v":"其他"}]},
  251. {"key":"datadq-area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"香港"},{"n":"美国","v":"美国"},{"n":"欧洲","v":"欧洲"},{"n":"泰国","v":"泰国"}]},
  252. {"key":"datanf-year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"},{"n":"1999","v":"1999"},{"n":"1998","v":"1998"},{"n":"1997","v":"1997"}]},
  253. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  254. ],
  255. "动画片":[
  256. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"亲子","v":"亲子"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"动作","v":"动作"},{"n":"宠物","v":"宠物"},{"n":"体育","v":"体育"},{"n":"益智","v":"益智"},{"n":"历史","v":"历史"},{"n":"教育","v":"教育"},{"n":"校园","v":"校园"},{"n":"言情","v":"言情"},{"n":"武侠","v":"武侠"},{"n":"经典","v":"经典"},{"n":"未来","v":"未来"},{"n":"古代","v":"古代"},{"n":"神话","v":"神话"},{"n":"真人","v":"真人"},{"n":"励志","v":"励志"},{"n":"热血","v":"热血"},{"n":"奇幻","v":"奇幻"},{"n":"童话","v":"童话"},{"n":"剧情","v":"剧情"},{"n":"夺宝","v":"夺宝"},{"n":"其他","v":"其他"}]},
  257. {"key":"datadq-area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"美国","v":"美国"},{"n":"欧洲","v":"欧洲"},{"n":"其他","v":"其他地区"}]},
  258. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  259. ],
  260. "纪录片":[
  261. {"key":"datapd-channel","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV1 综合","v":"CCTV-1综合,CCTV-1高清,CCTV-1综合高清"},{"n":"CCTV2 财经","v":"CCTV-2财经,CCTV-2高清,CCTV-2财经高清"},{"n":"CCTV3 综艺","v":"CCTV-3综艺,CCTV-3高清,CCTV-3综艺高清"},{"n":"CCTV4 中文国际","v":"CCTV-4中文国际,CCTV-4高清,CCTV-4中文国际(亚)高清"},{"n":"CCTV5 体育","v":"CCTV-5体育,CCTV-5高清,CCTV-5体育高清"},{"n":"CCTV6 电影","v":"CCTV-6电影,CCTV-6高清,CCTV-6电影高清"},{"n":"CCTV7 国防军事","v":"CCTV-7军事农业,CCTV-7军事农业高清,CCTV-7国防军事高清"},{"n":"CCTV8 电视剧","v":"CCTV-8电视剧,CCTV-8高清,CCTV-8电视剧高清"},{"n":"CCTV9 纪录","v":"CCTV-9纪录,CCTV-9高清,CCTV-9纪录高清"},{"n":"CCTV10 科教","v":"CCTV-10科教,CCTV-10高清,CCTV-10科教高清"},{"n":"CCTV11 戏曲","v":"CCTV-11戏曲,CCTV-11高清,CCTV-11戏曲高清"},{"n":"CCTV12 社会与法","v":"CCTV-12社会与法,CCTV-12高清,CCTV-12社会与法高清"},{"n":"CCTV13 新闻","v":"CCTV-13新闻,CCTV-13高清,CCTV-13新闻高清"},{"n":"CCTV14 少儿","v":"CCTV-14少儿,CCTV-14高清,CCTV-14少儿高清"},{"n":"CCTV15 音乐","v":"CCTV-15音乐,CCTV-15高清,CCTV-15音乐高清"},{"n":"CCTV17 农业农村","v":"CCTV-17农业农村高清"}]},
  262. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"人文历史","v":"人文历史"},{"n":"人物","v":"人物"},{"n":"军事","v":"军事"},{"n":"探索","v":"探索"},{"n":"社会","v":"社会"},{"n":"时政","v":"时政"},{"n":"经济","v":"经济"},{"n":"科技","v":"科技"}]},
  263. {"key":"datanf-year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},
  264. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  265. ],
  266. "特别节目":[
  267. {"key":"datapd-channel","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV1 综合","v":"CCTV-1综合,CCTV-1高清,CCTV-1综合高清"},{"n":"CCTV2 财经","v":"CCTV-2财经,CCTV-2高清,CCTV-2财经高清"},{"n":"CCTV3 综艺","v":"CCTV-3综艺,CCTV-3高清,CCTV-3综艺高清"},{"n":"CCTV4 中文国际","v":"CCTV-4中文国际,CCTV-4高清,CCTV-4中文国际(亚)高清"},{"n":"CCTV5 体育","v":"CCTV-5体育,CCTV-5高清,CCTV-5体育高清"},{"n":"CCTV6 电影","v":"CCTV-6电影,CCTV-6高清,CCTV-6电影高清"},{"n":"CCTV7 国防军事","v":"CCTV-7军事农业,CCTV-7高清,CCTV-7军事农业高清,CCTV-7国防军事高清"},{"n":"CCTV8 电视剧","v":"CCTV-8电视剧,CCTV-8高清,CCTV-8电视剧高清"},{"n":"CCTV9 纪录","v":"CCTV-9纪录,CCTV-9高清,CCTV-9纪录高清"},{"n":"CCTV10 科教","v":"CCTV-10科教,CCTV-10高清,CCTV-10科教高清"},{"n":"CCTV11 戏曲","v":"CCTV-11戏曲,CCTV-11高清,CCTV-11戏曲高清"},{"n":"CCTV12 社会与法","v":"CCTV-12社会与法,CCTV-12高清,CCTV-12社会与法高清"},{"n":"CCTV13 新闻","v":"CCTV-13新闻,CCTV-13高清,CCTV-13新闻高清"},{"n":"CCTV14 少儿","v":"CCTV-14少儿,CCTV-14高清,CCTV-14少儿高清"},{"n":"CCTV15 音乐","v":"CCTV-15音乐,CCTV-15高清,CCTV-15音乐高清"},{"n":"CCTV17 农业农村","v":"CCTV-17农业农村高清"}]},
  268. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"新闻","v":"新闻"},{"n":"经济","v":"经济"},{"n":"综艺","v":"综艺"},{"n":"体育","v":"体育"},{"n":"军事","v":"军事"},{"n":"影视","v":"影视"},{"n":"科教","v":"科教"},{"n":"戏曲","v":"戏曲"},{"n":"青少","v":"青少"},{"n":"音乐","v":"音乐"},{"n":"社会","v":"社会"},{"n":"公益","v":"公益"},{"n":"其他","v":"其他"}]},
  269. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  270. ],
  271. "栏目大全":[{"key":"cid","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV-1综合","v":"EPGC1386744804340101"},{"n":"CCTV-2财经","v":"EPGC1386744804340102"},{"n":"CCTV-3综艺","v":"EPGC1386744804340103"},{"n":"CCTV-4中文国际","v":"EPGC1386744804340104"},{"n":"CCTV-5体育","v":"EPGC1386744804340107"},{"n":"CCTV-6电影","v":"EPGC1386744804340108"},{"n":"CCTV-7国防军事","v":"EPGC1386744804340109"},{"n":"CCTV-8电视剧","v":"EPGC1386744804340110"},{"n":"CCTV-9纪录","v":"EPGC1386744804340112"},{"n":"CCTV-10科教","v":"EPGC1386744804340113"},{"n":"CCTV-11戏曲","v":"EPGC1386744804340114"},{"n":"CCTV-12社会与法","v":"EPGC1386744804340115"},{"n":"CCTV-13新闻","v":"EPGC1386744804340116"},{"n":"CCTV-14少儿","v":"EPGC1386744804340117"},{"n":"CCTV-15音乐","v":"EPGC1386744804340118"},{"n":"CCTV-16奥林匹克","v":"EPGC1634630207058998"},{"n":"CCTV-17农业农村","v":"EPGC1563932742616872"},{"n":"CCTV-5+体育赛事","v":"EPGC1468294755566101"}]},{"key":"fc","name":"分类","value":[{"n":"全部","v":""},{"n":"新闻","v":"新闻"},{"n":"体育","v":"体育"},{"n":"综艺","v":"综艺"},{"n":"健康","v":"健康"},{"n":"生活","v":"生活"},{"n":"科教","v":"科教"},{"n":"经济","v":"经济"},{"n":"农业","v":"农业"},{"n":"法治","v":"法治"},{"n":"军事","v":"军事"},{"n":"少儿","v":"少儿"},{"n":"动画","v":"动画"},{"n":"纪实","v":"纪实"},{"n":"戏曲","v":"戏曲"},{"n":"音乐","v":"音乐"},{"n":"影视","v":"影视"}]},{"key":"fl","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"month","name":"月份","value":[{"n":"全部","v":""},{"n":"12","v":"12"},{"n":"11","v":"11"},{"n":"10","v":"10"},{"n":"09","v":"09"},{"n":"08","v":"08"},{"n":"07","v":"07"},{"n":"06","v":"06"},{"n":"05","v":"05"},{"n":"04","v":"04"},{"n":"03","v":"03"},{"n":"02","v":"02"},{"n":"01","v":"01"}]}]
  272. }
  273. }
  274. header = {
  275. "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",
  276. "Host": "tv.cctv.com",
  277. "Referer": "https://tv.cctv.com/"
  278. }
  279. def localProxy(self,param):
  280. return [200, "video/MP2T", action, ""]
  281. #-----------------------------------------------自定义函数-----------------------------------------------
  282. #访问网页
  283. def webReadFile(self,urlStr,header):
  284. html=''
  285. req=urllib.request.Request(url=urlStr)#,headers=header
  286. with urllib.request.urlopen(req) as response:
  287. html = response.read().decode('utf-8')
  288. return html
  289. #判断网络地址是否存在
  290. def TestWebPage(self,urlStr,header):
  291. html=''
  292. req=urllib.request.Request(url=urlStr,method='HEAD')#,headers=header
  293. with urllib.request.urlopen(req) as response:
  294. html = response.getcode ()
  295. return html
  296. #正则取文本
  297. def get_RegexGetText(self,Text,RegexText,Index):
  298. returnTxt=""
  299. Regex=re.search(RegexText, Text, re.M|re.S)
  300. if Regex is None:
  301. returnTxt=""
  302. else:
  303. returnTxt=Regex.group(Index)
  304. return returnTxt
  305. #取集数
  306. def get_EpisodesList(self,jsonList):
  307. videos=[]
  308. for vod in jsonList:
  309. url = vod['guid']
  310. title =vod['title']
  311. if len(url) == 0:
  312. continue
  313. videos.append(title+"$"+url)
  314. return videos
  315. #取集数
  316. def get_EpisodesList_re(self,htmlTxt,patternTxt):
  317. ListRe=re.finditer(patternTxt, htmlTxt, re.M|re.S)
  318. videos=[]
  319. for vod in ListRe:
  320. url = vod.group('url')
  321. title =vod.group('title')
  322. if len(url) == 0:
  323. continue
  324. videos.append(title+"$"+url)
  325. return videos
  326. #取剧集区
  327. def get_lineList(self,Txt,mark,after):
  328. circuit=[]
  329. origin=Txt.find(mark)
  330. while origin>8:
  331. end=Txt.find(after,origin)
  332. circuit.append(Txt[origin:end])
  333. origin=Txt.find(mark,end)
  334. return circuit
  335. #正则取文本,返回数组
  336. def get_RegexGetTextLine(self,Text,RegexText,Index):
  337. returnTxt=[]
  338. pattern = re.compile(RegexText, re.M|re.S)
  339. ListRe=pattern.findall(Text)
  340. if len(ListRe)<1:
  341. return returnTxt
  342. for value in ListRe:
  343. returnTxt.append(value)
  344. return returnTxt
  345. #删除html标签
  346. def removeHtml(self,txt):
  347. soup = re.compile(r'<[^>]+>',re.S)
  348. txt =soup.sub('', txt)
  349. return txt.replace("&nbsp;"," ")
  350. #取m3u8
  351. def get_m3u8(self,urlTxt):
  352. url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(urlTxt)
  353. html=self.webReadFile(urlStr=url,header=self.header)
  354. jo =json.loads(html)
  355. link = jo['hls_url'].strip()
  356. html = self.webReadFile(urlStr=link,header=self.header)
  357. content = html.strip()
  358. arr = content.split('\n')
  359. urlPrefix = self.get_RegexGetText(Text=link,RegexText='(http[s]?://[a-zA-z0-9.]+)/',Index=1)
  360. subUrl = arr[-1].split('/')
  361. subUrl[3] = '1200'
  362. subUrl[-1] = '1200.m3u8'
  363. hdUrl = urlPrefix + '/'.join(subUrl)
  364. url = urlPrefix + arr[-1]
  365. hdRsp = self.TestWebPage(urlStr=hdUrl,header=self.header)
  366. if hdRsp == 200:
  367. url = hdUrl
  368. else:
  369. url=''
  370. return url
  371. #搜索
  372. def get_list_search(self,html,tid):
  373. jRoot = json.loads(html)
  374. jsonList=jRoot['list']
  375. videos=[]
  376. for vod in jsonList:
  377. url = vod['urllink']
  378. title =self.removeHtml(txt=vod['title'])
  379. img=vod['imglink']
  380. id=vod['id']
  381. brief=vod['channel']
  382. year=vod['uploadtime']
  383. if len(url) == 0:
  384. continue
  385. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,'',brief)
  386. videos.append({
  387. "vod_id":guid,
  388. "vod_name":title,
  389. "vod_pic":img,
  390. "vod_remarks":year
  391. })
  392. return videos
  393. return videos
  394. def get_list1(self,html,tid):
  395. jRoot = json.loads(html)
  396. videos = []
  397. data=jRoot['response']
  398. if data is None:
  399. return []
  400. jsonList=data['docs']
  401. for vod in jsonList:
  402. id = vod['lastVIDE']['videoSharedCode']
  403. title =vod['column_name']
  404. url=vod['column_website']
  405. img=vod['column_logo']
  406. year=vod['column_playdate']
  407. brief=vod['column_brief']
  408. actors=''
  409. if len(url) == 0:
  410. continue
  411. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,actors,brief)
  412. #print(vod_id)
  413. videos.append({
  414. "vod_id":guid,
  415. "vod_name":title,
  416. "vod_pic":img,
  417. "vod_remarks":''
  418. })
  419. #print(videos)
  420. return videos
  421. #分类取结果
  422. def get_list(self,html,tid):
  423. jRoot = json.loads(html)
  424. videos = []
  425. data=jRoot['data']
  426. if data is None:
  427. return []
  428. jsonList=data['list']
  429. for vod in jsonList:
  430. url = vod['url']
  431. title =vod['title']
  432. img=vod['image']
  433. id=vod['id']
  434. try:
  435. brief=vod['brief']
  436. except:
  437. brief=''
  438. try:
  439. year=vod['year']
  440. except:
  441. year=''
  442. try:
  443. actors=vod['actors']
  444. except:
  445. actors=''
  446. if len(url) == 0:
  447. continue
  448. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,actors,brief)
  449. #print(vod_id)
  450. videos.append({
  451. "vod_id":guid,
  452. "vod_name":title,
  453. "vod_pic":img,
  454. "vod_remarks":''
  455. })
  456. return videos