Controlando las publicaciones de Mercadolibre en Odoo

4 de diciembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Muchas veces necesitamos asegurarnos que la lista de publicaciones que mantenemos en Odoo, coincida con el stock de publicaciones que tenemos en Mercadolibre. Debido a que esta última puede cambiar, por ejemplo nuevas publicaciones se pueden generar de forma automática debido al catalogo.

Los módulos ya lo hacen de forma automática, por ejemplo  permite importar las publicaciones. Ahora, supongamos que queremos hacerlo por nuestra cuenta. Sin necesidad de tener un módulo. Por ejemplo, con xmlrpc.

Bien, lo primero en el script con el que estamos trabajando es obtener el access_token (de alguna manera el mismo se actualiza periodicamente y es válido, y se encuentra persistido en un módulo de Odoo. Por ejemplo, en meli_oerp se persiste en el modelo res.company.

models = client.ServerProxy('{}/xmlrpc/2/object'.format(url))

print(uid)

company_data = models.execute_kw(dbname,uid,pwd,'res.company','read',[[1],['mercadolibre_access_token']])
company_data = company_data[0]

ACCESS_TOKEN = company_data.get('mercadolibre_access_token')

El paso siguiente es buscar todas las publicaciones de la cuenta de Mercadolibre en modo scan (así podemos leer más de 10,000 publicaciones)

all_items = []
scan_token = None
has_more = True

USER_ID = 'XXXXX'

print(f"Empezando a leer las publicaciones para el vendedor ID: {USER_ID}...")
API_BASE_URL = f'https://api.mercadolibre.com/users/{USER_ID}/items/search'

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}"
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:
print(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)
print(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
print("Se leyeron todas las publicaciones.")

Los que nos deja una lista llamada all_items con todas las publicaciones. Luego debemos recorrer dicha lista y filtrar las que no se encuentran en Odoo. En este caso chequeamos el modelo mercadolibre.posting donde tenemos un campo meli_id con el ID de la publicación en Mercadolibre

absents = []
for x,item in enumerate(all_items):
print(item,x)
posting_id = models.execute_kw(dbname,uid,pwd,'mercadolibre.posting','search',[[['meli_id','=',item]]])
print(posting_id)
if not posting_id:
absents.append(item)

Y por último, a la lista de publicaciones en Odoo, la podemos listar junto con sus atributos importantes (por ejemplo tags por las cuotas, estado y SKU) para poder en un paso posterior relacionarlas con Odoo

API_BASE = "https://api.mercadolibre.com"

for absent in absents:
url = f"{API_BASE}/items/{absent}"
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}"
}
resp = requests.get(url, headers=headers)
resp.raise_for_status()
data = resp.json()
sku = ''
if data.get('status') in ['active','paused']:
tags = data.get('tags')
attrs = data.get('attributes')
for attribute in attrs:
if attribute.get('id') == 'MODEL':
sku = attribute.get('value_name')
print(absent,data.get('status'),sku,data.get('tags'))

De esta manera terminamos imprimiendo los datos que nos sirven para relacionar una publicación de Mercadolibre con su producto en Odoo. Lo que generalmente se hace creando una fila en el modelo mercadolibre.posting (por ejemplo) con el ID de la publicación y el producto referenciado por el SKU

Gustavo Orrillo 4 de diciembre de 2025
Compartir
Categorías
Archivar
Identificarse dejar un comentario