o
    	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      d S Nr   r   r   r   r    getName&      zSpider.getNamec                 C   r"   r#   r   )r   urlr   r   r    isVideoFormat)   r&   zSpider.isVideoFormatc                 C   r"   r#   r   r$   r   r   r    manualVideoCheck,   r&   zSpider.manualVideoCheckc                 C   r"   r#   r   r$   r   r   r    destroy/   r&   zSpider.destroyc                 C   s   t tj| j| j| jdj}i }g }t|dd	 dd D ]6}|drD|d	 D ]}|
|d |dd	 d
 q-q!|
|d |dd	 d
 q!||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   contentr5   childrenitemsappendtextattrstripgetlist)r   filterdataresultclasseskjr   r   r    homeContent2   s$   "



zSpider.homeContentc                 C   r"   r#   r   r$   r   r   r    homeVideoContentF   r&   zSpider.homeVideoContentc           	      C   s   d|v r| dd}| |}nttj| j | | | j| jdj}| 	|d|}i }||d< ||d< d|v r<dnd|d	< d
|d< d|d< |S )N@folder r+   #archive article ar5   pager-   i 	pagecountZ   limiti?B total)
replacegetfodr6   r7   r8   r   r   r   r9   r@   )	r   tidpgrA   r   idvideosrB   rC   r   r   r    categoryContentI   s   (zSpider.categoryContentc              
   C   sl  |d  dr|d n| j |d  }ttj|| j| jdj}ddi}|dd}z4g }|drX|d	 D ]}|
 }|d	}	|d
t|	|d d | d  q9d||d< W n   |d
 |d< Y z8g }
|drt|d	 ddD ]\}}t|d}|
d| d| d|d d   q~d|
|d< W n   d| |d< Y d|giS )Nr   httpr+   vod_play_fromu   51吸瓜zscript[data-api]zdata-apiz.tags .keywords ar1   z[a=cr:)rU   namez/]z[/a] vod_contentz.post-titlez.dplayerr-   )r   zdata-configu   视频$_dm_videor'   #vod_play_urlu   可能没有视频$r5   )
startswithr   r6   r7   r8   r   r   r9   r>   r;   r=   r<   jsondumpsjoin	enumerateloads)r   idsr'   rB   voddidclistrE   titler1   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+   rK   )r5   rL   )r6   r7   r8   r   r   r   r9   r@   )r   keyquickrT   rB   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   flagrU   vipFlagsrj   pidpr   r   r    playerContentv   s
   zSpider.playerContentc              
   C   s"  z| dd}d|v r_t|d d\}}tj || j| jddj}| d}d	}|D ]}|d
rC|t	|dd 
dd7 }q-tj| j|t|fd}	|	  td| dd|gW S d|v r| j t|d  }tj || j| jdd }
g }|
D ]>}| d}| d}|r||  |r|D ]$}| d}|r| }d|v r||ddd   q|| qq| |t|d W S | |d }td|}|r|d}tj || j| jdd}
d|
j d| |
jgW S  ty } zt| g dW  Y d }~S d }~ww )NtyperJ   m3u8Zpdidr^   
   )r   r   timeout
g        z#EXTINF::,r   argsu   [INFO] 获取视频时长成功   z
text/plainZxdmpathr=   r:   @r[   r-   timesr'   zloadBannerDirect\('([^']*)'zContent-Typei  z	text/htmlrJ   )r8   r
   rw   r7   r   r   r=   r?   rb   floatrQ   r   r   some_background_taskintr   printr   rc   r<   xmld64rx   ry   groupaesimgr9   	Exception)r   paramZxtyper   r'   rB   linesr   ir   resdmsrE   r=   r:   rF   ctextmatcher   r   r    
localProxy}   sX   






zSpider.localProxyc              
   C   sr   z!t d |   dt| d| d}| dt|  W d S  ty8 } zt| W Y d }~d S d }~ww )Nr-   z&path=z&times=z	&type=xdmz:http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=)timesleeprz   r	   fetchr   r   )r   r   r   purlr   r   r   r    r      s   
zSpider.some_background_taskc              
   C   s   z]dt | d}d}|d| d7 }tt |D ]:}|t | | }|tdd }ttdt||d	}|  }t	d
d|| }	d| d| d|	 d}
||
7 }q|d7 }dd|gW S  t
yw } zt| g dW  Y d }~S d }~ww )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]rJ   z	<d p="z,1,25,z,0">z</i>r   ztext/xmlr   )lenrangerandomuniformroundmaxmin	get_colorrx   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 r@t   }t dd}t dd}t|||\}}}t|d }t|d }t|d }|d> |d>  | }t|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   X   z| d}t|}|dW S  ty+ } ztdt|  W Y d }~dS d }~ww )Nutf-8u   Base64编码错误: rJ   )encoder   decoder   r   r   )r   r=   
text_bytesencoded_bytesr   r   r   r    e64      
z
Spider.e64c              
   C   r   )Nr   u   Base64解码错误: rJ   )r   r   r   r   r   r   )r   encoded_textr   decoded_bytesr   r   r   r    r      r   z
Spider.d64c           	   
   C   s  | j }| d}|r1z"ttj|| j| jdjdd}|r+t	|}|j
d |j }W n   Y z<ttj|| j| jdj}d}t||dd tj}|sVtd	tt|d
 dd }| |W S  ty } z| dt|  W Y d }~dS d }~ww )N	host_51cnr+   r0   r1   ://Base64\.decode\('([^']+)'\)scriptr      未找到htmlr-   u   获取: rJ   )r   getCacher6   r7   r8   r   r   r9   r>   r   schemenetlocrx   ry   eqr=   DOTALLr   r   r   r   hstrlogr   )	r   r'   ZcurlrB   
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   r0   r1   r   r   )r6   r7   r8   r   r   r   r9   r   r>   r   r   r   setCache)r   rB   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();
        )rx   r   p_qjs)r   r   patternreplacementrB   r   r   r    r     s    
#zSpider.hstrc              
   C   sl   zddl m} | }||}|  t|W S  ty5 } z| d|  g W  Y d }~S d }~ww )Nr   )QuickJSContextu   执行失败: )	Zcom.whl.quickjs.wrapperr   createevaluater*   rc   rg   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}|s%tdt|d }d}t||tj}|s>td|dd	}d
}t||tj}|sVtd|d}	g }
tdD ]}t|}d| d|	 }|
| qa|
S )Nr+   r   r   r   r   r-   zwords\s*=\s*'([^']+)'u   未找到wordsr   z2lineAry\s*=.*?words\.random\(\)\s*\+\s*'\.([^']+)'u   未找到主域名r   zhttps://.)r6   r7   r8   r   r   r   r9   rx   ry   r   r=   r   r   r   r   r   rw   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}g d}|D ]}|| q|d}g }t|d	 D ]5\}}	|d }
|
||
dd||
 |   d	| ||
d
 dd |	 d q4|S )Nr+   z%.post-content[itemprop="articleBody"])z	.txt-appsz.line
blockquotez.tagsz.content-tabsr~   h2   r0   r1   &url=r-   imgzdata-xkrkllgl)vod_idvod_namevod_picvod_remarks)r   r6   r7   r8   r   r   r9   removerf   r;   r<   r   r>   r=   rz   r   )r   rU   r'   rB   vdatar   r   r~   rV   xrn   r   r   r    rR   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	}|| |  q-|D ]}|  qCt	 
 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   rJ   c              
      sr   zt   }tj| jjddd}t   | d }| | < W d S  ty8 } ztd | < W Y d }~d S d }~ww )Nr   F)r   r   r   allow_redirectsi  inf)r   r7   headr   r   r   r   )r'   
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>}  s    z"Spider.host_late.<locals>.<lambda>)rr   )
isinstancer   rw   r   r   r   r<   r   re   r   r;   )r   Zurl_listurlsthreadsr   r'   tr   r   r    r   `  s   
	


zSpider.host_laterJ   c           	      C   s   g }d|v }|  D ]G}|d}|d }|d }|rQ|rQ|rQ|| |r+dnd |dd|   d	| |d
  d||rHdnddddd q
|S )Nz/mrdgr1   r   zspan[itemprop="datePublished"]rI   rJ   r   r[   r   r   z	&type=imgfolderrectgHzG?)r   ratio)r   r   r   r   vod_tagstyle)r;   r>   r=   r<   rQ   rz   r   )	r   rB   rS   rV   lrE   r0   r   rn   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   wordrr   ivcipher	decryptedr   r   r    r     s
   zSpider.aesimgN)r   )rq   )rJ   )__name__
__module____qualname__r!   r%   r(   r)   r*   rG   rH   rW   rp   rt   r   r   r   r   r   r   r   r   r   r   r   r   rR   r   r@   r   r   r   r   r    r      s6    

+		)
r   )r   rc   r   rx   sysr   r   r7   Crypto.Cipherr   Crypto.Util.Paddingr   pyqueryr   r6   base64r   r   r   urllib.parser   r	   r
   r   r<   base.spiderr   r   r   r   r    <module>   s"   