L'industrie du commerce électronique évolue constamment, et avec elle, les attentes des consommateurs en matière de recherche de produits efficace et précise. 1688, une plateforme B2B de premier plan, offre des fonctionnalités de recherche avancées, notamment la recherche par image, qui améliore considérablement l'expérience utilisateur. Cet article détaille comment utiliser Python pour interroger l'API de recherche par image de 1688 et récupérer des informations sur les produits.
Prérequis
- **Compte et Clés API :**Vous devez vous inscrire sur la plateforme développeur de 1688 et créer une application pour obtenir votre
app_keyetapp_secret. Ces identifiants sont essentiels pour l'authentification lors des appels API. Le processus est similaire à celui de la plateforme développeur de Taobao. - **Bibliothèques Python :**Assurez-vous d'avoir installé les bibliothèques nécessaires :
requests: Pour effectuer des requêtes HTTP.hashlib: Pour générer des signatures cryptographiques.time: Pour gérer les horodatages.json: Pour manipuler des données au format JSON.
Chargement d'image et obtention d'un identifiant
L'API de recherche par image de 1688 nécessite l'URL ou l'identifiant de l'image. La première étape consiste donc à téléverser l'image sur le serveur de 1688 et à obtenir cet identifiant.
Voici un exemple de code Python pour téléverser une image :
import requests
import json
import time
import hashlib
def create_signature(params, app_secret):
"""
Génère une signature MD5 pour l'authentification de l'API.
Note : La méthode de signature exacte peut varier, consultez la documentation de l'API 1688.
"""
sorted_params = sorted(params.items())
signature_base = ''.join([f"{k}{v}" for k, v in sorted_params]) + app_secret
return hashlib.md5(signature_base.encode('utf-8')).hexdigest().upper()
def upload_image(app_key, app_secret, image_filepath):
"""
Téléverse une image sur le serveur 1688 et retourne son URL.
"""
upload_url = "https://api.1688.com/router/rest"
api_params = {
'app_key': app_key,
'method': '1688.upload.img', # Méthode pour téléverser une image
'format': 'json',
'v': '2.0',
'timestamp': int(time.time()),
'sign_method': 'md5'
}
# Préparation des fichiers pour la requête POST
files_to_upload = {'file': open(image_filepath, 'rb')}
# Ajout de la signature aux paramètres
api_params['sign'] = create_signature(api_params, app_secret)
try:
response = requests.post(upload_url, files=files_to_upload, params=api_params)
response.raise_for_status() # Lève une exception pour les codes d'erreur HTTP
result = response.json()
# Vérification de la structure de la réponse pour l'URL de l'image
if 'alibaba_service_response' in result and 'pic_url' in result['alibaba_service_response']:
image_url = result['alibaba_service_response']['pic_url']
print(f"Image téléversée avec succès. URL : {image_url}")
return image_url
else:
print(f"Échec du téléversement ou URL de l'image non trouvée dans la réponse : {result}")
return None
except requests.exceptions.RequestException as e:
print(f"Erreur lors de la requête HTTP : {e}")
return None
except json.JSONDecodeError:
print(f"Erreur lors du décodage de la réponse JSON. Réponse brute : {response.text}")
return None
# --- Exemple d'utilisation ---
# Remplacez par vos propres clés et le chemin de votre image
my_app_key = "VOTRE_APP_KEY"
my_app_secret = "VOTRE_APP_SECRET"
path_to_image = "chemin/vers/votre/image.jpg"
uploaded_image_url = upload_image(my_app_key, my_app_secret, path_to_image)
if uploaded_image_url:
print(f"L'URL de l'image téléversée est : {uploaded_image_url}")
else:
print("Le téléversement de l'image a échoué.")
Intrerogation de l'API de recherche par image
Une fois que vous avez l'URL de l'image téléversée, vous pouvez interroger l'API de recherche par image de 1688.
L'URL de l'API est généralement : https://api.1688.com/router/rest
Paramètres requis :
app_key: Votre clé d'application.method: L'identifiant de la méthode API, par exemple1688.item_search_img.format: Le format de réponse souhaité (ex:json).v: La version de l'API.timestamp: L'horodatage Unix actuel.sign_method: La méthode de signature utilisée (md5).sign: La signature générée.imgid: L'URL ou l'identifiant de l'image à rechercher.cat(optionnel) : L'ID d'une catégorie pour affiner la recherche.page(optionnel) : Le numéro de la page de résultats.
Voici un exemple de code pour effectuer la recherche :
import requests
import time
import hashlib # Assurez-vous que hashlib est importé si generate_sign est utilisé depuis l'exemple précédent
# Assurez-vous que la fonction create_signature est définie comme ci-dessus ou importée
# def create_signature(params, app_secret): ...
def search_by_image(app_key, app_secret, image_url, category_id=None, page_num=1):
"""
Recherche des produits sur 1688 en utilisant une image comme critère.
"""
search_url = "https://api.1688.com/router/rest"
api_params = {
'app_key': app_key,
'method': '1688.item_search_img', # Méthode pour la recherche par image
'format': 'json',
'v': '2.0',
'timestamp': int(time.time()),
'sign_method': 'md5',
'imgid': image_url,
'page': page_num
}
if category_id:
api_params['cat'] = category_id
# Ajout de la signature
api_params['sign'] = create_signature(api_params, app_secret)
try:
response = requests.get(search_url, params=api_params)
response.raise_for_status()
search_results = response.json()
# Le format de réponse peut varier légèrement, inspectez la structure
# Supposons que les résultats sont dans 'alibaba_service_response' -> 'results' -> 'item_list' -> 'item'
item_list_data = search_results.get('alibaba_service_response', {}).get('results', {}).get('item_list', {}).get('item', [])
if not item_list_data:
print("Aucun produit trouvé pour cette image.")
return []
products = []
for item in item_list_data:
product_info = {
'title': item.get('title'),
'image_url': item.get('pic_url'),
'price': item.get('price'),
'sales_count': item.get('sales_count'), # Le nom peut être différent selon l'API exacte
'detail_page': item.get('detail_url')
}
products.append(product_info)
print(f"Produit trouvé : {product_info['title']}")
print(f" Image : {product_info['image_url']}")
print(f" Prix : {product_info['price']}")
print(f" Ventes : {product_info.get('sales_count', 'N/A')}")
print(f" Lien : {product_info['detail_page']}")
print("-" * 40)
return products
except requests.exceptions.RequestException as e:
print(f"Erreur lors de la requête de recherche : {e}")
return []
except json.JSONDecodeError:
print(f"Erreur lors du décodage de la réponse JSON. Réponse brute : {response.text}")
return []
# --- Exemple d'utilisation ---
# Assurez-vous que uploaded_image_url contient l'URL obtenue lors du téléversement
# Ou utilisez une URL d'image valide directement si vous ne téléversez pas
if uploaded_image_url: # Ou remplacez par une URL valide comme : "http://image.example.com/image.jpg"
results = search_by_image(my_app_key, my_app_secret, uploaded_image_url)
# Vous pouvez maintenant traiter la liste 'results'
else:
print("Impossible de lancer la recherche sans une URL d'image valide.")
Traitement des réponses
L'API renvoie des données structurées, généralement en JSON. Ces données contiennent des informations sur les produits correspondants à l'image, telles que le titre, l'URL de l'image principale, le prix, le volume des ventes et l'URL de la page de détail du produit. Il est crucial d'inspecter la structure exacte de la réponse reçue pour accéder correctement à ces informations.
Considérations importantes
- Mécanismes anti-robots : 1688 met en œuvre des protections contre le scraping. Il est conseillé d'implémenter des délais entre les requêtes (
time.sleep()) et d'utiliser des en-têtesUser-Agentvariés pour simuler un comportement d'utilisateur légitime et éviter le blocage de votre adresse IP. L'utilisation de proxys peut également être nécessaire. - Stockage des données : Les informations récupérées peuvent être sauvegardées dans divers formats, tels que des fichiers CSV, JSON, ou directement dans une base de données pour une analyse ultérieure.
- Conformité légale : Assurez-vous de respecter les lois et réglementations en vigueur concernant le web scraping et le droit d'auteur des données.
En suivant ces étapes, vous pouvez intégrer la fonctionnalité de recherche par image de 1688 dans vos projets Python.