o
    *)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rS	 dS d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Ver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 ]}|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)	type_nametype_idu	   电视剧2u   动漫4u   综艺3u   短剧Z64classr   areau   地区u   全部0)nvu   大陆u   香港u   台湾u   美国u   韩国u   日本u   英国u   法国u   泰国u   印度u   其他)keyr	   valueyearu   年份202520242023202220212020201920182017201620152014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:   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 }zk| dd| ddd| ddt||d}d| d	| d	tt| }| ||d
}|rld|v rl|d D ]1}	|	 dd}
|
dkrHdnd|
 d}|	 dd d|
 |	 dd|	 dd|d}|| q:W n ty } ztd|  W Y d }~nd }~ww |t|ddddS )Nr$   r%   r*   Z30r8   r9   )r$   r*   ZpageSizer8   pager?   Z	category__z/App/IndexList/indexListrA   vod_continur   r   	   更新至   集vod_idr   /vod_namevod_picrH   rJ   rK   vod_remarksu   获取分类内容失败: '     ?B rA   rC   	pagecountlimittotal)getstrhashget_cached_dataappend	Exceptionprintint)r   r?   pgr;   r   videosbody	cache_keydataitemrE   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}|r1d	|vr6d
g iW S |d	 }||dd|dd|dd|dd|dd|dd|dd dd	}	g }
|rd
|v rt|d
 D ]W\}}d|v rg }g }|d 	 D ]\}}d|v r|d r|
| |
|d  q|rt|d }t|d
 dkr|dd}|d  dd| }|

| d|  qrd|
|	d< d
|	giW S  ty } ztd|  d
g iW  Y d }~S d }~ww )Nr   rI   Z1649412)token_idrH   Zmobile_timer   z/App/IndexPlay/playInfor    )Zvurl_cloud_idZvod_d_idz/App/Resource/Vurl/showZvodInforA   rJ   r   rK   vod_yearvod_area	vod_actorvod_directorZvod_use_contentu   嗷呜要吃瓜)	rH   rJ   rK   rh   ri   rj   rk   vod_contentvod_play_fromplayparam   ||@$#vod_play_urlu   获取详情失败: )splitrV   r\   timer   get_datarU   strip	enumerateitemsrY   lenjoinrZ   r[   )r   idsrH   tZbody1ZqdataZbody2ZjdatavodZvideo_detailZ	play_listindexrb   r&   pr(   r)   Z	play_nameplay_urlre   r   r   r   detailContent   sf   







zSpider.detailContentrp   c              
   C   s  g }za|dt |d}t }| j|ddd}t }td|| dd |rbd	|v rb|d	 D ]1}	|	d
d}
|
dkr>dnd|
 d}|	dd d|
 |	dd|	dd|d}|| q0W n ty| } ztd|  W Y d }~nd }~ww |t|ddddS )Nr   )keywordsZ	order_valrC   z/App/Index/findMoreVodF	use_cacheu   搜索请求耗时: .2f   秒rA   rE   r   r   rF   rG   rH   r   rI   rJ   rK   rL   u   搜索失败: rN   rO   rP   rQ   )rV   rx   ry   r[   rU   rY   rZ   r\   )r   r(   quickr]   r^   r_   
start_timera   end_timerb   rE   rc   rd   re   r   r   r   searchContent   s>   

zSpider.searchContentc              
   C   sP  z| d}t|dk rddddW S |d }t|dkr$|d  dng }i }| dD ]}d	|v r?| d	d\}	}
|
||	< q-|r|jd
d dd |d |d< |}t }| j|ddd}t }td|| dd |rd|v rdd|d t| jdW S ddddW S  t	y } ztd|  ddddW  Y d }~S d }~ww )Nrr      r   r   )parseplayUrlurlrp   rs   &=c                 S   s   |   rt| S dS )Nr   )isdigitr\   )xr   r   r   <lambda>  s    z&Spider.playerContent.<locals>.<lambda>T)r(   reverse
resolutionz /App/Resource/VurlDetail/showOneFr   u   播放链接获取耗时: r   r   r   )r   r   r   r   u   播放解析失败: )
rw   r}   r8   rx   ry   r[   jsondumpsr   rZ   )r   flagidvipFlagsparts	param_strZresolutionsparamspairr(   r)   r_   r   ra   r   re   r   r   r   playerContent	  s@   

zSpider.playerContentc                    s   g d}t  fdd|D S )N)z.m3u8z.mp4z.aviz.mkvz.flvz.tsc                 3   s    | ]
}   |V  qd S r   )lowerendswith).0fmtr   r   r   	<genexpr>8  s    z'Spider.isVideoFormat.<locals>.<genexpr>)any)r   r   Zvideo_formatsr   r   r   isVideoFormat6  s   zSpider.isVideoFormatc                 C      d S r   r   r
   r   r   r   manualVideoCheck:     zSpider.manualVideoCheckc                 C   r   r   r   )r   r   r   r   r   
localProxy=  r   zSpider.localProxyc           	   
   C   s   z%| d}| d}t|tj|}|t| dtj}|  W S  t	y? } zt
d|  W Y d}~dS d}~ww )u	   AES加密utf-8u   AES加密失败: Nr   )encoder   newMODE_CBCencryptr   
block_sizehexupperrZ   r[   )	r   textr(   iv	key_bytesiv_bytescipher	encryptedre   r   r   r   aes_encrypt@  s   

zSpider.aes_encryptc           
   
   C   s   z&| d}| d}t|tj|}t|}t||tj}|	dW S  t
y@ }	 ztd|	  W Y d}	~	dS d}	~	ww )u	   AES解密r   u   AES解密失败: Nr   )r   r   r   r   bytesfromhexr   decryptr   decoderZ   r[   )
r   r   r(   r   r   r   r   encrypted_bytes	decryptedre   r   r   r   aes_decryptL  s   


zSpider.aes_decryptc              
   C   sv   z t |}t|}t|}||d}|r|dW S dW S  ty: } zt	d|  W Y d}~dS d}~ww )u	   RSA解密Nr   r   u   RSA解密失败: )
base64	b64decoder   
import_keyr   r   r   r   rZ   r[   )r   encrypted_dataprivate_keyr   Zrsa_keyr   r   re   r   r   r   rsa_decryptY  s   


zSpider.rsa_decryptc                 C   sT   t   }|| jv r| j| \}}|| | jk r|S | ||}|r(||f| j|< |S )u   带缓存的数据获取)rx   r   r   ry   )r   r`   ra   pathZcurrent_timecached_data	timestampr<   r   r   r   rX   j  s   
zSpider.get_cached_dataTc                 C   s4  z|r| dt t| nd}|r*|| jv r*| j| \}}t | | jk r*|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rtd|j d|  W dS | }d|vrtd|  W dS |d }d}| |d |}|st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y } ztd | d|  W Y d}~dS d}~ww )!u   获取数据的主要方法rD   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   rg   Z
phone_typerx   Zphone_modelkeysrequest_key	signatureZapp_idZ
ad_version
   )headersra   timeout   u   API请求失败: u
   , 路径: ra   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   数据获取耗时: r   u   秒, 路径: u   获取数据失败: )rW   rV   r   rx   r   r   r   r   r\   r   hashlibmd5r   	hexdigestr   postr   status_coder[   r   loadsr   rZ   )r   ra   r   r   r`   r   r   r   r   r   r   Zsign_strr   r_   r   responseresponse_dataZdata_responser   Zbodyki_jsonZbodykiZdecrypted_datar<   r   re   r   r   r   ry   x  sp    


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   )rp   )T)__name__
__module____qualname__r   r   r@   rB   rf   r   r   r   r   r   r   r   r   r   rX   ry   r   __classcell__r   r   r   r   r      s$    B&
C'-
cr   __main__)__doc__resysr   rx   r   r   urllib.parseurllibCrypto.Cipherr   Crypto.Util.Paddingr   r   Crypto.PublicKeyr   r   base.spiderr   r   rY   r   r   r   r   r   <module>   s*       F