o
    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re Zed	ed
 ed edZedeedg   edeedg   edrveded d    edreded d    dS dS 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-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__ .   /storage/emulated/0/lz/py/sy/139fm多分类.pyr      sB   
	zSpider.__init__c                 C      dS )Nu   139FM有声小说r%   r!   r%   r%   r&   getName:      zSpider.getName c                 C   s   |pd| _ ddiS )Nr*   class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   r'   )NFr%   r!   r%   r%   r&   manualVideoCheckD   r)   zSpider.manualVideoCheckc                 C   s   d S )Nr%   r!   r%   r%   r&   destroyG   r)   zSpider.destroyc                 C   s~   d|  kr
dkrn nt t|td d d td S d|  kr(dkr=n |S t t|td d d td S |S )u    对单个字符进行ROT13转换az      AZ)chrord)r"   charr%   r%   r&   
rot13_charK   s   $$zSpider.rot13_charc                 C   sb   g }|D ]'}d|  krdksn d|  krdkr&n n	| | | q| | qd|S )u    对字母字符进行ROT13转换r7   r8   r;   r<   r*   )appendr@   join)r"   textresultr?   r%   r%   r&   ee2T   s   .
z
Spider.ee2c              
   C   sd   z|  |}t|d}|  |}|W S  ty1 } z| d|  |W  Y d}~S d}~ww )u*   主解密函数：ROT13 -> Base64 -> ROT13zutf-8u   解密失败: N)rE   base64	b64decodedecode	Exceptionlog)r"   Zencrypted_textdefault_valueZstep1Zstep2Zstep3er%   r%   r&   dd0^   s   

z
Spider.dd0c                 C   sJ  d|vrd|vr|  d dS |d}|dkr,|||d  }|  d|dd   g d	}t|D ]i\}}t||tj}|rz;|d
}|  d|d
  d|dd   td|}	|	sgtd|}	|  dt|	 d |	r||	ddW   S W q4 t	y }
 z|  d|d
  d|
  W Y d}
~
q4d}
~
ww q4|  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*   )r7   cu   模式u   解析失败: u   所有模式都未找到a数组)
rJ   find	enumerater0   r1   DOTALLgroupfindalllenrI   )r"   htmlZconf_posZsnippetpatternsipatternZa_matchZarray_contentstringsrL   r%   r%   r&   extract_conf_from_htmll   s:   

	
"
zSpider.extract_conf_from_htmlc                 C   sR   g }|r'd|v r't |d tr'|d D ]}|r&| ||dd}|| q|S )u   解密所有配置数据r7   rQ   r*   )
isinstancelistrM   getrA   )r"   Z	conf_dataresultsZencrypted_strrD   r%   r%   r&   decrypt_all   s   
zSpider.decrypt_allc              
   C   sp  z| j  d}| j|| jdd}t|jd}g }|jddd}|rA|dD ]}|d	}|r@|d
kr@|||	 
 d q'|jddd}	|	rp|	dD ] }|d	}|ro|dkro|| jv ro|d| d| d qOg }
|jddd}| dt| d |D ]u}|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$ }|
||||pd%d& q| d't|
 d( ||
d)W S  ty7 } z| d*|  d+d,l}| |  g g d)W  Y d,}~S d,}~ww )-u   首页内容	/podcasts
   r   timeouthtml.parserdlZareas)idddzdata-valz-1)type_id	type_nametagsu   全部anchor_u   主播-divmh-itemclass_u   找到     个音频项r7   Threfru   r*   pmh-coverstyleurl\((.*?)\)rO   '"h2titlechapter/rN      暂无简介vod_idvod_namevod_picvod_remarksu   成功解析 
    个音频)r+   r_   zHome error: r   N)r   fetchr   r   rC   rR   find_allr`   rA   get_textstripr    rJ   rW   r0   r1   rU   splitrI   	traceback
format_exc)r"   filterr3   rsoup
categoriesZ	areas_divrj   Zdata_valZtags_dlaudiositemsitema_tagru   cover_p	cover_urlmatchtitle_h2r|   title_a	chapter_pr}   r   rL   r   r%   r%   r&   homeContent   s   



zSpider.homeContentc              
   C   sZ   z|  d}d|dg iW S  ty, } z| d|  dg iW  Y d}~S d}~ww )u   首页推荐视频Fr_   zhomeVideoContent error: N)r   r`   rI   rJ   )r"   rD   rL   r%   r%   r&   homeVideoContent   s   
zSpider.homeVideoContentc              
   C   s  z'| j  d}i }|r|dr|dd}||d< n|r'|| jv r'||d< |r3t|dkr3||d< |r>| dt| }| j|| jd	d
}t|j	d}	g }
|	j
ddd}| dt| d |D ]u}|jddd}|soqc|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 }|
||||pdd  qc| d!t|
 d" d}|	jdd#d}|r|j
ddd$D ]}|dd}td%|}|rt|d}t||}q|
|rt|nd|d&t|
| d'W S  ty] } z(| d(|  d)d*l}| |  g |rLt|nddd&d)d'W  Y d*}~S d*}~ww )+u   分类内容rc   rn   r*   tagarearO   page?rd   re   rg   ro   rp   rq   u   分类页找到 rs   r7   Trt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   rN   r   r   u   分类页成功解析 r   
pagination)r|   z
page=(\d+)0   )r_   r   	pagecountlimittotalzCategory error: r   N)r   
startswithreplacer   intr   r   r   r   rC   r   rJ   rW   rR   r`   r0   r1   rU   r   r   r   rA   maxrI   r   r   )r"   tidpgr   r-   r3   paramsanchorr   r   r   r   r   r   ru   r   r   r   r   r|   r   r   r}   r   r   r   page_numrL   r   r%   r%   r&   categoryContent  s   



zSpider.categoryContentc           *      C   s  dg i}|D ]}z| j  d| }| j|| jdd}t|jd}| |j}g }|rC| d|  | |}| dt|  |	d}	|	rT|	
 d	d
 nd| }
d
}|	dddi}|ro|dro|d}|s|j	dd}|r|drtd|d}|r|dd}g }|jddd}t|D ]P\}}|j	ddd}|r|
  nd|d  d}|j	ddd}|r|
  nd
}|ddk}|dd
}|t|k r|| nd
}||||||d qtd |j}td!|j}td"|j}td#|j}d$}|r|dd%d
}d
}|r'|dd&d'}d
} |r:| |dd(d
 } d
}!|rM| |dd)d
 }!d*}"g }#t|D ]/\}}$|$d+ }%|$d, rf|%d-7 }%|$d. }&|&sy| d/|$d0  d/| }&|#|% d1|&  qUd2|#}'|d ||
d3d
 || |!|rd4t| dnd
|||"|'d5
 W q ty }( z-| d6| d7|(  d8d9l})| |)  |d |d:d
d;t|( d< W Y d9}(~(qd9}(~(ww |S )=u   详情内容r_   	/podcast/rd   re   rg   u   找到_conf对象: u   解密后的URL列表数量: r|   z-139FMr*   u   音频_imgzdata-amplitude-song-infoZcover_art_urlsrcrw   rq   rx   ry   rO   rz   ro   songz
song-titleu   第u   集zsong-artistzdata-require-buyr   zdata-chapter-id)nameZartist
requireBuy	chapterIdr3   z"desc":\s*"([^"]*)"z"area":\s*"([^"]*)"z"tag":\s*"([^"]*)"z"clicks":\s*"([^"]*)"r   u	   简介：u	   热度：u   热度:u	   类型：u	   主播：Z139FMr   r   u   [付费]r3   _r   $#u$   全集免费高清无修在线阅读u   共)
r   r   r   rl   	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   rC   r]   rJ   rb   rW   rR   r   r   r   r`   r0   r1   rU   r   rS   rA   removeHtmlTagsrB   rI   r   r   r2   )*r"   idsrD   Zid_r3   r   r   _confdecrypted_urlsZ	title_tagr|   r   Z	cover_imgZ	cover_divr   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   r   rl   r   	play_fromZplay_url_partsepZepisode_nameZepisode_urlplay_urlrL   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 ]u}
|
j
ddd}|sLq@|dd}|
j
ddd
}d}|ru|drutd|d}|ru|dd}|
j
ddd
}d}|r|
d}|r|  }|
j
ddd
}|r|  nd}|r|r|dd }|||||pdd q@| dt	| d ||rt |nddt	|d W S  ty } z&| d!|  d"d#l}| |  g |rt |nddd"d W  Y d#}~S d#}~ww )$u   搜索内容keywordrO   r   z/search?rd   re   rg   ro   rp   rq   u   搜索页找到 rs   r7   Trt   ru   r*   rv   rw   rx   ry   rz   r{   r|   r}   r~   rN   r   r   u   搜索页成功解析 r   )r_   r   r   r   zSearch error: r   N)r   r   r   r   r   r   rC   r   rJ   rW   rR   r`   r0   r1   rU   r   r   r   rA   rI   r   r   )r"   keyquickr   r   r3   r   r   r   r   r   r   ru   r   r   r   r   r|   r   r   r}   r   rL   r   r%   r%   r&   searchContent  sn   
zSpider.searchContentc              
   C   sP  z{| drdd|| j| jd ddddW S |d	}t|d
krt|d |d |d }}}| j d| }| j|| jdd}	| |	j}
|
rt| |
}t	|}|t|k rt|| rtdd|| | j d| | jd ddddW S dddi dW S  t
y } z | d|  ddl}| |  dddi dW  Y d}~S d}~ww )u   播放内容httpr   r*   r   z*/*zbytes=0-)Refererr   r	   Range)parseplayUrlr3   headerr      rO      r   rd   re   zPlay error: N)r   r   r   r   rW   r   r]   rC   rb   r   rI   rJ   r   r   )r"   flagri   vipFlagspartsZ
podcast_idr   r   r3   r   r   r   Zaudio_indexrL   r   r%   r%   r&   playerContent&  s\   


zSpider.playerContentc                 C   s   t |S )u   本地代理)dict)r"   paramr%   r%   r&   
localProxye  s   zSpider.localProxy)r*   )r   )__name__
__module____qualname__r   r(   r.   r4   r5   r6   r@   rE   rM   r]   rb   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   首页音频数量: r_   u   第一个分类: u   第一个音频: )r0   sysjsonrF   stringurllib.parser   bs4r   pathrA   base.spiderr   Z
BaseSpiderr   spprintr.   r   homerW   r`   r%   r%   r%   r&   <module>   s6       _


	