U
    S'h                      @   s   d dl mZmZ d dlmZ d dlmZmZ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mZmZ d dlmZ d d	lmZ d dlZd
ZdZdZd
ZdddZdd Zdd ZdddZdd Zdd Zedgeefdd Z dS )     )api_viewpermission_classes)AllowAny)KeywordGroupsCompetitors)JsonResponseN)settings)ThreadPoolExecutoras_completed)datetime)date z#https://api.scrapingdog.com/google/   	data.jsonc              	   C   sT   t jtj|}t jt j|dd t|ddd}tj	| |dd W 5 Q R X |S )NT)exist_okwzutf-8)encoding   )indent)
ospathjoinr	   
MEDIA_ROOTmakedirsdirnameopenjsondump)datafilename	file_pathZ	json_file r"   J/home/richestsoft/Projects/NewRankTracker/api/serp/keyword_rank_tracker.pysave_json_file   s
    r$   c              
   C   s   zvt | trt| dk rW dS t| dd d}|dd  }|d d }|d	 d }||k r`W d
S ||krnW dS W dS W n4 tk
r } ztt| W Y dS d }~X Y nX d S )N   NAc                 S   s   | d | d | d fS Nyearmonthr   r"   )xr"   r"   r#   <lambda>-       z'get_latest_rank_trend.<locals>.<lambda>)key   rankr   updownsame)
isinstancelistlensorted	Exceptionprintstr)rank_historyZsorted_historyZ
latest_twocurrentpreviouser"   r"   r#   get_latest_rank_trend"   s    
r?   c                 C   s8   i }| D ]"}|d |d |d f}|||< qt | S r'   )r5   values)r;   uniqueentryr-   r"   r"   r#   remove_duplicate_ranks_by_date@   s
    
rC      c           	      C   s  d}t dd}| dd}td|d D ]}zDtj|||dd}|  | }t|d	d
 |d	d
W   S  tjjk
r } z4td| d|  d|  ||k rt	
d|  W 5 d }~X Y q& tk
r } z*td| d|  d|  W Y 
 qW 5 d }~X Y q&X q&d
S )Nz&https://ahrefs2.p.rapidapi.com/trafficzahrefs2.p.rapidapi.com)zx-rapidapi-keyzx-rapidapi-hostexact)urlmoder/   <   )headersparamstimeoutZtrafficMonthlyAvgr   z	[Attempt z] Request failed for z: r%   z] Invalid JSON response for )RAPID_API_KEYrangerequestsgetraise_for_statusr   r9   
exceptionsRequestExceptiontimesleep
ValueError)	site_urlZmax_attemptsrF   rI   rJ   attemptresponser   r>   r"   r"   r#   get_traffic_monthly_avgH   s$    

 rY   c              
   C   s  | j dkrdS tjj| jdjdd t| jd| jddd	}z2t	
 }tjt|d
}|  | }t|d| d| j d d}|dg D ]}d}| j|ddkr|d}	|d}
|	dk	r|
dk	r| j}||j|j|j|	d t|}t|}t|
}tjj| jdj||	|
|d|d tjjt| jdjdd d} qPq|sntjj| jdjdd W nH tk
r } z(tt| tjj| jdjdd W 5 d}~X Y nX dS )z'Process a single keyword ranking check.INITNidSCHDtrack_statusd   r   false)Zapi_keyqueryresultscountrypageZadvance_search)rJ   	jsonData__z.jsonForganic_resultslinkr   r0   )r   r)   r(   r0   COMP)r;   ranknow
ranked_url
rank_trendr_   traffic)fk_group_idTFAIL) r_   r   objectsfilterr\   updateAPI_KEYkeywordisocoder   todayrN   rO   URLrP   r   r$   rV   r;   appenddayr)   r(   rC   r?   rY   r   intro   r8   r9   r:   )ru   group_idrJ   rw   rX   r   foundrB   Zsite_avg_trafficpositionrl   r;   Zrank_trend_nowr>   r"   r"   r#   process_keyword_   sJ    


"r   c                    sP  | j tjjdjdd t|d dkr0dnd}tjjdd	|}|stjjd
d }tjjdd }tjjdjd||d dS t	t
df  fdd|D }t|D ]B}z|  W q tk
r } ztd|  W 5 d}~X Y qX qW 5 Q R X tjjd
d }tjjdd }tjjdjd||d dS )z5Process a single group and its keywords sequentially.r[   r]   r^   r%   r/   created_datez-created_daterZ   )ro   r_   r1   )ro   rm   r2   rj   )r_   uptrend_cntdowntrend_cntN)max_workersc                    s   g | ]}  t|qS r"   )submitr   ).0ru   executorr|   r"   r#   
<listcomp>   s     z!process_group.<locals>.<listcomp>z[Keyword Error] )r\   r   rq   rr   rs   r{   r   order_bycountr
   KEYWORD_THREAD_LIMITr   resultr8   r9   )group
sort_orderkeywordsZuptrend_keywordsZdowntrend_keywordsfuturesfuturer>   r"   r   r#   process_group   s&    ,r   GETc              
   C   s   t jjdd }|sDt jjdd }|rDt jj|jdjdd |sVtdddS zt|| W nP tk
r } z2t	d|j d	|  t jj|jdjd
d W 5 d}~X Y nX tdddS )z;Cron job to process one group at a time using track_status.r]   r^   rZ   r[   truezNo groups to process)statusmessagez[Group Error] z - rp   NzGroup processing completed)
r   rq   rr   firstr\   rs   r   r   r8   r9   )requestr   r   r>   r"   r"   r#   keywordRanker   s    *r   )r   )rD   )!rest_framework.decoratorsr   r   Zrest_framework.permissionsr   Zserp.modelsr   r   r   django.httpr   rN   r   r   django.confr	   concurrent.futuresr
   r   r   r   rS   rt   rx   r   rL   r$   r?   rC   rY   r   r   r   r"   r"   r"   r#   <module>   s0   

3!