
     bi>                         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.                  j1                  d       d d	lmZ  G d
 de      Zy)    N)AES)unpad)PyQuery)	b64decode	b64encode)pprint)urlparsequoteunquotez..)Spiderc                       e Zd ZddZd Zd Zd Zd Zd Zd Z	d Z
d	 Zdd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zy)r   c                    d| _         i | _        dddd| _        | j                  | j	                               }|r|| _        nd| _        | j                  j                  | j
                  | j
                   dd       t        j                  | j                        }|j                          | j                  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)targetF)dominproxiesheaders	host_lategethostshostupdate	threadingThreadgetcnhstarthomeContent)selfextendhost_candidatethreads       (   /storage/emulated/0/lz/py/sy/51吸瓜.pyinitzSpider.init   s    &tzt| QZ.	t| t}}7~
%49)49||diityykOLM   4v||~u%%    c                      y N r   s    r#   getNamezSpider.getName/       r%   c                      y r'   r(   )r   urls     r#   isVideoFormatzSpider.isVideoFormat2   r+   r%   c                      y r'   r(   r)   s    r#   manualVideoCheckzSpider.manualVideoCheck5   r+   r%   c                      y r'   r(   r)   s    r#   destroyzSpider.destroy8   r+   r%   c                    t        t        j                  | j                  | j                  | j
                        j                        }i }g }t         |d      j                  d      j                               dd D ]  } |d      rg |d      j                         D ]M  }|j                   |d      j                          |d      j                  d	      j                         d
       O r|j                   |d      j                          |d      j                  d	      j                         d
        ||d<   | j                   |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   contentr>   childrenitemsappendtextattrstripgetlist)r   filterdataresultclasseskjs          r#   r   zSpider.homeContent;   s   TYYT\\RZZ[d01::4@FFHI!BOAw7))+ANN%&sV[[]#$S6;;v#6#<#<#>$  , !"3 v{{6288:   P "wd+=&>?vr%   c                      y r'   r(   r)   s    r#   homeVideoContentzSpider.homeVideoContentO   r+   r%   c                 f   d|v r$|j                  dd      }| j                  |      }ngt        t        j                  | j
                   | | | j                  | j                        j                        }| j                   |d      |      }i }||d<   ||d<   d|v rdnd|d	<   d
|d<   d|d<   |S )N@folder r4   #archive article ar>   pager6   i 	pagecountZ   limiti?B total)
replacegetfodr?   r@   rA   r   r   r   rB   rI   )	r   tidpgrJ   r    idvideosrK   rL   s	            r#   categoryContentzSpider.categoryContentR   s    {{9R(B;;r?FHLLDII;seB4!8$,,W[WcWcdllmD<<%9 :3?Fvv#,#3a{w wr%   c           
         |d   j                  d      r|d   n| j                   |d    }t        t        j                  || j
                  | j                        j                        }ddi} |d      j                  d      }	 g } |d      ro |d      j                         D ]V  }|j                         }|j                  d	      }	|j                  d
t        j                  |	|d      z   dz   |z   dz          X dj                  |      |d<   	 g }
 |d      rmt         |d      j                         d      D ]I  \  }}t        j                   |j                  d            }|
j                  d| d| d|d   d           K dj                  |
      |d<   d|giS #   |d      j                         |d<   Y xY w#  d| |d<   Y 1xY w)Nr   httpr4   vod_play_fromu   51吸瓜zscript[data-api]zdata-apiz.tags .keywords ar:   z[a=cr:)r_   namez/]z[/a] vod_contentz.post-titlez.dplayerr6   )r   zdata-configu   视频$_dm_videor-   #vod_play_urlu   可能没有视频$r>   )
startswithr   r?   r@   rA   r   r   rB   rG   rD   rF   rE   jsondumpsjoin	enumerateloads)r   idsr-   rK   voddidclistrN   titler:   plistcconfigs                r#   detailContentzSpider.detailContenta   s   !f''/CF		{3q6(5KS$,,t||LTTU
+%&++J7		<E'(1288:AFFHE66&>DLLDJJdE7R,S!SVZ!Z]b!bek!kl ; "%%C	<EJ%d:&6&<&<&>aHDAq!ZZ}(=>FLL6!AcU$vgu7M6N!OP I !$C u~	<!%m!4!9!9!;C	<"5cU ;Cs   BF& BG &G
Gc           	          t        t        j                  | j                   d| d| | j                  | j
                        j                        }| j                   |d            |dS )Nz/search/r   r4   rU   )r>   rV   )r?   r@   rA   r   r   r   rB   rI   )r   keyquickr^   rK   s        r#   searchContentzSpider.searchContent{   sY    		{(3%q=t||\`\h\hiqqr||D)=$>?rJJr%   c                     |j                  d      \  }}t        j                  d|      rdnd}|s| j                          dt	        |       d}||| j
                  dS )Nri   z$\.(m3u8|mp4|flv|ts|mkv|mov|avi|webm)r   r6   z&pdid=z
&type=m3u8)parser-   header)splitresearchgetProxyUrlr
   r   )r   flagr_   vipFlagsru   pidps          r#   playerContentzSpider.playerContent   s]     Cyy@#F!A##%&fU2YKzBCC4<<@@r%   c                 R   	 |j                  dd      }d|v rt        |d         j                  d      \  }}t        j                   || j                  | j
                  d      j                  }|j                         j                  d      }d	}|D ]D  }|j                  d
      s|t        |j                  d      d   j                  dd            z  }F t        j                  | j                  |t        |      f      }	|	j                          t!        d|       dd|gS d|v r7| j"                   t        |d          }t        j                   || j                  | j
                  d      j%                         }
g }|
D ]  }|j                  d      }|j                  d      }|r|j'                  |j                                |sI|D ]n  }|j                  d      }|s|j                         }d|v r3|j'                  |j                  dd      d   j                                ^|j'                  |       p  | j)                  |t        |d               S | j+                  |d         }t-        j.                  d|      }|r|j1                  d      }t        j                   || j                  | j
                  d      }
d|
j                  j                  d      | j3                  |
j4                        gS # t6        $ r}t!        |       g dcY d }~S d }~ww xY w)NtyperT   m3u8pdidri   
   )r   r   timeout
g        z#EXTINF::,r   argsu   [INFO] 获取视频时长成功   z
text/plainxdmpathrF   rC   @rf   r6   timesr-   zloadBannerDirect\('([^']*)'zContent-Typei  z	text/htmlrT   )rA   r   r   r@   r   r   rF   rH   rm   floatr[   r   r   some_background_taskintr   printr   rn   rE   xmld64r   r   groupaesimgrB   	Exception)r   paramxtyper   r-   rK   linesr   ir"   resdmsrN   rF   rC   rO   ctextmatches                      r#   
localProxyzSpider.localProxy   s   (	*))F2&E v/55f=S\\#t||DLLY[\aa

**40A||J/uQWWS\"%5%=%=c"%EFF  #))1J1JRVWZ[`WaQbc7?\400%yyk'%-"8!9:ll3dll\^_ddfAvDUU:.HCJJtzz|4!)A"#%%-E$&+kkm#&%<$'JJu{{3q/A"/E/K/K/M$N$'JJu$5 "*  xxCg$788u&CII<cBEKKN,,sDLL$,,XZ[C8$++ckk:RSS 	*!H))	*s@   B%L (A>L 'B(L L )A9L #B L 	L&L!L&!L&c                     	 t        j                  d       | j                          dt        |       d| d}| j	                  dt        |              y # t
        $ r}t        |       Y d }~y d }~ww xY w)Nr6   z&path=z&times=z	&type=xdmz:http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=)timesleepr   r
   fetchr   r   )r   r   r   purlr   s        r#   r   zSpider.some_background_task   sm    	JJqM$$&'veDk]'%	RDJJSTYZ^T_S`ab 	!HH	s   AA 	A5 A00A5c           
         	 dt        |       d}d}|d| dz  }t        t        |            D ]  }|t        |      z  |z  }|t        j                  dd      z   }t	        t        dt        ||            d	      }| j                         }t        j                  d
d||         }	d| d| d|	 d}
||
z  } |dz  }dd|gS # t        $ r}t        |       g dcY d }~S d }~ww xY 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>
r7      r   r6   z[<>&\u0000\b]rT   z	<d p="z,1,25,z,0">z</i>r   ztext/xmlr   )lenrangerandomuniformroundmaxmin	get_colorr   subr   r   )r   r   r   tsrtdanmustrr   	base_timedm0dm2dm4tempdatar   s               r#   r   z
Spider.xml   s   	*#c(#;<D LH5dV6BBH3s8_S\U2	&..Q"77C3sE?3Q7nn&ff-r3q6:%cU&T#fEH$ % HX.. 	*!H))	*s   CC 	C&C!C&!C&c                 n   t        j                          dk  rt        j                          }t        j                  dd      }t        j                  dd      }t        j                  |||      \  }}}t	        |dz        }t	        |dz        }t	        |dz        }|dz  |dz  z   |z   }t        |      S y)	Ng?gffffff?      ?g?         16777215)r   r   colorsys
hsv_to_rgbr   str)r   hsvrgbdecimal_colors           r#   r   zSpider.get_color   s    ==?S AsC(AsC(A))!Q2GAq!AGAAGAAGA"Wa014M}%%r%   c                     	 |j                  d      }t        |      }|j                  d      S # t        $ r!}t	        dt        |              Y d }~yd }~ww xY w)Nutf-8u   Base64编码错误: rT   )encoder   decoder   r   r   )r   rF   
text_bytesencoded_bytesr   s        r#   e64z
Spider.e64   sW    	W-J%j1M ''00 	(Q12	   ,/ 	AAAc                     	 |j                  d      }t        |      }|j                  d      S # t        $ r!}t	        dt        |              Y d }~yd }~ww xY w)Nr   u   Base64解码错误: rT   )r   r   r   r   r   r   )r   encoded_textr   decoded_bytesr   s        r#   r   z
Spider.d64   sY    	(//8M%m4M ''00 	(Q12	r   c                    | j                   }| j                  d      }|r~	  t        t        j                  || j
                  | j                        j                        d      j                  d      }|r't        |      }|j                  dz   |j                  z   }	 t        t        j                  || j
                  | j                        j                        }d}t        j                  | |d      j                  d      j                         t        j                         }|st#        d	       t        t%        |j'                  d
            j)                               d      j                  d      j                         }| j+                  |      S #  Y xY w# t"        $ r'}| j-                  dt/        |              Y d }~yd }~ww xY w)N	host_51cnr4   r9   r:   ://Base64\.decode\('([^']+)'\)scriptr      未找到htmlr6   u   获取: rT   )r   getCacher?   r@   rA   r   r   rB   rG   r	   schemenetlocr   r   eqrF   DOTALLr   r   r   r   hstrlogr   )	r   r-   curlrK   
parsed_urlhtmlhtml_pattern
html_matchr   s	            r#   r   zSpider.gethosts   sl   JJ]];'_RT4<<V^^_`cdiijpq!)$J$++e3j6G6GGC		hll3dllS[[\D9L<h1B1B21F1K1K1MryyYJIo$>>>2i
 0 0 34;;=>xHKKBOTTVD99T?"  	HHxAx()	s%   A=F C:F" F"	G+GGc                 f   t        t        j                  | j                   d| j                  | j
                        j                        }  |d      j                  d      d      j                  d      }t        |      }|j                  dz   |j                  z   }| j                  d|       y )	Nz/homeway.htmlr4   z2.post-content[itemprop="articleBody"] blockquote pr   r9   r:   r   r   )r?   r@   rA   r   r   r   rB   r   rG   r	   r   r   setCache)r   rK   r-   r   r   s        r#   r   zSpider.getcnh  s    		{-8$,,W[WcWcdllmLDEFII!LSQVVW]^c]
  5(:+<+<<k$'r%   c                 f    d}d}t        j                  |||      }d| d}| j                  |      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();
        )r   r   p_qjs)r   r   patternreplacementrK   s        r#   r   zSpider.hstr
  sJ    :vvg{D1 	@ 
 	A"F zz$r%   c                     	 ddl m} |j                         }|j                  |      }|j	                          t        j                  |      S # t        $ r }| j                  d|        g cY d }~S d }~ww xY w)Nr   )QuickJSContextu   执行失败: )	com.whl.quickjs.wrapperr   createevaluater2   rn   rr   r   r   )r   js_coder   ctxresult_jsonr   s         r#   r   zSpider.p_qjs3  sf    		> '')C,,w/KKKM::k** 	HH~aS)*I	s   AA 	A7A2,A72A7c                 H   t        t        j                  | j                  | j                  | j
                        j                        }d}t        j                  | |d      j                  d      j                         t        j                        }|st        d      t        |j                  d            j                         }d}t        j                  ||t        j                        }|st        d      |j                  d      j!                  d	      }d
}t        j                  ||t        j                        }|st        d      |j                  d      }	g }
t#        d      D ]0  }t%        j&                  |      }d| d|	 }|
j)                  |       2 |
S )Nr4   r   r   r   r   r6   zwords\s*=\s*'([^']+)'u   未找到wordsr   z2lineAry\s*=.*?words\.random\(\)\s*\+\s*'\.([^']+)'u   未找到主域名r   zhttps://.)r?   r@   rA   r   r   r   rB   r   r   r   rF   r   r   r   r   r   r   r   r   choicerE   )r   r   r   r   words_patternwords_matchwordsmain_patterndomain_matchdomain_suffixdomains_random_worddomains                 r#   get_domainszSpider.get_domains?  sO   (,,tzz4<<U]]^5YY|T(^->->r-B-G-G-I299U
O,,))!,-4460iitRYY?,--!!!$**3/LyytRYY?011$**1-qA --.K}Am_=FNN6"  r%   c                    | j                    | }t        t        j                  || j                  | j
                        j                        } |d      }g d}|D ]  }|j                  |         |d      }g }t         |d      j                               D ]  \  }}	|dz  }
|j                   |j                  |
      d      j                  d      |j                  |
      j                         | j                          d	| j                   |j                  |
d
z         d      j                  d             |	j                         d        |S )Nr4   z%.post-content[itemprop="articleBody"])z	.txt-appsz.line
blockquotez.tagsz.content-tabsr   h2   r9   r:   &url=r6   imgzdata-xkrkllgl)vod_idvod_namevod_picvod_remarks)r   r?   r@   rA   r   r   rB   removerq   rD   rE   r   rG   rF   r   r   )r   r_   r-   rK   vdatar   r   r   r`   xry   s              r#   r\   zSpider.getfodW  s    B4 (,,sDLL$,,OWWX:;
DA5<<?
*U4[..01CAacAMM!!$$q'#,++F3DDGLLN"..01txx	QqS	%@P@U@UVe@f7g6hiffh	  2 r%   c                     t        |t              r-|j                  d      D cg c]  }|j                          }}n|}t	        |      dk  r	|r|d   S dS i g } fd}|D ];  }t        j                  ||f      }|j                  |       |j                          = |D ]  }|j                           t        j                         d       d   S c c}w )	Nr   r6   r   rT   c                    	 t        j                          }t        j                  | j                  j                  dd      }t        j                          |z
  dz  }|| <   y # t
        $ r}t        d      | <   Y d }~y d }~ww xY w)Nr   F)r   r   r   allow_redirectsi  inf)r   r@   headr   r   r   r   )r-   
start_timeresponsedelayr   resultsr   s        r#   	test_hostz#Spider.host_late.<locals>.test_hostu  sn    ,!YY[
#==T\\$,,_btyzz1T9$ ,$U|,s   A!A% %	B.BBr   c                     | d   S )Nr6   r(   )r  s    r#   <lambda>z"Spider.host_late.<locals>.<lambda>  s    !A$r%   )r}   )
isinstancer   r   rH   r   r   r   rE   r   rp   r   rD   )	r   url_listuurlsthreadsr(  r-   tr'  s	   `       @r#   r   zSpider.host_latei  s    h$'/~~c':;':!AGGI':D;Dt9>"47**	, C  	?ANN1GGI 
 AFFH  7==?7::7 <s   Cc                    g }d|v }|j                         D ]  }|j                  d      } |d      j                         } |d      j                         }|sC|sF|sI|j                  | |rdnd |j	                  dd      | j                          d	| j                   |d
      j                                d||rdnddddd        |S )Nz/mrdgr:   r  zspan[itemprop="datePublished"]rS   rT   r   rf   r  r   z	&type=imgfolderrectgHzG?)r   ratio)r  r  r  r  vod_tagstyle)rD   rG   rF   rE   r[   r   r   )	r   rK   r]   r`   lrN   r9   r   ry   s	            r#   rI   zSpider.getlist  s    
S.AffVnAgllnA01668AQ1!"I#;< !		$ 4"&"2"2"4!5U488AhKDTDTDV;W:XXab#$*+h&,t<   r%   c                     d}d}t        j                  |t         j                  |      }t        |j	                  |      t         j
                        }|S )Ns   f5d965df75336270s   97b60394abc2fbe1)r   newMODE_CBCr   decrypt
block_size)r   wordr}   ivcipher	decrypteds         r#   r   zSpider.aesimg  sA    ! cllB/&...?	r%   N)z{})1)rT   )__name__
__module____qualname__r$   r*   r.   r0   r2   r   rQ   ra   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r\   r   rI   r   r(   r%   r#   r   r      s    &0(4KA)*V*&,(' R
0$;>$r%   r   )r   rn   r   r   sysr   r   r@   Crypto.Cipherr   Crypto.Util.Paddingr   pyqueryr   r?   base64r   r   r   urllib.parser	   r
   r   r   rE   base.spiderr   r(   r%   r#   <module>rL     sU       	 
     % ! '  1 1   JV Jr%   