U
    	h>                     @   s   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Zd dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZ ejd d d	lmZ G d
d deZdS )    N)AES)unpad)PyQuery)	b64decode	b64encode)pprint)urlparsequoteunquotez..)Spiderc                   @   s   e Zd Zd9d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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, Zd-d. Zd/d0 Zd1d2 Zd;d4d5Zd6d7 Zd8S )<r   {}c                 C   s`   d| _ i | _dddd| _| |  | _| j| j| j dd tj| j	d}|
  d S )	Nzhttps://cg51.comzuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36z@"Not/A)Brand";v="8", "Chromium";v="134", "Google Chrome";v="134"zzh-CN,zh;q=0.9)z
User-Agentz	sec-ch-uazAccept-Language/)OriginReferer)target)dominproxiesheaders	host_lategethostshostupdate	threadingThreadgetcnhstart)selfextendthread r   (   /storage/emulated/0/lz/py/sy/51吸瓜.pyinit   s    zSpider.initc                 C   s   d S Nr   r   r   r   r    getName&   s    zSpider.getNamec                 C   s   d S r"   r   )r   urlr   r   r    isVideoFormat)   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    destroy/   s    zSpider.destroyc                 C   s   t tj| j| j| jdj}i }g }t|dd	 dd D ]l}|dr|d	 D ]*}|
|d |dd	 d
 qZqB|
|d |dd	 d
 qB||d< | |d|d< |S )Nr   r   z.navbar-nav.mr-autoli   ulzul liahref)	type_nametype_idclassz#index article alist)pqrequestsgetr   r   r   contentr3   childrenitemsappendtextattrstripgetlist)r   filterdataresultclasseskjr   r   r    homeContent2   s"    "


zSpider.homeContentc                 C   s   d S r"   r   r#   r   r   r    homeVideoContentF   s    zSpider.homeVideoContentc           	      C   s   d|kr | dd}| |}n8ttj| j | | | j| jdj}| 	|d|}i }||d< ||d< d|krxdnd|d	< d
|d< d|d< |S )N@folder r)   #archive article ar3   pager+   i 	pagecountZ   limiti?B total)
replacegetfodr4   r5   r6   r   r   r   r7   r>   )	r   tidpgr?   r   idvideosr@   rA   r   r   r    categoryContentI   s    (zSpider.categoryContentc              
   C   sx  |d  dr|d n| j |d  }ttj|| j| jdj}ddi}|dd}zhg }|dr|d	 D ]<}|
 }|d	}	|d
t|	|d d | d  qrd||d< W n   |d
 |d< Y nX ztg }
|drBt|d	 ddD ]>\}}t|d}|
d| d| d|d d   qd|
|d< W n   d| |d< Y nX d|giS )Nr   httpr)   vod_play_fromu   51吸瓜zscript[data-api]zdata-apiz.tags .keywords ar/   z[a=cr:)rS   namez/]z[/a] vod_contentz.post-titlez.dplayerr+   )r   zdata-configu   视频$_dm_videor%   #vod_play_urlu   可能没有视频$r3   )
startswithr   r4   r5   r6   r   r   r7   r<   r9   r;   r:   jsondumpsjoin	enumerateloads)r   idsr%   r@   voddidZclistrC   titler/   plistcconfigr   r   r    detailContentX   s0    (
(
(zSpider.detailContent1c                 C   s@   t tj| j d| d| | j| jdj}| |d|dS )Nz/search/r   r)   rI   )r3   rJ   )r4   r5   r6   r   r   r   r7   r>   )r   keyquickrR   r@   r   r   r    searchContentr   s    ,zSpider.searchContentc                 C   sL   | d\}}td|rdnd}|s>|   dt| d}||| jdS )Nr\   z$\.(m3u8|mp4|flv|ts|mkv|mov|avi|webm)r   r+   z&pdid=z
&type=m3u8)parser%   header)splitresearchgetProxyUrlr	   r   )r   flagrS   vipFlagsrh   pidpr   r   r    playerContentv   s
    zSpider.playerContentc              
   C   s<  z| dd}d|krt|d d\}}tj || j| jddj}| d}d	}|D ],}|d
r\|t	|dd 
dd7 }q\tj| j|t|fd}	|	  td| dd|gW S d|kr| j t|d  }tj || j| jdd }
g }|
D ]}| d}| d}|r.||  |r|D ]N}| d}|r8| }d|krz||ddd   n
|| q8q| |t|d W S | |d }td|}|r|d}tj || j| jdd}
d|
j d| |
jgW S  tk
r6 } zt| dddg W Y S d }~X Y nX d S )NtyperH   m3u8Zpdidr\   
   )r   r   timeout
g        z#EXTINF::,r   argsu   [INFO] 获取视频时长成功   z
text/plainZxdmpathr;   r8   @rY   r+   timesr%   zloadBannerDirect\('([^']*)'zContent-Type  	text/html)r6   r
   rt   r5   r   r   r;   r=   r`   floatrO   r   r   some_background_taskintr   printr   ra   r:   xmld64ru   rv   groupaesimgr7   	Exception)r   paramZxtyper   r%   r@   linesr   ir   resdmsrC   r;   r8   rD   Zctextmatcher   r   r    
localProxy}   sR    
 



 


zSpider.localProxyc              
   C   sp   z@t d |   dt| d| d}| dt|  W n* tk
rj } zt| W 5 d }~X Y nX d S )Nr+   z&path=z&times=z	&type=xdmz:http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=)timesleeprw   r	   fetchr   r   )r   r   r   purlr   r   r   r    r      s    
zSpider.some_background_taskc              
   C   s   zdt | d}d}|d| d7 }tt |D ]t}|t | | }|tdd }ttdt||d	}|  }t	d
d|| }	d| d| d|	 d}
||
7 }q2|d7 }dd|gW S  t
k
r } zt| dddg W Y S d }~X Y nX d S )Nu   共有u   条弹幕来袭！！！z<?xml version="1.0" encoding="UTF-8"?>
<i>
	<chatserver>chat.xtdm.com</chatserver>
	<chatid>88888888</chatid>
	<mission>0</mission>
	<maxlimit>99999</maxlimit>
	<state>0</state>
	<real_name>0</real_name>
	<source>k-v</source>
z	<d p="0,5,25,16711680,0">z</d>
r,      r   r+   z[<>&\u0000\b]rH   z	<d p="z,1,25,z,0">z</i>r   ztext/xmlr   r   )lenrangerandomuniformroundmaxmin	get_colorru   subr   r   )r   r   r   ZtsrtZdanmustrr   Z	base_timeZdm0Zdm2Zdm4Ztempdatar   r   r   r    r      s"    
z
Spider.xmlc                 C   s   t   dk rt   }t dd}t dd}t|||\}}}t|d }t|d }t|d }|d> |d>  | }t|S dS d S )	Ng?gffffff?      ?g?         Z16777215)r   r   colorsysZ
hsv_to_rgbr   str)r   hsvrgbZdecimal_colorr   r   r    r      s    zSpider.get_colorc              
   C   s^   z| d}t|}|dW S  tk
rX } ztdt|  W Y dS d }~X Y nX d S )Nutf-8u   Base64编码错误: rH   )encoder   decoder   r   r   )r   r;   Z
text_bytesencoded_bytesr   r   r   r    e64   s    
z
Spider.e64c              
   C   s^   z| d}t|}|dW S  tk
rX } ztdt|  W Y dS d }~X Y nX d S )Nr   u   Base64解码错误: rH   )r   r   r   r   r   r   )r   Zencoded_textr   decoded_bytesr   r   r   r    r      s    
z
Spider.d64c           	   
   C   s"  | j }| d}|rfzDttj|| j| jdjdd}|rVt	|}|j
d |j }W n   Y nX zxttj|| j| jdj}d}t||dd tj}|std	tt|d
 dd }| |W S  tk
r } z| dt|  W Y dS d }~X Y nX d S )N	host_51cnr)   r.   r/   ://Base64\.decode\('([^']+)'\)scriptr      未找到htmlr+   u   获取: rH   )r   getCacher4   r5   r6   r   r   r7   r<   r   schemenetlocru   rv   eqr;   DOTALLr   r   r   r   hstrlogr   )	r   r%   curlr@   
parsed_urlhtmlhtml_pattern
html_matchr   r   r   r    r      s*    
$ $zSpider.gethostsc                 C   sb   t tj| j d| j| jdj}|dddd}t	|}|j
d |j }| d| d S )	Nz/homeway.htmlr)   z2.post-content[itemprop="articleBody"] blockquote pr   r.   r/   r   r   )r4   r5   r6   r   r   r   r7   r   r<   r   r   r   setCache)r   r@   r%   r   r   r   r   r    r      s
    "zSpider.getcnhc                 C   s,   d}d}t |||}d| d}| |S )Nz%(backupLine\s*=\s*\[\])\s+(words\s*=)z\1, \2a  
        var Vx = {
            range: function(start, end) {
                const result = [];
                for (let i = start; i < end; i++) {
                    result.push(i);
                }
                return result;
            },

            map: function(array, callback) {
                const result = [];
                for (let i = 0; i < array.length; i++) {
                    result.push(callback(array[i], i, array));
                }
                return result;
            }
        };

        Array.prototype.random = function() {
            return this[Math.floor(Math.random() * this.length)];
        };

        var location = {
            protocol: "https:"
        };

        function executeAndGetResults() {
            var allLines = lineAry.concat(backupLine);
            var resultStr = JSON.stringify(allLines);
            return resultStr;
        };
        z)
        executeAndGetResults();
        )ru   r   p_qjs)r   r   patternreplacementr@   r   r   r    r     s     #zSpider.hstrc              
   C   sr   z2ddl m} | }||}|  t|W S  tk
rl } z| d|  g  W Y S d }~X Y nX d S )Nr   )QuickJSContextu   执行失败: )	Zcom.whl.quickjs.wrapperr   createZevaluater(   ra   re   r   r   )r   Zjs_coder   ctxZresult_jsonr   r   r   r    r   *  s    
zSpider.p_qjsc                 C   s   t tj| j| j| jdj}d}t||d	d
 tj}|sJtdt|d }d}t||tj}|s|td|dd	}d
}t||tj}|std|d}	g }
tdD ](}t|}d| d|	 }|
| q|
S )Nr)   r   r   r   r   r+   zwords\s*=\s*'([^']+)'u   未找到wordsr   z2lineAry\s*=.*?words\.random\(\)\s*\+\s*'\.([^']+)'u   未找到主域名r   zhttps://.)r4   r5   r6   r   r   r   r7   ru   rv   r   r;   r   r   r   r   r   rt   r   r   choicer:   )r   r   r   r   Zwords_patternZwords_matchwordsZmain_patterndomain_matchZdomain_suffixdomains_Zrandom_worddomainr   r   r    get_domains6  s,    

zSpider.get_domainsc                 C   s   | j  | }ttj|| j| jdj}|d}dddddg}|D ]}|| qB|d}g }t|d		 D ]j\}}	|d
 }
|
||
dd||
 |   d| ||
d dd |	 d qn|S )Nr)   z%.post-content[itemprop="articleBody"]z	.txt-appsz.line
blockquotez.tagsz.content-tabsr{   h2   r.   r/   &url=r+   imgzdata-xkrkllgl)vod_idvod_namevod_picvod_remarks)r   r4   r5   r6   r   r   r7   removerd   r9   r:   r   r<   r;   rw   r   )r   rS   r%   r@   Zvdatar   r   r{   rT   xrk   r   r   r    rP   N  s"     *
zSpider.getfodc                    s   t |tr dd |dD }n|}t|dkr@|r<|d S dS i  g } fdd}|D ]&}tj||fd	}|| |  qZ|D ]}|  qt	 
 d
d dd S )Nc                 S   s   g | ]}|  qS r   )r=   ).0ur   r   r    
<listcomp>b  s     z$Spider.host_late.<locals>.<listcomp>r   r+   r   rH   c              
      sp   z<t   }tj| jjddd}t   | d }| | < W n. tk
rj } ztd | < W 5 d }~X Y nX d S )Nr   F)r   r   r   allow_redirectsi  inf)r   r5   headr   r   r   r   )r%   Z
start_timeresponsedelayr   resultsr   r   r    	test_hostl  s    z#Spider.host_late.<locals>.test_hostr   c                 S   s   | d S )Nr+   r   )r   r   r   r    <lambda>}      z"Spider.host_late.<locals>.<lambda>)ro   )
isinstancer   rt   r   r   r   r:   r   rc   r   r9   )r   Zurl_listZurlsthreadsr   r%   tr   r   r    r   `  s    
	


zSpider.host_laterH   c           	      C   s   g }d|k}|  D ]}|d}|d }|d }|r|r|r|| |rVdnd |dd|   d	| |d
  d||rdnddddd q|S )Nz/mrdgr/   r   zspan[itemprop="datePublished"]rG   rH   r   rY   r   r   z	&type=imgfolderrectgHzG?)r}   ratio)r   r   r   r   vod_tagstyle)r9   r<   r;   r:   rO   rw   r   )	r   r@   rQ   rT   lrC   r.   r   rk   r   r   r    r>     s     

 

zSpider.getlistc                 C   s.   d}d}t |t j|}t||t j}|S )Ns   f5d965df75336270s   97b60394abc2fbe1)r   newMODE_CBCr   decrypt
block_size)r   wordro   ivcipher	decryptedr   r   r    r     s
    zSpider.aesimgN)r   )rn   )rH   )__name__
__module____qualname__r!   r$   r&   r'   r(   rE   rF   rU   rm   rq   r|   r   r   r   r   r   r   r   r   r   r   r   rP   r   r>   r   r   r   r   r    r      s4   

+		)
r   )r   ra   r   ru   sysr   r   r5   Crypto.Cipherr   Crypto.Util.Paddingr   pyqueryr   r4   base64r   r   r   urllib.parser   r	   r
   r   r:   base.spiderr   r   r   r   r    <module>   s    