Cuando trabajamos con Mercadolibre, tarde o temprano necesitamos (desde Odoo) buscar todas las publicaciones que pertenecen a una cuenta. Y si la cuenta tiene pocas publicaciones; tenemos suerte. Pero si tiene más de 1000 publicaciones, la búsqueda se torna más complicada y es necesario recurrir a algunos parámetros (desconocidos hasta hace poco para mí) que bueno, voy a compartir en este post.
Primero y antes que nada, la búsqueda la realizamos invocando el siguiente endpoint del API de Mercadolibre
https://api.mercadolibre.com/users/{USER_ID}/items/search
Siendo USER_ID el seller_id de la cuenta de Mercadolibre con la que estamos trabajando, pasando como parámetros de búsqueda la siguiente información:
params = {
'access_token': ACCESS_TOKEN,
'search_type': 'scan',
'limit': 200
}
Se debe usar el parámetro access_token (como siempre), pero ademas indicar el search_type que sea scan (sino las búsquedas no van a pasar de 10,000 publicaciones) y el límite de publicaciones que debe devolver la búsqueda (sino por defecto es 200, Mercadolibre pese a la queja de muchos, debe proteger su infraestructura de la ansiedad de sus usuarios). Otro parámetro que se debe agregar es scroll_id, pero eso es a medida que vamos buscando todas las publicaciones.
Ahora vamos a ver un ejemplo de como obtener todas las publicaciones de la cuenta de uno:
all_items = []
scan_token = None
has_more = True
_logger.debug(f"Empezando a leer las publicaciones para el vendedor ID: {USER_ID}...")
while has_more:
# 1. Se arman los parámetros del request
params = {
'access_token': ACCESS_TOKEN,
'search_type': 'scan', # Usamos 'scan' para recuperar más de 1000 items
'limit': 200 # Solo se pueden leer 200 items por búsqueda
}
if scan_token:
params['scroll_id'] = scan_token # Se usa scroll_id para las búsquedas siguientes
# 2. Se hace el API request
try:
url = f"{API_BASE_URL}{SEARCH_ENDPOINT}"
response = requests.get(url, params=params)
response.raise_for_status() # Raises an HTTPError for bad responses (4xx or 5xx)
data = response.json()
except requests.exceptions.RequestException as e:
_logger.error(f"Ocurrió un error durante el API request: {e}")
break
# 3. Se procesan los resultados
if 'results' in data:
# item_ids = [item['id'] for item in data['results']]
item_ids = data.get('results')
all_items.extend(item_ids)
_logger.info(f"Leidos {len(item_ids)} item IDs. Total de items: {len(all_items)}")
# 4. Chequea por el siguiente token de scaneo devuelto por ML
if 'scroll_id' in data and data['scroll_id']:
scan_token = data['scroll_id']
else:
has_more = False # Si no hay scroll_id, no hay más datos para leer
_logger.info("Se leyeron todas las publicaciones.")
Este método devuelve todas las publicaciones pertenecientes a una cuenta. Que es lo que necesitamos para el paso siguiente, que es leer la información de una publicación. Pero eso en otro post.