
    ƇrhY                         d dl 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 ej        ej                    ej	        e
          Z G d d          ZdS )    N)datetime)levelc                   d    e Zd Zd Zd ZddZddZd Zd	 Zdd
Z	d Z
d Zd Zd Zd ZddZdS )AliExpressAPIParserc                 0    || _         || _        d| _        d S )Nz"https://api-sg.aliexpress.com/sync)app_key
app_secretapi_url)selfr   r	   s      K/var/www/html/mycamper/aliexpress-site/backend/api/aliexpress_api_parser.py__init__zAliExpressAPIParser.__init__   s    $;    c                 "   t          |                                          }| j        }|D ]\  }}|| | z  }|| j        z  }t          j        |                    d                                                                                    }|S )u;   Генерация подписи для API запросаzutf-8)sorteditemsr	   hashlibmd5encode	hexdigestupper)r   paramssorted_paramssign_strkeyvalue	signatures          r   generate_signaturez&AliExpressAPIParser.generate_signature   s    v||~~..?' 	( 	(JC3'HHDO#K 8 899CCEEKKMM	r   Nc           	      H   |i }|                     | j        |t          t          j                    dz            dddd           |                     |          |d<   	 t          d|            t          j        | j        |d	
          }|	                                 |
                                }t          d|j                    d|v r|d         }t          d|            dS |S # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)u'   Выполнение API запросаNi  jsonz2.0r   )r   method	timestampformatvsign_methodsignu   🌐 Запрос к API:    )datatimeoutu   📊 HTTP статус: error_responseu   ❌ Ошибка API: u!   ❌ Ошибка запроса: )updater   inttimer   printrequestspostr
   raise_for_statusr   status_code	Exceptionloggererror)r   r    r   responseresult
error_infoes          r   make_api_requestz$AliExpressAPIParser.make_api_request   sW   >F|TY[[4/00 
 
 	 	 	 0088v	7v77888}T\KKKH%%''']]__FCX-ACCDDD6))#$45
;z;;<<<tM 	 	 	LL@Q@@AAA44444	s    BC/ -C/ /
D!9DD!      c           	      &   g d}|D ]}	 t          d|            |dk    r|||dd}n|dk    r|||dd}n|||d}|                     ||          }|ryd	|vrut          d
| d           t          dt          j        |dd                      |                     |          }|r#t          dt          |                      |c S nt          d| d           # t          $ r }	t          d| d|	            Y d}	~	d}	~	ww xY wg S )u1   Поиск товаров через Dropship API)aliexpress.ds.product.searchzaliexpress.ds.product.getzAaliexpress.postproduct.redefining.findaeproductbyidfordropshipper$aliexpress.solution.product.list.getu)   🔧 Пробуем Dropship метод: r=   	salesDesc)keywordspage_no	page_sizesortr>   )r@   current_pagerB   rC   )r@   rA   rB   r)   u   ✅ Метод u    работает!u   📥 Ответ:    F)indentensure_asciiu#   ✅ Найдено товаров: u   ❌ Метод u    не работаетu   ❌ Ошибка метода : N)r-   r9   r   dumps'extract_products_from_dropship_responselenr2   )
r   r@   rA   rB   methods_to_tryr    r   r6   productsr8   s
             r   search_products_dropshipz,AliExpressAPIParser.search_products_dropshipB   s   
 
 
 % *	 *	F)J&JJKKK ;;;$,#*%. +	 FF EEE$,(/%. +	 FF %-#*%. F ..vv>> 
L.f<<FFFFFGGG`djX].^.^.^``aaa  $KKFSSH (SCMMSSTTT'( JFJJJKKK   DvDDDDEEE 	s   CC$C$$
D.D		Dc                 H   g }t          |                                          }|D ]}|                    d          r||         }t          |t                    rd|v r|d         }|rvd|v rr|d         }d|v rB|d         }t          |t                    rd|v r	|d         }nat          |t                     r|}nId|v r	|d         }n<t          |t                     r|}n$d|v r	|d         }nt          |t                     r|}|rt          |t                     r|n|gc S g S )uB   Извлечение товаров из ответа Dropship API	_responseresp_resultr6   rM   productaeop_ae_product_s_k_u_s)listkeysendswith
isinstancedict)	r   r6   rM   response_keysr   response_datarQ   result_dataproducts_datas	            r   rJ   z;AliExpressAPIParser.extract_products_from_dropship_response{   sw    V[[]]++  "	V "	VC||K(( !V &smT22 V$55&3M&B& 78{+B+B*5h*?K  *[880;J0G#-mT#B#B !=yTaGaGa/<Y/GHH%/t%D%D !=/<H!:k!I!I+67P+Q!+K!>!> 7+6#}44#0#<#M488 1#0 V+5h+E+EUxxH:UUU	r   c                 >   ddddddddd	d
dddddddd	gddddddddd	ddddddd d!d	gd"d#d$d%d&d'd(d)d	gd*d+d,d-d.d/d0d1d	gd2}g }|                                 }|                                D ]N\  }}||v rEt          j        |t	          d3t          |                              }|                    |           O|s^g }|                                D ]}|                    |           t          j        |t	          d4t          |                              }|S )5uW   Получение примеров товаров (если API не работает)1005003718234567uz   Портативная солнечная панель 100W монокристаллическая для кемпингаz89.99z129.99z5https://www.aliexpress.com/item/1005003718234567.htmlz?https://ae01.alicdn.com/kf/S8a5e6f9c4d2b1a8e5f2a3b4c5d6e7f8.jpgz4.51250)
product_idproduct_titletarget_sale_pricetarget_original_priceproduct_detail_urlproduct_main_image_urlevaluate_ratevolume1005004521987654uV   Складная солнечная панель 200W с контроллером MPPTz159.99z229.99z5https://www.aliexpress.com/item/1005004521987654.htmlz?https://ae01.alicdn.com/kf/S9b6f7e8d5c3a2b9f6e3a4b5c6d7e8f9.jpgz4.78901005004123456789uH   Литиевая батарея LiFePO4 12V 100Ah для RV кемперz199.99z299.99z5https://www.aliexpress.com/item/1005004123456789.htmlz?https://ae01.alicdn.com/kf/Sc7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f.jpgz4.621001005005987654321uB   Портативный Power Bank 50000mAh для кемпингаz79.99z119.99z5https://www.aliexpress.com/item/1005005987654321.htmlz?https://ae01.alicdn.com/kf/Sd8e9f0a1b2c3d4e5f6a7b8c9d0e1f2g.jpgz4.415671005006789012345uf   Портативная газовая плита с пьезоподжигом для кемпингаz35.99z49.99z5https://www.aliexpress.com/item/1005006789012345.htmlz?https://ae01.alicdn.com/kf/Se9f0a1b2c3d4e5f6a7b8c9d0e1f2g3h.jpgz4.332501005007890123456uU   Надувной матрас для кемпинга с подушкой 200x140смz45.99z65.99z5https://www.aliexpress.com/item/1005007890123456.htmlz?https://ae01.alicdn.com/kf/Sf0a1b2c3d4e5f6a7b8c9d0e1f2g3h4i.jpgz4.21890)solarbatterystovemattressrE      )lowerr   randomsampleminrK   extendvalues)	r   querysample_productsrM   query_lowercategoryr   selected_items	all_itemss	            r   get_sample_productsz'AliExpressAPIParser.get_sample_products   s    #5 &b)0-5*a.o%*$	 	 #5%})1-5*a.o%*#	 	0 #5%o)1-5*a.o%*$	 	 #5%i)0-5*a.o%*$	 	0 #5 &N)0-4*a.o%*$	 	 #5%|)0-4*a.o%*$	 	sE
 E
P kkmm.4466 	0 	0OHe;&&!'uc!SZZ6H6H!I!I///  	HI(//11 ( (  ''''}YAs9~~0F0FGGHr   c                     t                               d|            |                     |||          }|s$t          d           |                     |          }|S )u7   Основной метод поиска товаровu    🔍 Поиск товаров: uX   ⚠️ Dropship API не вернул товары. Используем примеры.)r3   inforN   r-   r   )r   r@   rA   rB   rM   s        r   search_productsz#AliExpressAPIParser.search_products  se    AxAABBB 007INN 	:mnnn//99Hr   c                     |sdS d|v r|                     dd          }nd|v r|                     dd          }|                    d          rd|z   }|S )u)   Очистка URL изображенияN_640x640_800x800_480x480z//zhttps:)replace
startswith)r   	image_urls     r   clean_image_urlz#AliExpressAPIParser.clean_image_url  sw     	4""!))*jAAII9$$!))*jAAI%% 	- 9,Ir   c                    |                                 |                                 t          fddD                       rdS t          fddD                       rdS t          fddD                       rd	S t          fd
dD                       rdS t          fddD                       rdS t          fddD                       rdS dS )u6   Определение категории товараc              3   (   K   | ]}|v p|v V  d S N .0wordr   title_lowers     r   	<genexpr>z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>'  sJ       Z Zdt{"9dk&9 Z Z Z Z Z Zr   )rr   rs   chargerinverterledpower
electronicelectronicsc              3   (   K   | ]}|v p|v V  d S r   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>*  sJ       S S$;(; S S S S S Sr   )rt   cookingkitchenpotpanfridgecoolerr   c              3   (   K   | ]}|v p|v V  d S r   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>-  sJ       N N$;(; N N N N N Nr   )ru   pillowchairtabletentsleepingcomfortc              3   (   K   | ]}|v p|v V  d S r   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>0  J       A A$;(; A A A A A Ar   )toolpump
compressorkitrepairtoolsc              3   (   K   | ]}|v p|v V  d S r   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>3  sJ       G G$;(; G G G G G Gr   )safetyalarmlock	emergencyz	first aidr   c              3   (   K   | ]}|v p|v V  d S r   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>6  r   r   )waterfilterr   showertoiletr   other)rw   any)r   titler}   r   r   s      @@r   categorize_productz&AliExpressAPIParser.categorize_product"  s   kkmmkkmm Z Z Z Z ZXZ Z Z Z Z 	 = S S S S SQS S S S S 	9 N N N N NLN N N N N 	9 A A A A A?A A A A A 
	7 G G G G GEG G G G G 	8 A A A A A?A A A A A 	77r   c                 J   |                     dd          }|                     dd          }| d}|rt          |          dk    r|dz  }n|rt          |          dk    r|d	z  }d
|                                v r|dz  }nd|                                v r|dz  }|dz  }|S )u0   Генерация описания товараra    rf   r   z.    uR   Высокооцененный товар с отличными отзывами. rv   uF   Популярный товар с хорошими отзывами. campingu_   Идеально подходит для кемпинга и отдыха на природе. caruO   Отличное решение для автомобиля и поездок. uc   Качественный товар от проверенного продавца на AliExpress.)getfloatrw   )r   rR   r}   r   ratingdescriptions         r   generate_descriptionz(AliExpressAPIParser.generate_description<  s    OR00_a00lll 	deFmma''ooKK 	df))ccK%%||KKekkmm##llK||r   c                    	 |                     d          }|                     dd          }t          |                     dd                    }t          |                     dd                    }|                     dd          }|                     dd          }t          |                     d	d                    }	t          |                     d
d                    }
g }|r,|                     |          }|r|                    |           |                     ||          }||||k    r|nd|||||	|
t          |          |                     ||          |	r|	 dnd|
rt          |
          ndt          |          dd}|S # t          $ r(}t          
                    d|            Y d}~dS d}~ww xY w)u4   Обработка отдельного товараr`   ra   r   rb   r   rc   rd   re   rf   rg   Nz/5u   Нет рейтингаu   Нет данных)u   Рейтингu#   Количество заказовu   ID товара)r   priceoriginal_pricealiexpress_linkepn_linkimagesr   r   orders_countexternal_product_idai_descriptionspecifications2   ❌ Ошибка обработки товара: )r   r   r+   r   appendr   strr   r2   r3   r4   )r   rR   r}   r`   r   r   r   
detail_url
main_imager   rg   r   clean_imager   processed_productr8   s                   r   process_productz#AliExpressAPIParser.process_productQ  s   )	 \22JKK44E'++&91==>>E"7;;/F#J#JKKN %92>>J %=rBBJ7;;::;;FXq1122FF /"22:>> /MM+.....ue<<H 4BU4J4J..PT#-& $  &'*:"&";";GU"K"K7=&\mmmmC\JP;k3v;;;Vk'*:# #! !& %$ 	 	 	LLQaQQRRR44444	s   FF 
G F;;G c                    	 ddl }ddl}|j                            |j                            |j                            t                                         ddlm}  |            }|	                                }d}|D ]}	 |
                    d|d         |d         f           |                                r$t                              d|d                     `|
                    d	|d         |d
         |d         |                    d          |d         |d         |                    d          |                    dd          |                    dd          |d         dt          j                    t          j                    t#          j        |                    di                     f           |                                d         }	t'          |                    dg                     D ],\  }
}|r%|
                    d|	||
dk    |
d|
dz    f           -|dz  }t                              d|d                     # t(          $ r(}t                              d|            Y d}~d}~ww xY w|                                 |                                 |                                 |S # t(          $ r(}t                              d|            Y d}~dS d}~ww xY w)u<   Сохранение товаров в базу данныхr   N)get_db_connectionz
                        SELECT id FROM products 
                        WHERE aliexpress_link = %s OR external_product_id = %s
                    r   r   u/   ⚠️ Товар уже существует: r   a  
                        INSERT INTO products (
                            title, ai_description, price, original_price, 
                            category, aliexpress_link, epn_link, rating, orders_count,
                            external_product_id, status, created_at, updated_at,
                            specifications
                        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                        RETURNING id
                    r   r   r   r   r   r   r   activer   r   z
                                INSERT INTO product_images (
                                    product_id, image_url, is_main, sort_order, alt_text
                                ) VALUES (%s, %s, %s, %s, %s)
                            u   Изображение r:   u!   ✅ Сохранен товар: u4   ❌ Ошибка сохранения товара: u/   ❌ Ошибка сохранения в БД: )sysospathr   dirnameabspath__file__serverr   cursorexecutefetchoner3   r   r   r   nowr   rI   	enumerater2   r4   commitclose)r   rM   r   r   r   connr   saved_countrR   r`   ir   r8   s                r   save_products_to_dbz'AliExpressAPIParser.save_products_to_db~  s<   R	JJJIIIHOOBGOOBGOOH,E,EFFGGG000000$$&&D[[]]FK# < <;NN $ ""34g>S6TUW W W
 (( !$hV]^eVf$h$hiii  NN $  ( 01($455
+ 12J//Ha00NA66 56   
7;;/?#D#DEE  2 "(!2!21!5J )2'++h2K2K(L(L  9$ "NN , 
 !+ ) !Q ! ?!A# ? ?"	
 
 
  1$KKK VGGDT V VWWWW    LL![XY![![\\\HHHH KKMMMLLNNNJJLLL 	 	 	LLN1NNOOO11111	sQ   BK AI K !E0IK 
JJ :K  JA K 
K8K33K8   c                 :   g }t                               dt          |           d           |D ]7}	 t                               d|            |                     ||          }|st                               d|            X|D ]}	 |                     ||          }|rA|                    |           t                               d|d         dd	          d
           ]# t          $ r'}t                               d|            Y d}~d}~ww xY wt          j
        d           # t          $ r+}t                               d| d|            Y d}~1d}~ww xY w|                     |          }	t                               d|	            |S )u0   Основная функция парсингаu,   🚀 Начинаем парсинг для u    запросовu,   📝 Обрабатываем запрос: )rB   u?   ⚠️ Товары не найдены для запроса: u#   ✅ Обработан товар: r   N2   z...r   rE   u3   ❌ Ошибка обработки запроса rH   u(   💾 Сохранено товаров: )r3   r   rK   r   warningr   r   r2   r4   r,   sleepr   )
r   search_queriesmax_products_per_queryall_productsr}   rM   rR   r   r8   r   s
             r   parse_and_savez"AliExpressAPIParser.parse_and_save  s   i3~CVCViiijjj# 	 	ER5RRSSS//AW/XX NN#lej#l#lmmm' ! !G!,0,@,@%,P,P), t(//0ABBB"KK(rN_`gNhiljlilNm(r(r(rsss$ ! ! !%]Z[%]%]^^^ ! 
1   _SX__\]__``` ..|<<L{LLMMMsI   AD1D1AC'&D1'
D1DD1DD11
E&; E!!E&r   )r:   r;   )r   )__name__
__module____qualname__r   r   r9   rN   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r      s        < < <
	 	 	# # # #J7 7 7 7r+ + +Z\ \ \|       4  *+ + +ZT T Tl# # # # # #r   r   )r.   r   r   r,   r   loggingrx   basicConfigINFO	getLoggerr   r3   r   r   r   r   <module>r     s                 ', ' ' ' '		8	$	$k k k k k k k k k kr   