a
    >xd5                     @   s  d 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Zddl	Z	ddl
Z	ddlm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mZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl&m)Z)m*Z*m+Z+ er&ddlm,Z, e-e.Z/eeZ0e0d Z1g dZ2g dZ3G dd de4Z5de6eedddZ7d e6eedddZ8e9dddZ:ee9 dddZ;dS )!z!Chromium process launcher module.    N)urlopen)URLError)Path)AnyDictListTYPE_CHECKING)__pyppeteer_home__)Browser)
Connection)BrowserError)addEventListener
debugErrorremoveEventListeners)Target)check_chromiumchromium_executable)download_chromium
merge_dictget_free_port)Optionalz.dev_profile)z--disable-background-networkingz%--disable-background-timer-throttlingz--disable-breakpadz!--disable-browser-side-navigationz(--disable-client-side-phishing-detectionz--disable-default-appsz--disable-dev-shm-usagez--disable-extensionsz#--disable-features=site-per-processz--disable-hang-monitorz--disable-popup-blockingz--disable-prompt-on-repostz--disable-syncz--disable-translatez--metrics-recording-onlyz--no-first-runz"--safebrowsing-disable-auto-update)z--enable-automationz--password-store=basicz--use-mock-keychainc                   @   s   e Zd ZdZdeeef eddddZddddZddd	d
Z	e
dddZe
ddddZedddZddddZddddZdS )LauncherzChrome process launcher class.Noptionskwargsreturnc                    s  t || _t  _d j  _g  _ jdt  _	 jd}|r\t
d|  jdds jt  jd j  d _ jd	drd jd
< n jddsĈ jt d _    jdr jd d jd
< d
 jvs jd
r jg d td fdd} jdsft jdtrf| rf jd d jv r jd  _nt st  tt  _ jg j  _dS )zMake new launcher.zhttp://127.0.0.1:looplogLevel	pyppeteerZignoreDefaultArgsFz--remote-debugging-port=TappModeZheadlessNZdevtoolsz--auto-open-devtools-for-tabs)z
--headlessz--disable-gpuz--hide-scrollbarsz--mute-audior   c                     s$    j d D ]} | ds
 dS q
dS )Nargs-FT)r   
startswith)argself J/var/www/html/Ranjet/env/lib/python3.9/site-packages/pyppeteer/launcher.py_is_default_urln   s    
z*Launcher.__init__.<locals>._is_default_urlr!   zabout:blankexecutablePath)r   r   r   porturlchrome_argsgetasyncioget_event_loop_looplogging	getLoggersetLevelextendDEFAULT_ARGSappendchromeClosedAUTOMATION_ARGS_tmp_user_data_dir_parse_argsbool
isinstancelistexecr   r   strr   cmd)r&   r   r   r   r)   r'   r%   r(   __init__F   sL    

zLauncher.__init__r    c                 C   s   t | jdtr*tdd | jd D sxd| jvrZt sHtjdd tj	t
td| _| jd| jd| j t | jdtr| j| jd  d S )	Nr!   c                 s   s   | ]}| d r|V  qdS )z--user-data-dirN)r#   ).0optr'   r'   r(   	<genexpr>   s   
z'Launcher._parse_args.<locals>.<genexpr>ZuserDataDirT)parents)dirz--user-data-dir={})r=   r   r.   r>   anyCHROME_PROFILE_PATHexistsmkdirtempfilemkdtempr@   r:   r-   r7   formatr5   r%   r'   r'   r(   r;      s    

zLauncher._parse_argsc                 C   s\   t dD ]F}| jrJtj| jrJtj| jdd tj| jrNtd q qXqt	dd S )Nd   T)ignore_errorsg{Gz?z$Unable to remove Temporary User Data)
ranger:   ospathrJ   shutilrmtreetimesleepIOError)r&   retryr'   r'   r(   _cleanup_tmp_user_data_dir   s    z#Launcher._cleanup_tmp_user_data_dirc                    sx  d _ d _t } jd|d<  jdsBtj|d< tj|d< tj j	fi | _
ttdd fdd	} jd
drt|  jddrttj|  jddrttj| tjds jddrttj|  jdd}   _td j  t j j| _t jdd} jdd }t jg || j
 jI dH } |I dH  |S )z1Start chrome process and return `Browser` object.FNenvZdumpiostdoutstderr)r!   r   r   c                     s    j s j   d S )N)r8   r1   run_until_complete
killChrome)r!   r   r%   r'   r(   _close_process   s    z'Launcher.launch.<locals>._close_processZ	autoCloseTZhandleSIGINTZhandleSIGTERMwinZhandleSIGHUPslowMor   zBrowser listening on: ignoreHTTPSErrorsr   ) r8   
connectiondictr   r.   
subprocessPIPESTDOUTPopenrA   procr   atexitregistersignalSIGINTSIGTERMsysplatformr#   SIGHUP_get_ws_endpointbrowserWSEndpointloggerinfor   r1   r<   r
   creater_   ensureInitialPage)r&   r   r`   connectionDelayrc   ZsetDefaultViewportbrowserr'   r%   r(   launch   sH    






zLauncher.launch)rz   r   c                    sr   |  D ]}|jdkr dS q| j ddfdd tdd fdd}t|d	|g}I dH  t| dS )
z+Wait for initial page target to be created.pageNr    c                      s     d d S )NT)
set_resultr'   )initialPagePromiser'   r(   initialPageCallback   s    z7Launcher.ensureInitialPage.<locals>.initialPageCallback)targetr   c                    s   | j dkr   d S )Nr|   )type)r   )r   r'   r(   check_target   s    
z0Launcher.ensureInitialPage.<locals>.check_targetZtargetcreated)targetsr   r1   create_futurer   r   r   )r&   rz   r   r   Z	listenersr'   )r   r~   r(   rx      s    


zLauncher.ensureInitialPagec              
   C   s   | j d }| j d u rtd zBt|"}t| 	 }W d    n1 sT0    Y  W qW q
 t
y } zW Y d }~q
W Y d }~q
d }~0 0 q
td| jj 	 |d S )Nz/json/versiong?zBrowser closed unexpectedly:
{}ZwebSocketDebuggerUrl)r,   rj   pollrV   rW   r   jsonloadsreaddecoder   r   rN   r\   )r&   r,   fdataer'   r'   r(   rs      s    


0$zLauncher._get_ws_endpointc                 C   sJ   | j  du rF| jsFd| _z| j   | j   W n tyD   Y n0 dS )zTerminate chrome.NT)rj   r   r8   	terminatewait	Exceptionr%   r'   r'   r(   waitForChromeToClose   s    
zLauncher.waitForChromeToClosec              
      s   t d | jrn| jjrnz&| jdI dH  | j I dH  W n. tyl } ztt | W Y d}~n
d}~0 0 | jrt	j
| jr|   |   dS )zTerminate chromium process.zterminate chrome process...Browser.closeN)ru   rv   rd   
_connectedsendZdisposer   r   r:   rR   rS   rJ   r   rZ   )r&   r   r'   r'   r(   r_      s    
 zLauncher.killChrome)N)__name__
__module____qualname____doc__r   r@   r   rB   r;   rZ   r
   r{   rx   rs   r   r_   r'   r'   r'   r(   r   C   s   <-r   r   c                    s   t | fi | I dH S )a  Start chrome process and return :class:`~pyppeteer.browser.Browser`.

    This function is a shortcut to :meth:`Launcher(options, **kwargs).launch`.

    Available options are:

    * ``ignoreHTTPSErrors`` (bool): Whether to ignore HTTPS errors. Defaults to
      ``False``.
    * ``headless`` (bool): Whether to run browser in headless mode. Defaults to
      ``True`` unless ``appMode`` or ``devtools`` options is ``True``.
    * ``executablePath`` (str): Path to a Chromium or Chrome executable to run
      instead of default bundled Chromium.
    * ``slowMo`` (int|float): Slow down pyppeteer operations by the specified
      amount of milliseconds.
    * ``args`` (List[str]): Additional arguments (flags) to pass to the browser
      process.
    * ``ignoreDefaultArgs`` (bool): Do not use pyppeteer's default args. This
      is dangerous option; use with care.
    * ``handleSIGINT`` (bool): Close the browser process on Ctrl+C. Defaults to
      ``True``.
    * ``handleSIGTERM`` (bool): Close the browser process on SIGTERM. Defaults
      to ``True``.
    * ``handleSIGHUP`` (bool): Close the browser process on SIGHUP. Defaults to
      ``True``.
    * ``dumpio`` (bool): Whether to pipe the browser process stdout and stderr
      into ``process.stdout`` and ``process.stderr``. Defaults to ``False``.
    * ``userDataDir`` (str): Path to a user data directory.
    * ``env`` (dict): Specify environment variables that will be visible to the
      browser. Defaults to same as python process.
    * ``devtools`` (bool): Whether to auto-open a DevTools panel for each tab.
      If this option is ``True``, the ``headless`` option will be set
      ``False``.
    * ``logLevel`` (int|str): Log level to print logs. Defaults to same as the
      root logger.
    * ``autoClose`` (bool): Automatically close browser process when script
      completed. Defaults to ``True``.
    * ``loop`` (asyncio.AbstractEventLoop): Event loop (**experimental**).
    * ``appMode`` (bool): Deprecated.

    .. note::
        Pyppeteer can also be used to control the Chrome browser, but it works
        best with the version of Chromium it is bundled with. There is no
        guarantee it will work with any other version. Use ``executablePath``
        option with extreme caution.
    N)r   r{   )r   r   r'   r'   r(   r{   	  s    .r{   c              
      s   t | |} | d}|r(td| | d}|s>td| dd}t|| dt |  	dI d	H d
g }t
| dd}t ||dd	 fddI d	H S )a  Connect to the existing chrome.

    ``browserWSEndpoint`` option is necessary to connect to the chrome. The
    format is ``ws://${host}:${port}/devtools/browser/<id>``. This value can
    get by :attr:`~pyppeteer.browser.Browser.wsEndpoint`.

    Available options are:

    * ``browserWSEndpoint`` (str): A browser websocket endpoint to connect to.
      (**required**)
    * ``ignoreHTTPSErrors`` (bool): Whether to ignore HTTPS errors. Defaults to
      ``False``.
    * ``slowMo`` (int|float): Slow down pyppeteer's by the specified amount of
      milliseconds.
    * ``logLevel`` (int|str): Log level to print logs. Defaults to same as the
      root logger.
    * ``loop`` (asyncio.AbstractEventLoop): Event loop (**experimental**).
    r   r   rt   z Need `browserWSEndpoint` option.rb   r   r   zTarget.getBrowserContextsNbrowserContextIdsrc   FTc                      s
     dS )Nr   )r   r'   rd   r'   r(   <lambda>^      zconnect.<locals>.<lambda>)r   r.   r2   r3   r4   r   r   r/   r0   r   r<   r
   rw   )r   r   r   rt   ry   r   rc   r'   r   r(   connect:  s(    




r   r    c                   C   s
   t t S )z&Get executable path of default chrome.)r@   r   r'   r'   r'   r(   r*   a  s    r*   c                   C   s   t t S )z Get list of default chrome args.)r6   r9   r'   r'   r'   r(   defaultArgsf  s    r   )N)N)<r   r/   rk   r   urllib.requestr   urllib.errorr   r2   rR   os.pathpathlibr   rT   rm   rf   rp   rL   rV   typingr   r   r   r   r   r	   Zpyppeteer.browserr
   Zpyppeteer.connectionr   Zpyppeteer.errorsr   Zpyppeteer.helperr   r   r   Zpyppeteer.targetr   Zpyppeteer.utilr   r   r   r   r   r   r3   r   ru   Zpyppeteer_homerI   r6   r9   objectr   re   r{   r   r@   r*   r   r'   r'   r'   r(   <module>   sJ   
 G1'