o
    h~/                     @   s   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mZ ddlmZmZ G d	d
 d
ZdS )    N)DictListOptionalAny)datetime)Decimal)logger)ProxyConnector	ProxyType   )P2POrderOrderBookSnapshotc                   @   s   e Zd ZdZd"dee defddZd#d	d
ZdefddZdee	 fddZ
d$dedededededee fddZdeeef dedededef
ddZd%dee dededeeef fddZdee fd d!ZdS )&BinanceP2PClientz>Binance P2P client with demo mode (real P2P API is deprecated)Nhttp	proxy_url
proxy_typec                 C   sh   d| _ || _| | _ddddddddd	d
d
| _| jr2|   td| j  d| 	   dS dS )a  
        Initialize Binance P2P client with optional proxy support
        
        Args:
            proxy_url: Proxy URL in format 'login:password@ip:port' or 'ip:port'
            proxy_type: Proxy type - 'http', 'https', or 'socks5' (default: 'http')
        z;https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/searchz*/*zen-US,en;q=0.9c2c_webwebzapplication/jsonenzhttps://p2p.binance.comzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 )
AcceptzAccept-LanguageC2CType
ClientTypezContent-TypeLangOriginRefererz
User-AgentzX-Passthrough-TokenzConfigured  proxy: N)
base_urlr   lowerr   headers_validate_proxy_configr   infoupper_mask_proxy_url)selfr   r    r%   //home/p2p_binance/src/api/binance_p2p_client.py__init__   s$   
$zBinanceP2PClient.__init__returnc                 C   s   | j sdS g d}| j|vrtd| j d| d| j v r5| j dd\}}d|vs/d|vr3tddS d| j vr>td	dS )
zValidate proxy configurationN)r   httpssocks5zInvalid proxy type 'z'. Must be one of: @   :z<Invalid proxy URL format. Expected: 'login:password@ip:port'zIInvalid proxy URL format. Expected: 'ip:port' or 'login:password@ip:port')r   r   
ValueErrorsplit)r$   valid_types	auth_part	host_partr%   r%   r&   r    0   s   


z'BinanceP2PClient._validate_proxy_configc                 C   sH   | j sdS d| j v r!| j dd\}}|dd }| d| S | j S )z3Mask sensitive credentials in proxy URL for loggingNoner+   r,   r-   r   z:***@)r   r/   )r$   r1   r2   usernamer%   r%   r&   r#   D   s   
z BinanceP2PClient._mask_proxy_urlc              
   C   s   | j sdS zG| jdkrJd| j v r6| j dd\}}|dd\}}|dd\}}ttj|t|||dW S | j dd\}}ttj|t|dW S W dS  ttfyi } zt	
d|  W Y d}~dS d}~ww )	z9Create appropriate proxy connector based on configurationNr*   r+   r,   r-   )r   hostportr4   password)r   r5   r6   z"Failed to create proxy connector: )r   r   r/   r	   r
   SOCKS5intr.   
IndexErrorr   error)r$   r1   r2   r4   r7   r5   r6   er%   r%   r&   _create_proxy_connectorP   s6   

	z(BinanceP2PClient._create_proxy_connectorSELLUSDr,      asset
trade_typefiatpagerowsc                    s  |||||g dddddg ddgd}z|   }d}| jrE| jdv rEd	| jv r/d
| j }nd
| j }td| j  d|    i }	|rW||	d< td|    tjd i |	4 I dH }
t	| j
}d| d| |d< ||tjddd}|r||d< |
j| jfi |4 I dH u}|jdkrtd|j d| I dH   	 W d  I dH  W d  I dH  W dS | I dH }|ddstd|  	 W d  I dH  W d  I dH  W dS | ||||W  d  I dH  W  d  I dH  W S 1 I dH sw   Y  W d  I dH  W dS 1 I dH s%w   Y  W dS  tjyD   td| d| d Y dS  tye } ztd| d| d|  W Y d}~dS d}~ww )!a#  
        Get P2P order book for specified asset
        
        Args:
            asset: Crypto asset (USDT, USDC, BTC, ETH)
            trade_type: SELL or BUY
            fiat: Fiat currency (USD, EUR, etc.)
            page: Page number
            rows: Number of rows per page
        Fallr   Nmass
profession)rC   rD   rE   	tradeTyperA   	countriesproMerchantAdsshieldMerchantAds
filterTypeadditionalKycVerifyFilterpublisherTypepayTypes
classifiesr   r)   r+   http://zUsing r   	connectorzUsing SOCKS5 proxy connector: z+https://p2p.binance.com/trade/all-payments/z?fiat=r   
   total)r   jsontimeoutproxy   zHTTP error : successzAPI returned error: zTimeout fetching  z order bookzError fetching z order book: r%   )r=   r   r   r   r!   r"   r#   aiohttpClientSessiondictr   ClientTimeoutpostr   statusr;   textrX   get_parse_order_bookasyncioTimeoutError	Exception)r$   rA   rB   rC   rD   rE   payloadrT   r   session_kwargssessiondynamic_headersrequest_kwargsresponsedatar<   r%   r%   r&   get_order_bookt   sz   
 


"4zBinanceP2PClient.get_order_bookrq   c           
      C   s  g }| dg D ]u}| di }| di }t| dd| dd| dd| d|| d	|t| d
dt| ddt| ddt| dd| d|dd | dg D | drht| ddndt| dd| ddd}	||	 qt|||t  |dS )z)Parse API response into OrderBookSnapshotrq   adv
advertiseradvNor   userNonickNamerA   fiatUnitpricer   surplusAmountminSingleTransAmountmaxSingleTransAmountrI   c                 S   s   g | ]}| d dqS )	payTypeIdr   )rf   ).0methodr%   r%   r&   
<listcomp>   s    z6BinanceP2PClient._parse_order_book.<locals>.<listcomp>tradeMethodsorderCompleteRatemonthOrderCount
isMerchantF)order_idmerchant_idmerchant_namerA   rC   ry   available_amountmin_single_trans_amountmax_single_trans_amountrB   payment_methodscompletion_rateorders_completedis_merchant)rA   rC   rB   	timestamporders)	rf   r   floatr9   appendr   rh   get_event_looptime)
r$   rq   rA   rB   rC   r   itemrs   rt   orderr%   r%   r&   rg      s8   







z"BinanceP2PClient._parse_order_bookassetsc                    s   g }|D ]}|  |||}|| qtj|ddiI dH }i }t|D ]\}	}
t|
tr<td||	  d|
  q%|
rD|
|||	 < q%|S )z0Get order books for multiple assets concurrentlyreturn_exceptionsTNzFailed to fetch r\   )	rr   r   rh   gather	enumerate
isinstancerj   r   r;   )r$   r   rB   rC   tasksrA   taskresultsorder_booksiresultr%   r%   r&   get_multi_asset_orders   s   
z'BinanceP2PClient.get_multi_asset_ordersc           
   
      s  z|   }d}| jr"| jdv r"d| jv rd| j }nd| j }i }|r*||d< tjdi |4 I dH }dtjddi}|rE||d	< |jdi |4 I dH Q}|jdkr| I dH }|dd}t	
d|  |W  d  I dH  W  d  I dH  W S t	d|j  	 W d  I dH  W d  I dH  W dS 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  ty }	 zt	d|	  W Y d}	~	dS d}	~	ww )z3Check current IP address to verify proxy is workingNrR   r+   rS   rT   rY   rU   rV   rZ   https://httpbin.org/ipr[   originUnknownzCurrent IP address: zFailed to check IP: HTTP zError checking IP address: r%   )r   )r=   r   r   r_   r`   rb   rf   rd   rX   r   r!   r;   rj   )
r$   rT   r   rl   rm   ro   rp   rq   ipr<   r%   r%   r&   check_ip_address   sF   

	2z!BinanceP2PClient.check_ip_address)Nr   )r(   N)r>   r?   r,   r@   )r>   r?   )__name__
__module____qualname____doc__r   strr'   r    r#   r	   r=   r9   r   rr   r   r   rg   r   r   r   r%   r%   r%   r&   r      s    
($&T(#r   )rh   r_   randomrX   typingr   r   r   r   r   decimalr   logurur   aiohttp_socksr	   r
   models.orderr   r   r   r%   r%   r%   r&   <module>   s    