
    ph^              	       &   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                  j                  d       d dlmZ  G d de      Zedk(  r e       Z ed	ej#                  d
              ed       ej%                  d      Z ed eej+                  dg                      ed eej+                  dg                     ej+                  d      r eded   d            ej+                  d      r eded   d            yyy)    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| _        y ) 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    .   /storage/emulated/0/lz/py/sy/139fm多分类.pyr   zSpider.__init__   s    (	 L `;8(&+("(),
   	
 %0$&
    c                      y)Nu   139FM有声小说 r$   s    r&   getNamezSpider.getName:   s    "r'   c                      |xs d| _         ddiS )N classaudio)extend)r$   r0   s     r&   initzSpider.init=   s    l!!r'   c                 R    t        t        j                  dt        |                  S )Nz\.(m3u8|mp3|m4a)(\?|$))boolresearchstr)r$   urls     r&   isVideoFormatzSpider.isVideoFormatA   s    BII7SBCCr'   c                      y)NFr)   r*   s    r&   manualVideoCheckzSpider.manualVideoCheckD   s    r'   c                      y )Nr)   r*   s    r&   destroyzSpider.destroyG   s    r'   c                    d|cxk  rdk  r5n n2t        t        |      t        d      z
  dz   dz  t        d      z         S d|cxk  rdk  r6n |S t        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X-2b8CHDEEDC K TSX-2b8CHDEEKr'   c                     g }|D ]O  }d|cxk  rdk  sn d|cxk  rdk  r$n n!|j                  | j                  |             ?|j                  |       Q dj                  |      S )u    对字母字符进行ROT13转换r>   r?   rB   rC   r-   )appendrG   join)r$   textresultrF   s       r&   ee2z
Spider.ee2T   s[    Dd!c!SD%7C%7dood34d#	 
 wwvr'   c                     	 | j                  |      }t        j                  |      j                  d      }| j                  |      }|S # t        $ r }| j                  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^   sk    
	!HH^,E$$U+227;EHHUOEL 	!HH~aS)*  	!s   AA
 
	A3A.(A3.A3c           	         d|vrd|vr| j                  d       y|j                  d      }|dk7  r|||dz    }| j                  d|dd         g d	}t        |      D ]  \  }}t        j                  ||t        j
                        }|s.	 |j                  d
      }| j                  d|d
z    d|dd         t        j                  d|      }	|	st        j                  d|      }	| j                  dt        |	       d       |	r|	ddc S  | j                  d       y# t        $ r$}
| j                  d|d
z    d|
        Y d}
~
d}
~
ww xY w)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   sj    d"~T'AHH12 99[)r>8HSL1GHH9'$3-IJ
 $H-JAwiiryy9G$+MM!$4MHH|AaC50Mm\`]`NaMbcd !jj}EG""$**\="IHH}S\N:MNO%,266 # .0 	23 ! HHvacU.<=s   B D%%	E.EEc                     g }|rWd|v rSt        |d   t              r@|d   D ]8  }|s| j                  ||j                  dd            }|j	                  |       : |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!*3 !XXmY]]35KLFNN6* "0 r'   c                 J   	 | j                    d}| j                  || j                  d      }t        |j                  d      }g }|j                  dd      }|r`|j                  d      D ]L  }|j                  d	      }|s|d
k7  s|j                  ||j                         j                         d       N |j                  dd      }	|	rY|	j                  d      D ]E  }|j                  d	      }|s|dk7  s|| j                  v s,|j                  d| d| d       G g }
|j                  dd      }| j                  dt        |       d       |D ]M  }|j                  dd      }|s|j                  dd      }|j                  dd      }d}|rX|j                  d      rGt        j                  d|j                  d            }|r |j!                  d      j                  d      }|j                  d d!      }d}|r1|j                  d      }|r|j                         j                         }|j                  dd"      }|r|j                         j                         nd}|s|s |j#                  d#      d$   }|
j                  ||||xs d%d&       P | j                  d't        |
       d(       ||
d)S # t$        $ rF}| j                  d*|        d+d,l}| j                  |j)                                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	YYKy)C

3b
AA 7DJ 		$7	3I#,,T2B!vvj1HH$4"))'/)+)<)<)>+  3 iii0G!**40B!vvj1HH$8X=X")))0
';+28*)=+  1 FMM%	M:EHHws5zl-89		#D	1yy,))C
);	w{{73IIow{{77KLE$)KKN$8$8$?	  99T'9:&mmC0G ' 0 0 2 8 8 : IIc)I<	:C),,.446E!ZZ_R0FMM"($)#,'.'@.	# 7 D HH}S[M<= $   	HH|A3'(HHY))+, 		sK   BK K 
A.K 9K ?K E+K ;K ?AK 	L";LL"L"c                     	 | j                  d      }d|j                  dg       iS # t        $ r"}| j                  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33 	 HH/s34B<	 s   $' 	AAAAc                    	 | j                    d}i }|r)|j                  d      r|j                  dd      }||d<   n|r|| j                  v r||d<   |rt	        |      dkD  r||d<   |r| dt        |       }| j                  || j                  d	
      }t        |j                  d      }	g }
|	j                  dd      }| j                  dt        |       d       |D ]M  }|j                  dd      }|s|j                  dd      }|j                  dd      }d}|rX|j                  d      rGt        j                   d|j                  d            }|r |j#                  d      j%                  d      }|j                  dd      }d}|r1|j                  d      }|r|j'                         j%                         }|j                  dd      }|r|j'                         j%                         nd}|s|s |j)                  d      d   }|
j+                  ||||xs dd        P | j                  d!t        |
       d"       d}|	j                  dd#      }|ri|j                  dd$      D ]S  }|j                  dd      }t        j                   d%|      }|s.t	        |j#                  d            }t-        ||      }U |
|rt	        |      nd|d&t        |
      |z  d'S # t.        $ rV}| j                  d(|        d)d*l}| j                  |j3                                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  s:   Y	YYKy)CFs~~i0Y3 &u 1 11!$vc"gk!#vQy012

3b
AA 7DFMM%	M:EHH'E
|=AB		#D	1yy,))C
);	w{{73IIow{{77KLE$)KKN$8$8$?	  99T'9:&mmC0G ' 0 0 2 8 8 : IIc)I<	:C),,.446E!ZZ_R0FMM"($)#,'.'@.	# 7 D HH-c&k]*EF I5>J'00D0AE 99VR0DIImT:E#&u{{1~#6$'	8$<	 B #%B1&Vy0   
	HH's+,HHY))+,#%B1 	
	s3   G;K3 ?K3 B&K3 *AK3 3	M<AMMMc                 
   dg i}|D ]  }	 | j                    d| }| j                  || j                  d      }t        |j                  d      }| j                  |j                        }g }|rB| j                  d|        | j                  |      }| j                  dt        |              |j                  d      }	|	r.|	j                         j                  d	d
      j                         nd| }
d
}|j                  dddi      }|r"|j                  d      r|j                  d      }|sl|j                  d      }|rX|j                  d      rGt        j                  d|j                  d            }|r |j!                  d      j                  d      }g }|j#                  dd      }t%        |      D ]  \  }}|j                  dd      }|r|j                         j                         nd|dz    d}|j                  dd      }|r|j                         j                         nd
}|j                  d      dk(  }|j                  dd
      }|t        |      k  r||   nd
}|j'                  |||||d        t        j                  d |j                        }t        j                  d!|j                        }t        j                  d"|j                        }t        j                  d#|j                        }d$}|r!|j!                  d      j                  d%d
      }d
}|r!|j!                  d      j                  d&d'      }d
} |r>| j)                  |j!                  d            j                  d(d
      j                         } d
}!|r>| j)                  |j!                  d            j                  d)d
      j                         }!d*}"g }#t%        |      D ]>  \  }}$|$d+   }%|$d,   r|%d-z  }%|$d.   }&|&s| d/|$d0    d/| }&|#j'                  |% d1|&        @ d2j+                  |#      }'|d   j'                  ||
j                  d3d
      j                         || |!|rd4t        |       dnd
|||"|'d5
        |S # t,        $ rj}(| j                  d6| d7|(        d8d9l})| j                  |)j1                                |d   j'                  |d:d
d;t3        |(       d<       Y d9}(~(d9}(~(ww xY w)=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   "Cv9SE2JJsDLL"JE$QVV]; 33AFF;!#HH25':;%)%5%5e%<NHH<S=P<QRS !IIg.	NW	**,44XrBHHJ_fgjfk]l 	 IIe.H/-Z[	u!5 )e 4I  $			 <I Y]]7%; "		/9==;Q R (-A(<(<U(CI eF;#,U#3KE4 $		%	 EIDMI$6$6$8$>$>$@UXY^_`Y`XaadSeM!%5!GJFPZ%8%8%:%@%@%BVXN"&((+=">#"EK!%*;R!@J :?^AT9Tu 5Z\IOO -"0&1%/(%  $4,  YY'=qvvF
YY'=qvvF
II&;QVVD	!yy)A166J,","2"21"5"="=k2"NK "."4"4Q"7"?"?Y"WK	 $ 3 3J4D4DQ4G H P PQ\^` a g g iI	 $ 3 3IOOA4F G O OP[]_ ` f f hI $	 "$!*8!4IE2#%f:L,'$
2"$U)K&),Qr+.?q&H"))\N!K=*IJ "5 88N3v%%! %.TVX Y _ _ a(!*!*@Hc#h-$<b#.#.%.$,' C r   	,SEA378 --/0v%%! .!%9#a&#B	'  		s   Q<R	T AS;;T c                    	 d|i}|rt        |      dkD  r||d<   | j                   dt        |       }| j                  || j                  d      }t        |j                  d      }g }|j                  dd	
      }	| j                  dt        |	       d       |	D ]M  }
|
j                  dd      }|s|j                  dd      }|
j                  dd
      }d}|rX|j                  d      rGt        j                  d|j                  d            }|r |j                  d      j                  d      }|
j                  dd
      }d}|r1|j                  d      }|r|j!                         j                         }|
j                  dd
      }|r|j!                         j                         nd}|s|s |j#                  d      d   }|j%                  ||||xs dd       P | j                  dt        |       d       ||rt        |      nddt        |      d S # t&        $ rU}| j                  d!|        d"d#l}| j                  |j+                                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  sl   @	%Fc"gk!#vYYKx	&(9':;C

3b
AA 7DFMM%	M:EHH'E
|=AB		#D	1yy,))C
);	w{{73IIow{{77KLE$)KKN$8$8$?	  99T'9:&mmC0G ' 0 0 2 8 8 : IIc)I<	:C),,.446E!ZZ_R0FMM"($)#,'.'@.	# 7 D HH-c&k]*EF #%B1V	   		HH~aS)*HHY))+,#%B1	 			s,   F6H* :H* >A+H* *	J3A
J=JJc                    	 |j                  d      r#dd|| j                  | j                  d   ddddS |j                  d	      }t	        |      d
k\  r|d   |d   |d   }}}| j                   d| }| j                  || j                  d      }	| j                  |	j                        }
|
rZ| j                  |
      }t        |      }|t	        |      k  r0||   r+dd||   | j                   d| | j                  d   ddddS dddi dS # t        $ rH}| j                  d|        ddl}| j                  |j                                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$!#'99&*ll<&@"'!+		
 
 HHSME5zQ05a%(E!HJ
 9ZL9JJsDLL"JE33AFF;%)%5%5e%<N"%e*K"S%88^K=X%&')#1+#>.2ii[	*+N.2ll<.H*/)3	'	
  
 	   		HH|A3'(HHY))+,	 			s)   3D CD 
D 	E"=EE"E"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      si    (
T#"D!0dSj [z}~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	Z X	v z	B	'2772;	
()>>% D	N3txx456
78	 TXXfb%9!: ;
<=xx!$w-"2!345xx!$v,q/!234  r'   