U
    ph^                     @   s  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 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reded d    edreded d    dS )    N)	urlencode)BeautifulSoupz..)Spiderc                       s   e Zd Z f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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  ZS )*r   c                    sd   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-originZnavigatez?1Z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__ .   /storage/emulated/0/lz/py/sy/139fm多分类.pyr      sB    
	zSpider.__init__c                 C   s   dS )Nu   139FM有声小说r#   r   r#   r#   r$   getName:   s    zSpider.getName c                 C   s   |pd| _ ddiS )Nr&   classZaudio)extend)r    r(   r#   r#   r$   init=   s    
zSpider.initc                 C   s   t tdt|S )Nz\.(m3u8|mp3|m4a)(\?|$))boolresearchstr)r    urlr#   r#   r$   isVideoFormatA   s    zSpider.isVideoFormatc                 C   s   dS )NFr#   r   r#   r#   r$   manualVideoCheckD   s    zSpider.manualVideoCheckc                 C   s   d S )Nr#   r   r#   r#   r$   destroyG   s    zSpider.destroyc                 C   s   d|  krdkr<n n$t t|td d d td S d|  krPdkrxn n$t t|td d d td S |S dS )u    对单个字符进行ROT13转换az      AZN)chrord)r    charr#   r#   r$   
rot13_charK   s
    $$zSpider.rot13_charc                 C   sb   g }|D ]N}d|  kr dks:n d|  kr6dkrLn n| | | q| | qd|S )u    对字母字符进行ROT13转换r2   r3   r6   r7   r&   )appendr;   join)r    textresultr:   r#   r#   r$   ee2T   s    .z
Spider.ee2c              
   C   sj   z*|  |}t|d}|  |}|W S  tk
rd } z| d|  | W Y S d}~X Y nX dS )u*   主解密函数：ROT13 -> Base64 -> ROT13zutf-8u   解密失败: N)r@   base64	b64decodedecode	Exceptionlog)r    Zencrypted_textdefault_valueZstep1Zstep2Zstep3er#   r#   r$   dd0^   s    

z
Spider.dd0c                 C   s\  d|krd|kr|  d dS |d}|dkrX|||d  }|  d|dd   d	d
ddddg}t|D ]\}}t||tj}|rpzx|d}|  d|d  d|dd   td|}	|	std|}	|  dt|	 d |	r|	ddW   S W qp t	k
rJ }
 z&|  d|d  d|
  W Y qpW 5 d}
~
X Y qpX qp|  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&   )r2   cu   模式u   解析失败: u   所有模式都未找到a数组)
rE   find	enumerater+   r,   DOTALLgroupfindalllenrD   )r    htmlZconf_posZsnippetpatternsipatternZa_matchZarray_contentZstringsrG   r#   r#   r$   extract_conf_from_htmll   s>    

	
"
zSpider.extract_conf_from_htmlc                 C   sR   g }|rNd|krNt |d trN|d D ]&}|r&| ||dd}|| q&|S )u   解密所有配置数据r2   rL   r&   )
isinstancelistrH   getr<   )r    Z	conf_dataresultsZencrypted_strr?   r#   r#   r$   decrypt_all   s    zSpider.decrypt_allc              
   C   s  z0| j  d}| j|| jdd}t|jd}g }|jddd}|r|dD ]2}|d	}|rN|d
krN|||	 
 d qN|jddd}	|	r|	dD ]@}|d	}|r|dkr|| jkr|d| d| d qg }
|jddd}| dt| d |D ]}|jddd}|s*q|dd}|jddd}d}|r|drtd|d}|r|d
d}|jd d!d}d}|r|d}|r|	 
 }|jdd"d}|r|	 
 nd}|r|r|d#d$ }|
||||pd%d& q| d't|
 d( ||
d)W S  tk
r } z8| d*|  d+d,l}| |  g g d) W Y S d,}~X Y nX d,S )-u   首页内容	/podcasts
   r   timeouthtml.parserZdlZareas)idddzdata-valz-1)Ztype_id	type_nameZtagsu   全部anchor_u   主播-divmh-itemZclass_u   找到     个音频项r2   Threfrk   r&   pmh-coverstyleurl\((.*?)\)rJ   '"h2titlechapter/rI      暂无简介vod_idvod_namevod_picvod_remarksu   成功解析 
    个音频)r'   rY   zHome error: r   N)r   fetchr   r   r>   rM   find_allrZ   r<   get_textstripr   rE   rR   r+   r,   rP   splitrD   	traceback
format_exc)r    filterr.   rsoup
categoriesZ	areas_divrc   Zdata_valZtags_dlaudiositemsitema_tagrk   cover_p	cover_urlmatchtitle_h2rr   title_a	chapter_prs   rw   rG   r   r#   r#   r$   homeContent   s    






zSpider.homeContentc              
   C   s`   z|  d}d|dg iW S  tk
rZ } z | d|  dg i W Y S d}~X Y nX dS )u   首页推荐视频FrY   zhomeVideoContent error: N)r   rZ   rD   rE   )r    r?   rG   r#   r#   r$   homeVideoContent   s    
zSpider.homeVideoContentc              
   C   s  z^| j  d}i }|r8|dr8|dd}||d< n|rN|| jkrN||d< |rft|dkrf||d< |r|| dt| }| j|| jd	d
}t|j	d}	g }
|	j
ddd}| dt| d |D ]}|jddd}|sq|dd}|jddd}d}|r6|dr6td|d}|r6|dd}|jddd}d}|rj|d}|rj|  }|jddd}|r|  nd}|r|r|dd }|
||||pdd  q| d!t|
 d" d}|	jdd#d}|r:|j
ddd$D ]<}|dd}td%|}|rt|d}t||}q|
|rJt|nd|d&t|
| d'W S  tk
r } zL| d(|  d)d*l}| |  g |rt|nddd&d)d' W Y S d*}~X Y nX d*S )+u   分类内容r]   re   r&   tagZarearJ   page?r^   r_   ra   rf   rg   rh   u   分类页找到 ri   r2   Trj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   rI   ru   rv   u   分类页成功解析 r{   
pagination)rr   z
page=(\d+)0   )rY   r   	pagecountlimittotalzCategory error: r   N)r   
startswithreplacer   intr   r|   r   r   r>   r}   rE   rR   rM   rZ   r+   r,   rP   r   r~   r   r<   maxrD   r   r   )r    tidpgr   r(   r.   paramsanchorr   r   r   r   r   r   rk   r   r   r   r   rr   r   r   rs   rw   r   r   Zpage_numrG   r   r#   r#   r$   categoryContent  s    



zSpider.categoryContentc           *      C   s  dg i}|D ]}zX| j  d| }| j|| jdd}t|jd}| |j}g }|r| d|  | |}| dt|  |	d}	|	r|	
 d	d
 nd| }
d
}|	dddi}|r|dr|d}|s*|j	dd}|r*|dr*td|d}|r*|dd}g }|jddd}t|D ]\}}|j	ddd}|rl|
  nd|d  d}|j	ddd}|r|
  nd
}|ddk}|dd
}|t|k r|| nd
}||||||d qDtd |j}td!|j}td"|j}td#|j}d$}|rB|dd%d
}d
}|r^|dd&d'}d
} |r| |dd(d
 } d
}!|r| |dd)d
 }!d*}"g }#t|D ]^\}}$|$d+ }%|$d, r|%d-7 }%|$d. }&|&s| d/|$d0  d/| }&|#|% d1|&  qd2|#}'|d ||
d3d
 || |!|rXd4t| dnd
|||"|'d5
 W q tk
r }( zR| d6| d7|(  d8d9l})| |)  |d |d:d
d;t|( d< W 5 d9}(~(X Y qX q|S )=u   详情内容rY   	/podcast/r^   r_   ra   u   找到_conf对象: u   解密后的URL列表数量: rr   z-139FMr&   u   音频_Zimgzdata-amplitude-song-infoZcover_art_urlsrcrm   rh   rn   ro   rJ   rp   rf   songz
song-titleu   第u   集zsong-artistzdata-require-buyr   zdata-chapter-id)nameZartist
requireBuy	chapterIdr.   z"desc":\s*"([^"]*)"z"area":\s*"([^"]*)"z"tag":\s*"([^"]*)"z"clicks":\s*"([^"]*)"ru   u	   简介：u	   热度：u   热度:u	   类型：u	   主播：Z139FMr   r   u   [付费]r.   _r   $#u$   全集免费高清无修在线阅读u   共)
rw   rx   ry   rd   	vod_actorZvod_directorvod_contentrz   Zvod_play_fromZvod_play_urlzDetail error for z: r   Nu   获取失败u   获取详情失败: )rw   rx   ry   r   )r   r|   r   r   r>   rW   rE   r\   rR   rM   r~   r   r   rZ   r+   r,   rP   r}   rN   r<   ZremoveHtmlTagsr=   rD   r   r   r-   )*r    Zidsr?   Zid_r.   r   r   _confdecrypted_urlsZ	title_tagrr   r   Z	cover_imgZ	cover_divr   ZepisodesZsongsindexr   Z	title_divZepisode_titleZ
artist_divZepisode_artistZrequire_buy
chapter_idZ	audio_urlZ
desc_matchZ
area_matchZ	tag_matchZclicks_matchr   rz   rd   r   Z	play_fromZplay_url_partsepZepisode_nameZepisode_urlZplay_urlrG   r   r#   r#   r$   detailContentc  s    


"
"	

zSpider.detailContentr   c              
   C   s  zd|i}|r$t |dkr$||d< | j dt| }| j|| jdd}t|jd}g }|jdd	d
}	| dt	|	 d |	D ]}
|
j
ddd}|sq|dd}|
j
ddd
}d}|r|drtd|d}|r|dd}|
j
ddd
}d}|r |
d}|r |  }|
j
ddd
}|r@|  nd}|r|r|dd }|||||pldd q| dt	| d ||rt |nddt	|d W S  tk
r } zJ| d!|  d"d#l}| |  g |rt |nddd"d  W Y S d#}~X Y nX d#S )$u   搜索内容keywordrJ   r   z/search?r^   r_   ra   rf   rg   rh   u   搜索页找到 ri   r2   Trj   rk   r&   rl   rm   rn   ro   rp   rq   rr   rs   rt   rI   ru   rv   u   搜索页成功解析 r{   )rY   r   r   r   zSearch error: r   N)r   r   r   r|   r   r   r>   r}   rE   rR   rM   rZ   r+   r,   rP   r   r~   r   r<   rD   r   r   )r    keyquickr   r   r.   r   r   r   r   r   r   rk   r   r   r   r   rr   r   r   rs   rw   rG   r   r#   r#   r$   searchContent  sh    

zSpider.searchContentc              
   C   sX  z| dr.dd|| j| jd ddddW S |d	}t|d
kr|d |d |d   }}}| j d| }| j|| jdd}	| |	j}
|
r| |
}t	|}|t|k r|| rdd|| | j d| | jd ddddW S dddi dW S  t
k
rR } z<| d|  ddl}| |  dddi d W Y S d}~X Y nX dS )u   播放内容httpr   r&   r   z*/*zbytes=0-)ZRefererr   r   Range)parseZplayUrlr.   headerr      rJ      r   r^   r_   zPlay error: N)r   r   r   r   rR   r|   rW   r>   r\   r   rD   rE   r   r   )r    flagrb   vipFlagspartsZ
podcast_idr   r   r.   r   r   r   Zaudio_indexrG   r   r#   r#   r$   playerContent&  sX    


zSpider.playerContentc                 C   s   t |S )u   本地代理)dict)r    paramr#   r#   r$   
localProxye  s    zSpider.localProxy)r&   )r&   )r   )__name__
__module____qualname__r   r%   r)   r/   r0   r1   r;   r@   rH   rW   r\   r   r   r   r   r   r   r   __classcell__r#   r#   r!   r$   r      s$   *
	

2
U	]
D?r   __main__zinit:r&   u   
=== 测试首页内容 ===Fu   分类数量: r'   u   首页音频数量: rY   u   第一个分类: u   第一个音频: )r+   sysjsonrA   stringurllib.parser   Zbs4r   pathr<   Zbase.spiderr   Z
BaseSpiderr   spprintr)   r   homerR   rZ   r#   r#   r#   r$   <module>   s0       _


