
    h^              	          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 ej	        
                    d           d dlmZ  G d de          Zedk    r e            Z ed	e                    d
                      ed           e                    d          Z ed ee                    dg                                  ed ee                    dg                                 e                    d          r eded         d                      e                    d          r eded         d                      dS dS dS )    N)	urlencode)BeautifulSoupz..)Spiderc                        e Zd Z fdZd Zd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dZd Zd Z xZS )r   c                     t                                                       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 S ) Nzhttps://139fm.cyouzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36ztext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7zzh-CN,zh;q=0.9,zh-TW;q=0.8zgzip, deflate, br, zstdz	max-age=0z
keep-alivezsame-originnavigatez?1document1)
User-AgentAcceptzAccept-LanguagezAccept-EncodingzCache-Control
ConnectionzSec-Fetch-SitezSec-Fetch-ModezSec-Fetch-UserzSec-Fetch-DestzUpgrade-Insecure-Requestsu   长篇有声u   短篇有声u   自慰催眠
   ASMR专区)r
   234	   小苮儿   步非烟团队	   小野猫   戴逸   姽狐   小咪   浅浅   季姜   丽莎   雅朵   曼曼   小窈)r   r   r   r   r   r   r   r   r   r   r   r   r   )super__init__baseheaderscategory_map
anchor_map)self	__class__s    5   /storage/emulated/0/纯福利/PY1/y_139fm多分类.pyr   zSpider.__init__   s    (	 L `;8(&+("(),
 
   	
 
 %0$&
 
    c                     dS )Nu   139FM有声小说 r$   s    r&   getNamezSpider.getName:   s    ""r'    c                     |pd| _         ddiS )Nr,   classaudio)extend)r$   r0   s     r&   initzSpider.init=   s    l!!r'   c                 `    t          t          j        dt          |                              S )Nz\.(m3u8|mp3|m4a)(\?|$))boolresearchstr)r$   urls     r&   isVideoFormatzSpider.isVideoFormatA   s#    BI7SBBCCCr'   c                     dS )NFr)   r*   s    r&   manualVideoCheckzSpider.manualVideoCheckD   s    ur'   c                     d S )Nr)   r*   s    r&   destroyzSpider.destroyG   s    r'   c                 N   d|cxk    rdk    rEn nBt          t          |          t          d          z
  dz   dz  t          d          z             S d|cxk    rdk    rEn nBt          t          |          t          d          z
  dz   dz  t          d          z             S |S )u    对单个字符进行ROT13转换az      AZ)chrord)r$   chars     r&   
rot13_charzSpider.rot13_charK   s    $#TSXX-2b8CHHDEEEDCTSXX-2b8CHHDEEEKr'   c                     g }|D ]_}d|cxk    rdk    sn d|cxk    rdk    r,n n)|                     |                     |                     J|                     |           `d                    |          S )u    对字母字符进行ROT13转换r>   r?   rB   rC   r,   )appendrG   join)r$   textresultrF   s       r&   ee2z
Spider.ee2T   s     	$ 	$Dd!!!!c!!!!SD%7%7%7%7C%7%7%7%7%7dood334444d####wwvr'   c                    	 |                      |          }t          j        |                              d          }|                      |          }|S # t          $ r$}|                     d|            |cY d}~S d}~ww xY w)u*   主解密函数：ROT13 -> Base64 -> ROT13zutf-8u   解密失败: N)rM   base64	b64decodedecode	Exceptionlog)r$   encrypted_textdefault_valuestep1step2step3es          r&   dd0z
Spider.dd0^   s    
	!HH^,,E$U++227;;EHHUOOEL 	! 	! 	!HH)a))***       	!s   AA 
BA>8B>Bc           	         d|vrd|vr|                      d           dS |                    d          }|dk    r-|||dz            }|                      d|dd                     g d	}t          |          D ]\  }}t          j        ||t          j                  }|r	 |                    d
          }|                      d|d
z    d|dd                     t          j        d|          }	|	st          j        d|          }	|                      dt          |	           d           |	r|	ddc S # t          $ r(}
|                      d|d
z    d|
            Y d}
~
d}
~
ww xY w|                      d           dS )u'   从JavaScript代码中提取_conf对象z	var _confu
   var _confu   HTML中不包含 var _confNi  u"   找到_conf位置，附近内容: i,  )z9var\s+_conf\s*=\s*\{\s*a\s*:\s*\[((?:'[^']*'\s*,?\s*)*)\]z9var\s+_conf\s*=\s*\{\s*a\s*:\s*\[((?:"[^"]*"\s*,?\s*)*)\]z3_conf\s*=\s*\{\s*a\s*:\s*\[((?:'[^']*'\s*,?\s*)*)\]z3_conf\s*=\s*\{\s*a\s*:\s*\[((?:"[^"]*"\s*,?\s*)*)\]z"a\s*:\s*\[((?:'[^']*'\s*,?\s*)*)\]z"a\s*:\s*\[((?:"[^"]*"\s*,?\s*)*)\]   u   使用模式u   成功匹配，数组内容:    z	'([^']*)'z	"([^"]*)"u   成功提取 u    个加密字符串r,   )r>   cu   模式u   解析失败: u   所有模式都未找到a数组)
rS   find	enumerater4   r5   DOTALLgroupfindalllenrR   )r$   htmlconf_possnippetpatternsipatterna_matcharray_contentstringsrY   s              r&   extract_conf_from_htmlzSpider.extract_conf_from_htmll   s    d""~T'A'AHH12224 99[))r>>8HSL01GHHI'$3$-IIJJJ
 
 
 $H-- 	 	JAwiry99G $+MM!$4$4MHHcAaCccm\`]`\`Naccddd !j}EEG" J"$*\="I"IHHNS\\NNNOOO 7%,2666667 !   HH<ac<<<<===HHHH%, 	2333ts   #BD::
E,E''E,c                     g }|rkd|v rgt          |d         t                    rL|d         D ]C}|r?|                     ||                    dd                    }|                    |           D|S )u   解密所有配置数据r>   r_   r,   )
isinstancelistrZ   getrI   )r$   	conf_dataresultsencrypted_strrL   s        r&   decrypt_allzSpider.decrypt_all   s     	+	))j3.N.N)!*3 + +  +!XXmY]]35K5KLLFNN6***r'   c                 *   	 | j          d}|                     || j        d          }t          |j        d          }g }|                    dd          }|rq|                    d          D ][}|                    d	          }|rB|d
k    r<|                    ||	                                
                                d           \|                    dd          }	|	r\|	                    d          D ]F}|                    d	          }|r-|dk    r'|| j        v r|                    d| d| d           Gg }
|                    dd          }|                     dt          |           d           |D ]}|                    dd          }|s|                    dd          }|                    dd          }d}|rg|                    d          rRt          j        d|                    d                    }|r(|                    d          
                    d          }|                    d d!          }d}|r=|                    d          }|r&|	                                
                                }|                    dd"          }|r&|	                                
                                nd}|r9|r7|                    d#          d$         }|
                    ||||pd%d&           |                     d't          |
           d(           ||
d)S # t$          $ rR}|                     d*|            d+d,l}|                     |                                           g g d)cY d,}~S d,}~ww xY w)-u   首页内容	/podcasts
   r!   timeouthtml.parserdlareas)idddzdata-valz-1)type_id	type_nametagsu   全部anchor_u   主播-divmh-itemclass_u   找到     个音频项r>   Threfr   r,   pmh-coverstyleurl\((.*?)\)r]   '"h2titlechapter/r\      暂无简介vod_idvod_namevod_picvod_remarksu   成功解析 
    个音频)r.   rr   zHome error: r   N)r    fetchr!   r   rK   r`   find_allrs   rI   get_textstripr#   rS   re   r4   r5   rc   splitrR   	traceback
format_exc)r$   filterr7   rsoup
categories	areas_divr   data_valtags_dlaudiositemsitema_tagr   cover_p	cover_urlmatchtitle_h2r   title_a	chapter_pr   r   rY   r   s                             r&   homeContentzSpider.homeContent   s?   Q	Y)))C

3b
AAA 77DJ 		$7	33I #,,T22  B!vvj11H H$4$4"))'/)+)<)<)>)>+ +    iii00G !**400  B!vvj11H H$8$8X=X=X"))';';';)=8)=)=+ +    FMM%	M::EHH8s5zz888999    		#D	11 yy,,))C
);;	 @w{{733 @Iow{{77K7KLLE @$)KKNN$8$8$?$?	  99T'9:: ;&mmC00G ; ' 0 0 2 2 8 8 : : IIc)I<<	:CK),,..44666 E !ZZ__R0FMM"($)#,'.'@.	# #    HH<S[[<<<=== $    	 	 	HH'A''(((HHY))++,,,       		s   L3L6 6
N ANNNc                     	 |                      d          }d|                    dg           iS # t          $ r&}|                     d|            dg icY d}~S d}~ww xY w)u   首页推荐视频Frr   zhomeVideoContent error: N)r   rs   rR   rS   )r$   rL   rY   s      r&   homeVideoContentzSpider.homeVideoContent   s    	 %%e,,FFJJvr2233 	  	  	 HH333444B<	 s   ,/ 
AAAAc                    	 | j          d}i }|r1|                    d          r|                    dd          }||d<   n|r|| j        v r||d<   |rt	          |          dk    r||d<   |r| dt          |           }|                     || j        d	
          }t          |j	        d          }	g }
|	
                    dd          }|                     dt          |           d           |D ]}|                    dd          }|s|                    dd          }|                    dd          }d}|rg|                    d          rRt          j        d|                    d                    }|r(|                    d                              d          }|                    dd          }d}|r=|                    d          }|r&|                                                                }|                    dd          }|r&|                                                                nd}|r9|r7|                    d          d         }|
                    ||||pdd            |                     d!t          |
           d"           d}|	                    dd#          }|ry|
                    dd$          D ]a}|                    dd          }t          j        d%|          }|r2t	          |                    d                    }t-          ||          }b|
|rt	          |          nd|d&t          |
          |z  d'S # t.          $ rf}|                     d(|            d)d*l}|                     |                                           g |rt	          |          nddd&d)d'cY d*}~S d*}~ww xY w)+u   分类内容ry   r   r,   tagarear]   page?rz   r{   r}   r   r   r   u   分类页找到 r   r>   Tr   r   r   r   r   r   r   r   r   r   r   r\   r   r   u   分类页成功解析 r   
pagination)r   z
page=(\d+)0   )rr   r   	pagecountlimittotalzCategory error: r   N)r    
startswithreplacer"   intr   r   r!   r   rK   r   rS   re   r`   rs   r4   r5   rc   r   r   r   rI   maxrR   r   r   )r$   tidpgr   r0   r7   paramsanchorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   page_numrY   r   s                                r&   categoryContentzSpider.categoryContent  sj   Y	Y)))CF %s~~i00 %Y33 &u % 111!$v $c"ggkk!#v 322y0022

3b
AAA 77DFMM%	M::EHHAE

AAABBB    		#D	11 yy,,))C
);;	 @w{{733 @Iow{{77K7KLLE @$)KKNN$8$8$?$?	  99T'9:: ;&mmC00G ; ' 0 0 2 2 8 8 : : IIc)I<<	:CK),,..44666 E !ZZ__R0FMM"($)#,'.'@.	# #    HHEc&kkEEEFFF I5>>J ='00D0AA = =E 99VR00DImT::E =#&u{{1~~#6#6$'	8$<$<	 #%,B1&Vy0    
	 
	 
	HH+++,,,HHY))++,,,#%,B1       	
	s   MM" "
O,AOOOc                    dg i}|D ]}	 | j          d| }|                     || j        d          }t          |j        d          }|                     |j                  }g }|rR|                     d|            |                     |          }|                     dt          |                      |	                    d          }	|	r:|	
                                                    d	d
                                          nd| }
d
}|	                    dddi          }|r*|                    d          r|                    d          }|s|	                    d          }|rg|                    d          rRt          j        d|                    d                    }|r(|                    d                              d          }g }|                    dd          }t%          |          D ]\  }}|	                    dd          }|r&|
                                                                nd|dz    d}|	                    dd          }|r&|
                                                                nd
}|                    d          dk    }|                    dd
          }|t          |          k     r||         nd
}|                    |||||d           t          j        d |j                  }t          j        d!|j                  }t          j        d"|j                  }t          j        d#|j                  }d$}|r)|                    d                              d%d
          }d
}|r)|                    d                              d&d'          }d
} |rN|                     |                    d                                        d(d
                                          } d
}!|rN|                     |                    d                                        d)d
                                          }!d*}"g }#t%          |          D ]N\  }}$|$d+         }%|$d,         r|%d-z  }%|$d.         }&|&s| d/|$d0          d/| }&|#                    |% d1|&            Od2                    |#          }'|d                             ||
                    d3d
                                          || |!|rd4t          |           dnd
|||"|'d5
           -# t,          $ r}(|                     d6| d7|(            d8d9l})|                     |)                                           |d                             |d:d
d;t3          |(           d<           Y d9}(~(d9}(~(ww xY w|S )=u   详情内容rr   	/podcast/rz   r{   r}   u   找到_conf对象: u   解密后的URL列表数量: r   z-139FMr,   u   音频_imgzdata-amplitude-song-infocover_art_urlsrcr   r   r   r   r]   r   r   songz
song-titleu   第u   集zsong-artistzdata-require-buyr
   zdata-chapter-id)nameartist
requireBuy	chapterIdr7   z"desc":\s*"([^"]*)"z"area":\s*"([^"]*)"z"tag":\s*"([^"]*)"z"clicks":\s*"([^"]*)"r   u	   简介：u	   热度：u   热度:u	   类型：u	   主播：139FMr   r   u   [付费]r7   _r   $#u$   全集免费高清无修在线阅读u   共)
r   r   r   r   	vod_actorvod_directorvod_contentr   vod_play_fromvod_play_urlzDetail error for z: r   Nu   获取失败u   获取详情失败: )r   r   r   r   )r    r   r!   r   rK   ro   rS   rw   re   r`   r   r   r   rs   r4   r5   rc   r   ra   rI   removeHtmlTagsrJ   rR   r   r   r6   )*r$   idsrL   id_r7   r   r   _confdecrypted_urls	title_tagr   r   	cover_img	cover_divr   episodessongsindexr   	title_divepisode_title
artist_divepisode_artistrequire_buy
chapter_id	audio_url
desc_match
area_match	tag_matchclicks_matchr   r   r   r   	play_fromplay_url_partsepepisode_nameepisode_urlplay_urlrY   r   s*                                             r&   detailContentzSpider.detailContentc  s   " w	 w	Cv22S22JJsDL"JEE$QV];; 33AF;;!# THH:5::;;;%)%5%5e%<%<NHHRS=P=PRRSSS !IIg..	NWl	**,,44XrBBHHJJJ]lgj]l]l 	 IIe.H/-Z[[	 5u!5!5 5 )e 4 4I  D $			 < <I  DY]]7%;%; D "	/9==;Q;Q R R  D(-A(<(<U(C(CI eF;;#,U#3#3  KE4 $		%	 E EIDM$eI$6$6$8$8$>$>$@$@$@SeY^_`Y`SeSeSeM!%5!G!GJFP%XZ%8%8%:%:%@%@%B%B%BVXN"&((+=">">#"EK!%*;R!@!@J :?^ATAT9T9Tu 5 5Z\IOO -"0&1%/(% %      Y'=qvFF
Y'=qvFF
I&;QVDD	!y)A16JJ, O","2"21"5"5"="=k2"N"NK  X"."4"4Q"7"7"?"?Y"W"WK	 j $ 3 3J4D4DQ4G4G H H P PQ\^` a a g g i iI	 i $ 3 3IOOA4F4F G G O OP[]_ ` ` f f h hI $	 "$!*8!4!4 
K 
KIE2#%f:L,' 3$
2"$U)K& I),&H&Hr+&H&H&H&H"))\*I*IK*I*IJJJJ88N33v%%! %.TVX Y Y _ _ a a(!*!*@H$P$<#h--$<$<$<$<b#.#.%.$,' '      	 	 	7S77A77888    --//000v%%! .!#B#a&&#B#B	' '        		 s   T'T44
V?>A6V::V?r
   c                    	 d|i}|rt          |          dk    r||d<   | j         dt          |           }|                     || j        d          }t          |j        d          }g }|                    dd	
          }	|                     dt          |	           d           |	D ]}
|

                    dd          }|s|                    dd          }|

                    dd
          }d}|rg|                    d          rRt          j        d|                    d                    }|r(|                    d                              d          }|

                    dd
          }d}|r=|
                    d          }|r&|                                                                }|

                    dd
          }|r&|                                                                nd}|r9|r7|                    d          d         }|                    ||||pdd           |                     dt          |           d           ||rt          |          nddt          |          d S # t&          $ re}|                     d!|            d"d#l}|                     |                                           g |rt          |          nddd"d cY d#}~S d#}~ww xY w)$u   搜索内容keywordr]   r   z/search?rz   r{   r}   r   r   r   u   搜索页找到 r   r>   Tr   r   r,   r   r   r   r   r   r   r   r   r   r\   r   r   u   搜索页成功解析 r   )rr   r   r   r   zSearch error: r   N)r   r    r   r   r!   r   rK   r   rS   re   r`   rs   r4   r5   rc   r   r   r   rI   rR   r   r   )r$   keyquickr   r   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rY   r   s                           r&   searchContentzSpider.searchContent  s^   @	%F $c"ggkk!#vY;;	&(9(9;;C

3b
AAA 77DFMM%	M::EHHAE

AAABBB    		#D	11 yy,,))C
);;	 @w{{733 @Iow{{77K7KLLE @$)KKNN$8$8$?$?	  99T'9:: ;&mmC00G ; ' 0 0 2 2 8 8 : : IIc)I<<	:CK),,..44666 E !ZZ__R0FMM"($)#,'.'@.	# #    HHEc&kkEEEFFF #%,B1V	    		 		 		HH)a))***HHY))++,,,#%,B1	       			s   I?J 
K1AK,&K1,K1c                    	 |                     d          rdd|| j        | j        d         ddddS |                    d	          }t	          |          d
k    r|d         |d         |d         }}}| j         d| }|                     || j        d          }	|                     |	j                  }
|
rf|                     |
          }t          |          }|t	          |          k     r/||         r'dd||         | j         d| | j        d         ddddS dddi dS # t          $ rT}|                     d|            ddl}|                     |                                           dddi dcY d}~S d}~ww xY w)u   播放内容httpr   r,   r   z*/*zbytes=0-)Refererr   r   Range)parseplayUrlr7   headerr      r]      r   rz   r{   zPlay error: N)r   r    r!   r   re   r   ro   rK   rw   r   rR   rS   r   r   )r$   flagr   vipFlagsparts
podcast_idr   r   r7   r   r   r   audio_indexrY   r   s                  r&   playerContentzSpider.playerContent&  s   ;	}}V$$ !#'9&*l<&@"'!+	 	
 
 
 HHSMME5zzQ05a%(E!HJ
 99Z99JJsDL"JEE33AF;; %)%5%5e%<%<N"%e**K"S%8%888^K=X8%&')#1+#>.2i+N+N*+N+N.2l<.H*/)3	' '	
  
  
 	    		 		 		HH'A''(((HHY))++,,,	       			s*   0D% C*D% D% %
F/A	E>8F>Fc                      t          |          S )u   本地代理)dict)r$   params     r&   
localProxyzSpider.localProxye  s    E{{r'   )r,   )r
   )__name__
__module____qualname__r   r+   r1   r8   r:   r<   rG   rM   rZ   ro   rw   r   r   r   r   r   r  r  __classcell__)r%   s   @r&   r   r      s]       (
 (
 (
 (
 (
T# # #" " " "D D D        ! ! ! !0 0 0d  S S Sj     [ [ [z} } }~B B B BH= = =~      r'   r   __main__zinit:r,   u   
=== 测试首页内容 ===Fu   分类数量: r.   u   首页音频数量: rr   u   第一个分类: u   第一个音频: )r4   sysjsonrO   stringurllib.parser   bs4r   pathrI   base.spiderr   
BaseSpiderr  spprintr1   r   homere   rs   r)   r'   r&   <module>r$     s   
			 



    " " " " " "           , , , , , ,X	 X	 X	 X	 X	Z X	 X	 X	v z	B	E'2772;;	E
()))>>%  D	E
733txx4455
7
7888	E
<TXXfb%9%9!:!:
<
<===xx 64$w-"244555xx 53$v,q/3344444 5 5r'   