Actualizando las publicaciones con cuotas de Mercadolibre con xmlrpc

14 de noviembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

En los últimos días me ví obligado a actualizar los precios en cuotas de miles de publicaciones en MercadoLibre. El cliente no cuenta con la lista de publicaciones en Odoo, sino descarga un archivo CSV de Mercadolibre con el ID de la publicación y el SKU. Entonces lo que se decidió es hacer un script que lea las publicaciones, y las actualice con sus precios correctos mediante xmlrpc.

Bueno, primero... nos conectamos a Odoo mediante xmlrpc.

from xmlrpc import client

url = 'https://misuperodoo.com/'
common = client.ServerProxy('{}/xmlrpc/2/common'.format(url))
res = common.version()

user = 'gusadmin' #the user
pwd = 'gusadmin' #the user
dbname = 'misuperodoo'
uid = common.authenticate(dbname, user, pwd, {})
models = client.ServerProxy('{}/xmlrpc/2/object'.format(url))

Es lo que necesitamos para conectarnos a Odoo. Luego debemos acceder al access token de Mercadolibre, en otro post vamos a explicar que es y como obtenerlo. 

El paso siguiente es leer el archivo CSV con las publicaciones:


items = []
with open("publicaciones.csv", newline="", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
items.append(row)

Lo que nos va a generar una lista de tuplas con la publicación y el SKU. Lo que vamos a hacer es procesar cada uno de estos SKUs, conectarnos con la publicación para obtener su plan de cuotas. Por último determinamos su precio mediante listas de precios y después actualizamos la publicación.

Paso siguiente es iterar esta lista de tuplas (con publicación y SKU). Por cada item, vamos a necesitar leer su publicación en mercadolibre. Y hay dos datos que nos interesan aquí. Por una parte los tags y el tipo de publicación; ambos datos determinan el plan de cuotas. También vamos a procesar solo las publicaciones pausadas o activas. No es necesario perder el tiempo con las publicaciones cerradas

for x,item in enumerate(items):    
​url = f"https://api.mercadolibre.com/items/{item_id}?access_token={access_token}"
resp = requests.get(url)
if resp.status_code < 400:
data = resp.json()
​tags = data.get('tags')
​status = data.get('status')
​item_type = data.get('listing_type_id')
​if status in ['active','paused']:
​# se procesa aca

Una vez que tenemos los tags de la publicación y el tipo de publicación, pasamos a determinar su lista de precios. Para eso tenemos primero un diccionario en el que mapeamos el plan de cuotas en Mercadolibre a la lista de precios en Odoo:

tag_map = {
'immediate_payment': 14,
'pcj-co-funded': 12,
'3x_campaign': 13,
'9x_campaign': 15,
'12x_campaign': 16,
}

Y pasamos a determinar según el tipo de publicación, que lista de precios utilizar para calcular su precio

cuotas = None            
for tag in data.get('tags'):
if tag in control_tags:
all_tags.append(tag)
cuotas = tag
pricelist_id = tag_map[tag]
if not cuotas:
if data.get('listing_type_id') == 'gold_pro':
​pricelist_id = 14
else:
pricelist_id = 11

Tengamos en cuenta que no existe un tag "6 cuotas" en Mercadolibre. Determinamos que una publicación es de seis cuotas chequeando el tipo de publicación. Es por ello que si no encontramos un tag de cuotas, debemos chequear el tipo de publicación para determinar si es normal o una publicación de seis cuotas.

Paso siguiente, ya conociendo el plan de cuotas y la lista de precios, podemos conocer su precio aplicando la lista de precios al producto. 

product_id = models.execute_kw(dbname,uid,pwd,'product.template','search',[[['default_code','=',sku]]])
print(product_id)
product_data = models.execute_kw(dbname,uid,pwd,'product.template','read',[product_id,['pricelist_ids']])
product_data = product_data[0]
pricelist_template_id = product_id[0]
context = {'pricelist_template_id': pricelist_template_id}
pricelist_data = models.execute_kw(dbname,uid,pwd,'product.pricelist','read',[[pricelist_id],['price_with_tax']],{'context': context})
pricelist_data = pricelist_data[0]

Para determinar el precio utilizo el módulo product_pricelist desarrollado por AdHoc. Y leo un campo llamado price_with_tax que me determina el precio con impuestos para un producto usando dicha lista de precios.

Por último, actualizar la publicación. Para eso utilizamos el endpoint items del API de Mercadolibre. Y utilizamos la función update_item (descripta en este otro post) que nos permite lidiar con los errores relacionados con las actualizaciones masivas en Mercadolibre.

payload = {
'price': round(pricelist_data.get('price_with_tax'),2),
}
url = f"https://api.mercadolibre.com/items/{item_id}"
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
}
r = update_item(ITEM_ID,payload,ACCESS_TOKEN)
if r[0]] == 200:
​print('Actualización OK')
else:
​print('Actualización con error')

Bueno, esta es la serie de pasos que estoy siguiendo para actualizar Mercadolibre desde Odoo utilizando xmlrpc. En otro post vamos a explicar como obtener el access_token, que es uno de los items que faltan explicar.


Gustavo Orrillo 14 de noviembre de 2025
Compartir
Categorías
Archivar
Identificarse dejar un comentario