U
    *)li#I                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZ ddl	mZ ddlmZ ejd G d	d
 d
eZedkrdS )ud   
@header({
  searchable: 1,
  filterable: 1,
  quickSearch: 1,
  title: '瓜子',
  lang: 'hipy'
})
    N)AES)padunpad)RSA)
PKCS1_v1_5)Spiderz..c                       s   e Zd Zdd Zd& fdd	Zdd Zdd	 Zd
d Zdd Zd'ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd  Zd(d"d#Zd$d% Z  ZS ))r   c                 C   s   | j S N)nameself r   &   /storage/emulated/0/lz/py/sy/瓜子.pygetName   s    zSpider.getName c                    sD   t    d| _d| _d| _dddd| jdd	d
| _i | _d| _d S )Nu   瓜子zhttps://api.w32z7vtd.coma  1be86e8e18a9fa18b2b8d5432699dad0.ac008ed650fd087bfbecf2fda9d82e9835253ef24843e6b18fcd128b10763497bcf9d53e959f5377cde038c20ccf9d17f604c9b8bb6e61041def86729b2fc7408bd241e23c213ac57f0226ee656e2bb0a583ae0e4f3bf6c6ab6c490c9a6f0d8cdfd366aacf5d83193671a8f77cd1af1ff2e9145de92ec43ec87cf4bdc563f6e919fe32861b0e93b118ec37d8035fbb3c.59dd05c5d9a8ae726528783128218f15fe6f2c0c8145eddab112b374fcfe3d79zno-cacheZ2406025z4com.uf076bf0c246.qe439f0d5e.m8aaf56b725a.ifeb647346fz1.9.2z!application/x-www-form-urlencodedzokhttp/3.12.0)zCache-ControlVersionZPackageNameZVerZRefererzContent-Typez
User-Agenti,  )superinitr	   hosttokenheadercachecache_timeout)r   extend	__class__r   r   r   !   s    

zSpider.initc                 C   s  i }ddddddddddd	dd
ddg}||d< i }|D ]b}|d }ddddddddddddddddddddddddddddddddddddddgddd dddd!d!dd"d"dd#d#dd$d$dd%d%dd&d&dd'd'dd(d(dd)d)dd*d*dd+d+dd,d,dd-d-dd.d.dd/d/dd0d0dd1d1dd2d2dd3d3dd4d4dd5d5dd6d7dgdd8d9d:d;dd<d=dd>d?dgdg||< q@||d@< |S )AN   电影1)Z	type_nametype_idu	   电视剧2u   动漫4u   综艺3u   短剧64classr   areau   地区u   全部0)nvu   大陆u   香港u   台湾u   美国u   韩国u   日本u   英国u   法国u   泰国u   印度u   其他)keyr	   valueyearu   年份Z2025Z2024Z2023Z2022Z2021Z2020Z2019Z2018Z2017Z2016Z2015Z2014Z2013Z2012Z2011Z2010Z2009Z2008Z2007Z2006Z2005u   更早Z2004sortu   排序u   最新d_idu   最热Zd_hitsu   推荐Zd_scorefiltersr   )r   filterresultclassesr,   Zcatetidr   r   r   homeContent3   st    

/zSpider.homeContentc                 C   s   dg iS )Nlistr   r
   r   r   r   homeVideoContentu   s    zSpider.homeVideoContentc              
   C   s"  g }z| dd| ddd| ddt||d}d| d	| d	tt| }| ||d
}|rd|kr|d D ]b}	|	 dd}
|
dkrdn
d|
 d}|	 dd d|
 |	 dd|	 dd|d}|| qtW n2 tk
r } ztd|  W 5 d }~X Y nX |t|ddddS )Nr#   r$   r)   Z30r*   r+   )r#   r)   ZpageSizer*   pager0   Z	category__z/App/IndexList/indexListr2   vod_continur   r   	   更新至   集vod_idr   /vod_namevod_picr9   r;   r<   Zvod_remarksu   获取分类内容失败: '     ?B r2   r4   Z	pagecountlimittotal)getstrhashget_cached_dataappend	Exceptionprintint)r   r0   pgr-   r   videosbody	cache_keydataitemr6   remarksvideoer   r   r   categoryContenty   s:    


	

 zSpider.categoryContentc                 C   s  z|d  dd }ttt }d||| jd}| |d}d|d}| |d}|rdd	|krnd
g iW S |d	 }||dd|dd|dd|dd|dd|dd|dd dd	}	g }
|rd
|krt|d
 D ]\}}d|krg }g }|d 	 D ]6\}}d|kr|d r|
| |
|d  q|rt|d }t|d
 dkrt|dd}|d  dd| }|

| d|  qd|
|	d< d
|	giW S  tk
r } ztd|  d
g i W Y S d }~X Y nX d S )Nr   r:   Z1649412)token_idr9   Zmobile_timer   z/App/IndexPlay/playInfor   )Zvurl_cloud_idZvod_d_idz/App/Resource/Vurl/showZvodInfor2   r;   r   r<   vod_yearvod_area	vod_actorvod_directorZvod_use_contentu   嗷呜要吃瓜)	r9   r;   r<   rW   rX   rY   rZ   Zvod_contentZvod_play_fromZplayparam   ||@$#Zvod_play_urlu   获取详情失败: )splitrE   rK   timer   get_datarD   strip	enumerateitemsrH   lenjoinrI   rJ   )r   Zidsr9   tZbody1ZqdataZbody2ZjdataZvodZvideo_detailZ	play_listindexrQ   r%   pr'   r(   Z	play_nameZplay_urlrT   r   r   r   detailContent   s^    







zSpider.detailContentr\   c              
   C   s  g }z|dt |d}t }| j|ddd}t }td|| dd |rd	|kr|d	 D ]b}	|	d
d}
|
dkr|dn
d|
 d}|	dd d|
 |	dd|	dd|d}|| q`W n0 tk
r } ztd|  W 5 d }~X Y nX |t|ddddS )Nr   )keywordsZ	order_valr4   z/App/Index/findMoreVodF	use_cacheu   搜索请求耗时: .2f   秒r2   r6   r   r   r7   r8   r9   r   r:   r;   r<   r=   u   搜索失败: r>   r?   r@   rA   )rE   rc   rd   rJ   rD   rH   rI   rK   )r   r'   quickrL   rM   rN   
start_timerP   end_timerQ   r6   rR   rS   rT   r   r   r   searchContent   s8    

 zSpider.searchContentc              
   C   s`  z| d}t|dk r(ddddW S |d }t|dkrJ|d  dng }i }| dD ]$}d	|kr\| d	d\}	}
|
||	< q\|r|jd
d dd |d |d< |}t }| j|ddd}t }td|| dd |rd|krdd|d t| jdW S ddddW S  t	k
rZ } z"td|  dddd W Y S d }~X Y nX d S )Nr^      r   r   )parseplayUrlurlr\   r_   &=c                 S   s   |   rt| S dS )Nr   )isdigitrK   )xr   r   r   <lambda>      z&Spider.playerContent.<locals>.<lambda>T)r'   reverse
resolutionz /App/Resource/VurlDetail/showOneFro   u   播放链接获取耗时: rq   rr   rz   )rx   ry   rz   r   u   播放解析失败: )
rb   rh   r*   rc   rd   rJ   jsondumpsr   rI   )r   flagidvipFlagspartsZ	param_strZresolutionsparamspairr'   r(   rN   rt   rP   ru   rT   r   r   r   playerContent	  s:    


zSpider.playerContentc                    s&   ddddddg}t  fdd|D S )	Nz.m3u8z.mp4z.aviz.mkvz.flvz.tsc                 3   s   | ]}   |V  qd S r   )lowerendswith).0fmtrz   r   r   	<genexpr>8  s     z'Spider.isVideoFormat.<locals>.<genexpr>)any)r   rz   Zvideo_formatsr   r   r   isVideoFormat6  s    zSpider.isVideoFormatc                 C   s   d S r   r   r
   r   r   r   manualVideoCheck:  s    zSpider.manualVideoCheckc                 C   s   d S r   r   )r   r   r   r   r   
localProxy=  s    zSpider.localProxyc           	   
   C   s   zJ| d}| d}t|tj|}|t| dtj}|  W S  t	k
r } zt
d|  W Y dS d}~X Y nX dS )u	   AES加密utf-8u   AES加密失败: r   N)encoder   newMODE_CBCZencryptr   
block_sizehexupperrI   rJ   )	r   textr'   iv	key_bytesiv_bytescipherZ	encryptedrT   r   r   r   aes_encrypt@  s    

zSpider.aes_encryptc           
   
   C   s   zL| d}| d}t|tj|}t|}t||tj}|	dW S  t
k
r }	 ztd|	  W Y dS d}	~	X Y nX dS )u	   AES解密r   u   AES解密失败: r   N)r   r   r   r   bytesfromhexr   decryptr   decoderI   rJ   )
r   r   r'   r   r   r   r   encrypted_bytes	decryptedrT   r   r   r   aes_decryptL  s    


zSpider.aes_decryptc              
   C   sz   z>t |}t|}t|}||d}|r:|dndW S  tk
rt } zt	d|  W Y dS d}~X Y nX dS )u	   RSA解密Nr   r   u   RSA解密失败: )
base64	b64decoder   Z
import_keyr   r   r   r   rI   rJ   )r   Zencrypted_dataprivate_keyr   Zrsa_keyr   r   rT   r   r   r   rsa_decryptY  s    


zSpider.rsa_decryptc                 C   sT   t   }|| jkr2| j| \}}|| | jk r2|S | ||}|rP||f| j|< |S )u   带缓存的数据获取)rc   r   r   rd   )r   rO   rP   pathZcurrent_timecached_data	timestampr.   r   r   r   rG   j  s    
zSpider.get_cached_dataTc                 C   sH  z|r| dt t| nd}|rV|| jkrV| j| \}}t | | jk rV|W S t }| t|dd}|s|W dS ttt }	d}
d| j	 d| d|	 d	|
 d
	}t
|  }| j	dd|	d|
||ddd
}| j | }| j|| j|dd}|jdkr(td|j d|  W dS | }d|krNtd|  W dS |d }d}| |d |}|s~td W dS t|}| |d |d |d }|std W dS t|}t }td|| dd|  |r |r |t f| j|< |W S  tk
rB } ztd | d|  W Y dS d}~X Y nX dS )!u   获取数据的主要方法r5   NZmvXBSW7ekreItNsTZ2U3IrJL8szAKp0FjzQmxi5ciWXbQzkr7o+SUNiUuQxQEf8/AVyUWY4T/BGhcXBIUz4nOyHBGf9A4KbM0iKF3yp9M7WAY0rrs5PzdTAOB45plcS2zZ0wUibcXuGJ29VVGRWKGwE9zu2vLwhfgjTaaDpXo4rby+7GxXTktzJmxvneOUdYeHi+PZsThlvPI=ztoken_id=,token=z,phone_type=1,request_key=z,app_id=1,time=z,keys=z$*&zvdvdvddbfikkkumtmdwqppp?|4Y!s!2brr   r   zxiaomi-22021211rc)
r   rV   Z
phone_typerc   Zphone_modelkeysrequest_key	signatureZapp_idZ
ad_version
   )headersrP   timeout   u   API请求失败: u
   , 路径: rP   u%   API返回数据格式错误, 路径: a  -----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGAe6hKrWLi1zQmjTT1
ozbE4QdFeJGNxubxld6GrFGximxfMsMB6BpJhpcTouAqywAFppiKetUBBbXwYsYU
1wNr648XVmPmCMCy4rY8vdliFnbMUj086DU6Z+/oXBdWU3/b1G0DN3E9wULRSwcK
ZT3wj/cCI1vsCm3gj2R5SqkA9Y0CAwEAAQKBgAJH+4CxV0/zBVcLiBCHvSANm0l7
HetybTh/j2p0Y1sTXro4ALwAaCTUeqdBjWiLSo9lNwDHFyq8zX90+gNxa7c5EqcW
V9FmlVXr8VhfBzcZo1nXeNdXFT7tQ2yah/odtdcx+vRMSGJd1t/5k5bDd9wAvYdI
DblMAg+wiKKZ5KcdAkEA1cCakEN4NexkF5tHPRrR6XOY/XHfkqXxEhMqmNbB9U34
saTJnLWIHC8IXys6Qmzz30TtzCjuOqKRRy+FMM4TdwJBAJQZFPjsGC+RqcG5UvVM
iMPhnwe/bXEehShK86yJK/g/UiKrO87h3aEu5gcJqBygTq3BBBoH2md3pr/W+hUM
WBsCQQChfhTIrdDinKi6lRxrdBnn0Ohjg2cwuqK5zzU9p/N+S9x7Ck8wUI53DKm8
jUJE8WAG7WLj/oCOWEh+ic6NIwTdAkEAj0X8nhx6AXsgCYRql1klbqtVmL8+95KZ
K7PnLWG/IfjQUy3pPGoSaZ7fdquG8bq8oyf5+dzjE/oTXcByS+6XRQJAP/5ciy1b
L3NhUhsaOVy55MHXnPjdcTX0FaLi+ybXZIfIQ2P4rb19mVq1feMbCXhz+L1rG8oa
t5lYKfpe8k83ZA==
-----END PRIVATE KEY-----r   u   RSA解密失败Zresponse_keyr'   r   u   AES解密失败u   数据获取耗时: rq   u   秒, 路径: u   获取数据失败: )rF   rE   r   rc   r   r   r   r   rK   r   hashlibmd5r   	hexdigestr   postr   status_coderJ   r   loadsr   rI   )r   rP   r   rp   rO   r   r   rt   r   rj   r   Zsign_strr   rN   rz   responseZresponse_dataZdata_responser   Zbodyki_jsonZbodykiZdecrypted_datar.   ru   rT   r   r   r   rd   x  sl     


zSpider.get_datac                 C   s   t |  S )u	   计算MD5)r   r   r   r   )r   r   r   r   r   get_md5  s    zSpider.get_md5)r   )r\   )T)__name__
__module____qualname__r   r   r1   r3   rU   rm   rv   r   r   r   r   r   r   r   rG   rd   r   __classcell__r   r   r   r   r      s"   B&C
'-
cr   __main__)__doc__resysr   rc   r   r   urllib.parseurllibZCrypto.Cipherr   ZCrypto.Util.Paddingr   r   ZCrypto.PublicKeyr   r   Zbase.spiderr   r   rH   r   r   r   r   r   <module>   s&      F