
    Ƈ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y)    N)datetime)levelc                   b    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y)AliExpressAPIParserc                 .    || _         || _        d| _        y )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                               }| j                  }|D ]  \  }}|| | z  } || j                  z  }t        j                  |j                  d            j                         j                         }|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%w'H	(DOO#KK 89CCEKKM	r   Nc           	         |i }|j                  | j                  |t        t        j                         dz        dddd       | j	                  |      |d<   	 t        d|        t        j                  | j                  |d	
      }|j                          |j                         }t        d|j                          d|v r|d   }t        d|        y|S # t        $ r"}t        j                  d|        Y d}~y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   s   >F||TYY[4/0 
 	 008v	.vh78}}T\\KH%%']]_F,X-A-A,BCD6)#$45
.zl;<M 	LL<QC@A	s   A?C C 	D%DDc           	         g d}|D ]  }	 t        d|        |dk(  r|||dd}n|dk(  r|||dd}n|||d}| j                  ||      }|red	|vrat        d
| d       t        dt        j                  |dd              | j	                  |      }|r*t        dt        |              |c S t        d| d        g S # t        $ r}	t        d| d|	        Y d}	~	d}	~	ww xY w)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_pager@   rA   )r>   r?   r@   r)   u   ✅ Метод u    работает!u   📥 Ответ:    F)indentensure_asciiu#   ✅ Найдено товаров: u   ❌ Метод u    не работаетu   ❌ Ошибка метода : N)r-   r9   r   dumps'extract_products_from_dropship_responselenr2   )
r   r>   r?   r@   methods_to_tryr    r   r6   productsr8   s
             r   search_products_dropshipz,AliExpressAPIParser.search_products_dropshipB   sB   
 % *	F)A&JK ;;$,#*%. +	F EE$,(/%. +	F %-#*%.F ..vv>.f<OF83EFG-djjX].^-_`a  $KKFSH CCM?ST'OF83IJKM*	X 		  6vhbDEs   B$C2C	C)C$$C)c                    g }t        |j                               }|D ]  }|j                  d      s||   }t        |t              s+d|v rc|d   }|rxd|v rt|d   }d|v r2|d   }t        |t              r
d|v r|d   }nLt        |t               r<|}n9d|v r|d   }n/t        |t               r|}nd|v r|d   }nt        |t               r|}|st        |t               r|c S |gc S  g S )uB   Извлечение товаров из ответа Dropship API	_responseresp_resultr6   rK   productaeop_ae_product_s_k_u_s)listkeysendswith
isinstancedict)	r   r6   rK   response_keysr   response_datarO   result_dataproducts_datas	            r   rH   z;AliExpressAPIParser.extract_products_from_dropship_response{   s    V[[]+  "	VC||K( &smT2$5&3M&B&8{+B*5h*?K  *[80;J0G#-mT#ByTaGa/<Y/GH%/t%D/<H!:k!I+67P+Q!+K!>+6#}4#0#<#M48#0+5h+ExUH:UE"	VH 	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 }|j                         }|j                         D ]D  \  }}||v st        j                  |t	        d3t        |                  }|j                  |       F |sQg }|j                         D ]  }|j                  |        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mattressrC      )lowerr   randomsampleminrI   extendvalues)	r   querysample_productsrK   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
P kkm.446 	0OHe;&!'uc!SZ6H!I/		0 I(//1 (  '(}}YAs9~0FGHr   c                     t         j                  d|        | j                  |||      }|st        d       | j	                  |      }|S )u7   Основной метод поиска товаровu    🔍 Поиск товаров: uX   ⚠️ Dropship API не вернул товары. Используем примеры.)r3   inforL   r-   r   )r   r>   r?   r@   rK   s        r   search_productsz#AliExpressAPIParser.search_products  sM    6xjAB 007INln//9Hr   c                     |syd|v r|j                  dd      }nd|v r|j                  dd      }|j                  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  sZ    "!))*jAI9$!))*jAI% 9,Ir   c                 P   |j                         |j                         t        fddD              ryt        fddD              ryt        fddD              ry	t        fd
dD              ryt        fddD              ryt        fddD              ryy)u6   Определение категории товараc              3   2   K   | ]  }|v xs |v   y wN .0wordr}   title_lowers     r   	<genexpr>z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>'  s)      Zdt{"9dk&99 Z   )rp   rq   chargerinverterledpower
electronicelectronicsc              3   2   K   | ]  }|v xs |v   y wr   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>*  s)      S$;(;; Sr   )rr   cookingkitchenpotpanfridgecoolerr   c              3   2   K   | ]  }|v xs |v   y wr   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>-  s)      N$;(;; Nr   )rs   pillowchairtabletentsleepingcomfortc              3   2   K   | ]  }|v xs |v   y wr   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>0  )      A$;(;; Ar   )toolpump
compressorkitrepairtoolsc              3   2   K   | ]  }|v xs |v   y wr   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>3  s)      G$;(;; Gr   )safetyalarmlock	emergencyz	first aidr   c              3   2   K   | ]  }|v xs |v   y wr   r   r   s     r   r   z9AliExpressAPIParser.categorize_product.<locals>.<genexpr>6  r   r   )waterfilterr   showertoiletr   other)ru   any)r   titler{   r}   r   s      @@r   categorize_productz&AliExpressAPIParser.categorize_product"  s    kkmkkm ZXZ Z  SQS S NLN N A?A A GEG G A?A Ar   c                    |j                  dd      }|j                  dd      }| d}|rt        |      dkD  r|dz  }n|rt        |      dkD  r|d	z  }d
|j                         v r|dz  }nd|j                         v r|dz  }|dz  }|S )u0   Генерация описания товараr_    rd   r   z.    uR   Высокооцененный товар с отличными отзывами. rt   uF   Популярный товар с хорошими отзывами. campingu_   Идеально подходит для кемпинга и отдыха на природе. caruO   Отличное решение для автомобиля и поездок. uc   Качественный товар от проверенного продавца на AliExpress.)getfloatru   )r   rP   r{   r   ratingdescriptions         r   generate_descriptionz(AliExpressAPIParser.generate_description<  s    OR0_a0rleFma'ooKf)ccK%||Kekkm#llK||r   c                    	 |j                  d      }|j                  dd      }t        |j                  dd            }t        |j                  dd            }|j                  dd      }|j                  dd      }t        |j                  d	d            }	t        |j                  d
d            }
g }|r$| j                  |      }|r|j	                  |       | j                  ||      }||||kD  r|nd|||||	|
t        |      | j                  ||      |	r|	 dnd|
rt        |
      ndt        |      dd}|S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)u4   Обработка отдельного товараr^   r_   r   r`   r   ra   rb   rc   rd   re   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   rP   r{   r^   r   r   r   
detail_url
main_imager   re   r   clean_imager~   processed_productr8   s                   r   process_productz#AliExpressAPIParser.process_productQ  sq   )	 \2JKK4E'++&91=>E"7;;/F#JKN %92>J %=rBJ7;;:;FXq12FF"22:>MM+...ue<H 4BU4J.PT#-& $  &'*:"&";";GU"K7=mC\JP3v;Vk'*:#!& %$ 	LLMaSQR	s   D>E 	E,
E''E,c                    	 ddl }ddl}|j                  j                  |j                  j	                  |j                  j                  t                           ddlm}  |       }|j                         }d}|D ]z  }	 |j                  d|d   |d   f       |j                         rt        j                  d|d           K|j                  d	|d   |d
   |d   |j                  d      |d   |d   |j                  d      |j                  dd      |j                  dd      |d   dt        j                          t        j                          t#        j$                  |j                  di             f       |j                         d   }	t'        |j                  dg             D ](  \  }
}|s	|j                  d|	||
dk(  |
d|
dz    f       * |dz  }t        j                  d|d           } |j-                          |j/                          |j/                          |S # t(        $ r#}t        j+                  d|        Y d}~d}~ww xY w# t(        $ r"}t        j+                  d|        Y d}~y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   Изображение    u!   ✅ Сохранен товар: u4   ❌ Ошибка сохранения товара: u/   ❌ Ошибка сохранения в БД: )sysospathr   dirnameabspath__file__serverr   cursorexecutefetchoner3   r   r   r   nowr   rG   	enumerater2   r4   commitclose)r   rK   r   r   r   connr   saved_countrP   r^   ir   r8   s                r   save_products_to_dbz'AliExpressAPIParser.save_products_to_db~  sx   R	HHOOBGGOOBGGOOH,EFG0$&D[[]FK# <;NN $ ""34g>S6TUW
 (&UV]^eVfUg$hi  NN $  ( 01($45
+ 12J/Ha0NA6 56   

7;;/?#DE2 "(!21!5J )2'++h2K(L 9$"NN , 
 !+ ) !Q !"9!A# ?"	
  1$KKK"CGGDTCU VWq<| KKMLLNJJL ! LL#WXYWZ![\  	LLJ1#NO	sW   A>I AH,I C-H,5AH,74I ,	I5II II 	J$JJc                    g }t         j                  dt        |       d       |D ]  }	 t         j                  d|        | j                  ||      }|st         j	                  d|        J|D ]G  }	 | j                  ||      }|r0|j                  |       t         j                  d|d   dd	  d
       I t        j                  d        | j                  |      }	t         j                  d|	        |S # t        $ r"}t         j                  d|        Y d}~d}~ww xY w# t        $ r&}t         j                  d| d|        Y d}~0d}~ww xY w)u0   Основная функция парсингаu,   🚀 Начинаем парсинг для u    запросовu,   📝 Обрабатываем запрос: )r@   u?   ⚠️ Товары не найдены для запроса: u#   ✅ Обработан товар: r   N2   z...r   rC   u3   ❌ Ошибка обработки запроса rF   u(   💾 Сохранено товаров: )r3   r   rI   r   warningr   r   r2   r4   r,   sleepr   )
r   search_queriesmax_products_per_queryall_productsr{   rK   rP   r   r8   r   s
             r   parse_and_savez"AliExpressAPIParser.parse_and_save  sw   B3~CVBWWhij# 	EJ5'RS//AW/XNN%dejdk#lm' !G!,0,@,@%,P),(//0AB"KK*MN_`gNhiljlNmMnnq(rs! 

1)	4 ..|<>{mLM % !'YZ[Y\%]^ !  RSXRYY[\][^_`sI   AD-1D-7AC?;D-?	D*D% D-%D**D--	E6EEr   )r      )   )__name__
__module____qualname__r   r   r9   rL   rH   r   r   r   r   r   r   r   r   r   r   r   r   r      sK    <
	#J7r+Z\|4*+ZTl#r   r   )r.   r   r   r,   r   loggingrv   basicConfigINFO	getLoggerr   r3   r   r   r   r   <module>r     sL             ',, '			8	$k kr   