class Melif23: def __init__(self, url): self.auth = self.get_auth(url) self.meli = Meli(client_id=5747735731654676, client_secret="ITYNDyPRzGGArOuwJk2684LwDiGotzCW", access_token=self.auth['access_token'], refresh_token=self.auth['refresh_token']) @classmethod def get_auth(self, url): return requests.get(url, verify=False).json() def get_item(self, item): response = self.meli.get("/items/" + item).json() categories = self.get_categories(response["category_id"]) return {"id": response["id"], "title": response["title"], "subtitle": response["subtitle"], "price": response["price"], "image": response['pictures'][0]['secure_url'], "categories": categories} def get_categories(self, cat): response = self.meli.get("/categories/" + cat).json() return {"main": response["name"], "root": response["path_from_root"], "childs": response["children_categories"]} def get_user(self): params = {'access_token': self.meli.access_token} response = self.meli.get(path="/users/me", params=params).json() return response["id"]
def get_publicaciones(self): try: meli = Meli(client_id=self.request.session['CLIENT_ID'], client_secret=self.request.session['CLIENT_SECRET'], access_token=self.request.session['ACCESS_TOKEN'], refresh_token=self.request.session['REFRESH_TOKEN']) ml_user_id = self.request.session['ML_USER_ID'] except KeyError: return redirect('login') publicaciones_activas = list() response = meli.get(f'/users/{ml_user_id}/items/search', params={'access_token': meli.access_token}) json_response = json.loads(response.content) publicaciones = json_response.get('results') if publicaciones: for publicacion in publicaciones: resp = meli.get(f'/items/{publicacion}', params={'access_token': meli.access_token}) json_publicacion = json.loads(resp.content) if json_publicacion['status'] == 'active': publicaciones_activas.append({ 'id': str(publicacion), 'permalink': json_publicacion['permalink'], 'price': json_publicacion['price'], 'title': json_publicacion['title'] }) return publicaciones_activas
def importar_anuncios(): import json form = SQLFORM.factory( Field('anuncio_id','string',label='Id do Anuncio:'), Field('offset','integer',label='Inicio:', default=0), Field('limit','integer',label='Quantidade:',default=50), table_name='importaranuncio', submit_button='Carregar Anuncios', ) xitens = [] btnAtualizar = '' if form.process().accepted: anuncio_id = form.vars.anuncio_id offset = form.vars.offset limit = form.vars.limit # Cunsulta de itens na Api do mercado livre from meli import Meli meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) if anuncio_id: argsItem = "items/%s" %(anuncio_id) busca = meli.get(argsItem) if busca.status_code == 200: itens = json.loads(busca.content) xitens.append(itens) else: argsItem = "sites/MLB/search?seller_id=%s&offset=%s&limit=%s" %(USER_ID,offset,limit) busca = meli.get(argsItem) if busca.status_code == 200: itens = json.loads(busca.content) xitens = itens['results'] atualizar_anuncios(xitens) elif form.errors: response.flash = 'Erro no Formulário' return dict(form=form,itens = xitens,btnAtualizar=btnAtualizar)
def main(): meli = Meli(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.get("/items/ITEM_ID") print response.content
def main(): if not TOKEN: CODE = os.environ.get("CODE") if not CODE: ml_api = Meli(**auth_params) print ml_api.auth_url(redirect_URI=URL) print "login and run CODE=foobar main.py" else: ml_api = Meli(**auth_params) ml_api.authorize(CODE,URL) print "export set TOKEN='%s'" % ml_api.access_token sys.exit(0) auth_params.update({'access_token':TOKEN}) ml_api = Meli(**auth_params) resp = ml_api.get("/sites/%s/categories" % SITE ) cat_list = resp.json() data = [] cat_count = 0 item_count = 0 for cat in cat_list: cat_id = cat.get("id") cat_name = cat.get("name") d = {'cat_id':cat_id, 'cat_name':cat_name, 'items':[]} cat_count +=1 print d for page in range(0,TIMES): url = "/sites/{}/hot_items/search?limit={}&category={}&page={}".format(SITE,LIMIT,cat_id, page) resp = ml_api.get(url) item_list = resp.json()["results"] for item in item_list: item_count +=1 item_name = item.get("title") item_id = item.get("id") item_price = item.get("price") if item_name: d["items"].append({'item_id': item_id, 'item_price':item_price, 'item_name': item_name}) #print d data.append(d) print "fetch" print "cats: {} items: {}".format(cat_count, item_count) return data
def buscar_categoria(categoriaId): import json from meli import Meli meli = Meli(client_id=CLIENT_ID, client_secret=CLIENT_SECRET) ### Buscar Categoria ### args = "categories/%s" % (categoriaId) categoria = meli.get(args) if categoria.status_code == 200: categoria = json.loads(categoria.content) ### Concatena Nome da Categoria ### nomeCategoria = '' for r in categoria['path_from_root']: if nomeCategoria: nomeCategoria = nomeCategoria + '/' + r['name'] else: nomeCategoria = r['name'] ### Buscar Dimensoes por Categoria ### valorFrete = 0 argsDimensoes = '%s/shipping' % (args) categoriaDimensoes = meli.get(argsDimensoes) if categoriaDimensoes.status_code == 200: dimensoes = json.loads(categoriaDimensoes.content) ### Buscar Valor de Frete pelas Dimensoes da Categoria ### argsFrete = '/users/%s/shipping_options/free?dimensions=%sx%sx%s,%s' \ %(USER_ID,dimensoes['height'],dimensoes['width'],dimensoes['length'],dimensoes['weight']) categoriaFrete = categoria = meli.get(argsFrete) if categoriaFrete.status_code == 200: frete = json.loads(categoriaFrete.content) valorFrete = frete['coverage']['all_country']['list_cost'] return dict(categoria=nomeCategoria, categoriaId=categoriaId, valorFrete=valorFrete)
def get(self, request, *args, **kwargs): try: code = request.GET['code'] meli = Meli(self.request.session['CLIENT_ID'], self.request.session['CLIENT_SECRET']) except KeyError: return redirect('login') meli.authorize(code=code, redirect_URI=settings.CALLBACK_URL) response = meli.get('/users/me', params={'access_token': meli.access_token}) json_response = json.loads(response.content) self.request.session['ML_USER_ID'] = json_response['id'] self.request.session['ACCESS_TOKEN'] = meli.access_token self.request.session['REFRESH_TOKEN'] = meli.refresh_token return super().get(request, *args, **kwargs)
def multiplos(): # Cunsulta de itens na Api do mercado livre import json from meli import Meli meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) xitens = [] rows = db(Anuncios.forma == 'Multiplos').select() for row in rows: anuncio_id = row.item_id argsItem = "items/%s" %(anuncio_id) busca = meli.get(argsItem) if busca.status_code == 200: itens = json.loads(busca.content) xitens.append(itens) atualizar_anuncios(xitens) return
def sugerir_categoria(): if request.vars.categoria == '': from meli import Meli args = "sites/MLB/category_predictor/predict?title=%s" %(request.vars.titulo) meli = Meli(client_id=CLIENT_ID,client_secret=CLIENT_SECRET) busca = meli.get(args) import json if busca.status_code == 200: sugestao = json.loads(busca.content) categoria = buscar_categoria(sugestao['id']) Categorias.update_or_insert(Categorias.categoria_id==sugestao['id'], categoria_id = sugestao['id'], categoria = categoria['categoria'], frete = categoria['valorFrete'],) return "jQuery('#anuncios_categoria').append(new Option('%s', '%s')).val('%s');" % (categoria['categoria'],sugestao['id'],sugestao['id'])
class MeliTest(unittest.TestCase): def setUp(self): self.CLIENT_ID = "123" self.CLIENT_SECRET = "a secret" self.ACCESS_TOKEN = "a access_token" self.REFRESH_TOKEN = "a refresh_token" self.NEW_ACCESS_TOKEN = "a new access_token" self.NEW_REFRESH_TOKEN = "a new refresh_token" self.meli = Meli(client_id=self.CLIENT_ID, client_secret=self.CLIENT_SECRET, access_token=self.ACCESS_TOKEN, refresh_token=self.REFRESH_TOKEN) #constructor tests def testClientId(self): self.assertEqual(self.meli.client_id, self.CLIENT_ID) def testClientSecret(self): self.assertEqual(self.meli.client_secret, self.CLIENT_SECRET) def testAccessToken(self): self.assertEqual(self.meli.access_token, self.ACCESS_TOKEN) def testRefreshToken(self): self.assertEqual(self.meli.refresh_token, self.REFRESH_TOKEN) #auth_url tests def testAuthUrl(self): callback = "http://test.com/callback" self.assertTrue(re.search("^http", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("^https\:\/\/auth.mercadolibre.com\/authorization", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("redirect_uri", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search(self.CLIENT_ID,self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("response_type", self.meli.auth_url(redirect_URI=callback))) #Mock requests def mockGet(url, path=None, params={},headers={}, data=None, body=None): response = requests.Response() if re.search("/users/me", url): if "access_token" in params: response.status_code = 200 else: response.status_code = 403 elif re.search("/authorization", url): response.status_code = 200 else: response.status_code = 200 return response def mockPost(url, path=None, body=None, params={},headers={}, data=None): response = requests.Response() if re.search("/oauth/token", url): if "grant_type" not in params or "client_id" not in params or "client_secret" not in params: response.status_code = 403 else: if re.search("grant_type=authorization_code", params): content = {'access_token' : 'a access_token', 'refresh_token' : 'a refresh_token'} elif re.search("grant_type=refresh_token", params): content = {'access_token' : 'a new access_token', 'refresh_token' : 'a new refresh_token'} response._content = json.dumps(content) response.status_code = 200 else: if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response def mockPut(url, path=None, body=None, params={},headers={}, data=None): response = requests.Response() if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response def mockDelete(url, path=None, params={},headers={}, data=None, body=None): response = requests.Response() if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response requests.get = mockGet requests.post = mockPost requests.put = mockPut requests.delete = mockDelete #requests tests def testGet(self): response = self.meli.get(path="/items/test1") self.assertEqual(response.status_code, requests.codes.ok) def testPost(self): body = {"condition":"new", "warranty":"60 dias", "currency_id":"BRL", "accepts_mercadopago":True, "description":"Lindo Ray_Ban_Original_Wayfarer", "listing_type_id":"bronze", "title":"oculos Ray Ban Aviador Que Troca As Lentes Lancamento!", "available_quantity":64, "price":289, "subtitle":"Acompanha 3 Pares De Lentes!! Compra 100% Segura", "buying_mode":"buy_it_now", "category_id":"MLB5125", "pictures":[{"source":"http://upload.wikimedia.org/wikipedia/commons/f/fd/Ray_Ban_Original_Wayfarer.jpg"}, {"source":"http://en.wikipedia.org/wiki/File:Teashades.gif"}] } response = self.meli.post(path="/items",body=body,params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testPut(self): body = {"title":"oculos edicao especial!", "price":1000 } response = self.meli.put(path="/items/test1",body=body,params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testDelete(self): response = self.meli.delete(path="/questions/123",params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testWithoutAccessToken(self): response = self.meli.get(path="/users/me") self.assertEqual(response.status_code, requests.codes.forbidden) def testWithAccessToken(self): response = self.meli.get(path="/users/me",params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) #auth tests def testAuthorize(self): self.meli.access_token = None self.meli.refresh_token = None response = self.meli.authorize(code="a code from get param", redirect_URI="A redirect Uri") self.assertEqual(self.meli.access_token, self.ACCESS_TOKEN) self.assertEqual(self.meli.refresh_token, self.REFRESH_TOKEN) def testDoRefreshToken(self): response = self.meli.get_refresh_token() self.assertEqual(self.meli.access_token, self.NEW_ACCESS_TOKEN) self.assertEqual(self.meli.refresh_token, self.NEW_REFRESH_TOKEN)
class MeliTest(unittest.TestCase): def setUp(self): self.CLIENT_ID = "123" self.CLIENT_SECRET = "a secret" self.ACCESS_TOKEN = "a access_token" self.REFRESH_TOKEN = "a refresh_token" self.NEW_ACCESS_TOKEN = "a new access_token" self.NEW_REFRESH_TOKEN = "a new refresh_token" self.meli = Meli(client_id=self.CLIENT_ID, client_secret=self.CLIENT_SECRET, access_token=self.ACCESS_TOKEN, refresh_token=self.REFRESH_TOKEN) #constructor tests def testClientId(self): self.assertEqual(self.meli.client_id, self.CLIENT_ID) def testClientSecret(self): self.assertEqual(self.meli.client_secret, self.CLIENT_SECRET) def testAccessToken(self): self.assertEqual(self.meli.access_token, self.ACCESS_TOKEN) def testRefreshToken(self): self.assertEqual(self.meli.refresh_token, self.REFRESH_TOKEN) #auth_url tests def testAuthUrl(self): callback = "http://test.com/callback" self.assertTrue(re.search("^http", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("^https\:\/\/auth.mercadolibre.com\/authorization", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("redirect_uri", self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search(self.CLIENT_ID,self.meli.auth_url(redirect_URI=callback))) self.assertTrue(re.search("response_type", self.meli.auth_url(redirect_URI=callback))) #Mock requests def mockGet(url, path=None, params={},headers={}, data=None, body=None): response = requests.Response() if re.search("/users/me", url): if "access_token" in params: response.status_code = 200 else: response.status_code = 403 elif re.search("/authorization", url): response.status_code = 200 else: response.status_code = 200 return response def mockPost(url, path=None, body=None, params={},headers={}, data=None): response = requests.Response() if re.search("/oauth/token", url): if "grant_type" not in params or "client_id" not in params or "client_secret" not in params: response.status_code = 403 else: if re.search("grant_type=authorization_code", params): content = {'access_token' : 'a access_token', 'refresh_token' : 'a refresh_token'} elif re.search("grant_type=refresh_token", params): content = {'access_token' : 'a new access_token', 'refresh_token' : 'a new refresh_token'} response._content = json.dumps(content) response.status_code = 200 else: if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response def mockPut(url, path=None, body=None, params={},headers={}, data=None): response = requests.Response() if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response def mockDelete(url, path=None, params={},headers={}, data=None, body=None): response = requests.Response() if "access_token" in params: response.status_code = 200 else: response.status_code = 403 return response requests.get = mockGet requests.post = mockPost requests.put = mockPut requests.delete = mockDelete #requests tests def testGet(self): response = self.meli.get(path="/items/test1") self.assertEqual(response.status_code, requests.codes.ok) def testPost(self): body = {"condition":"new", "warranty":"60 dias", "currency_id":"BRL", "accepts_mercadopago":True, "description":"Lindo Ray_Ban_Original_Wayfarer", "listing_type_id":"bronze", "title":"oculos Ray Ban Aviador Que Troca As Lentes Lancamento!", "available_quantity":64, "price":289, "subtitle":"Acompanha 3 Pares De Lentes!! Compra 100% Segura", "buying_mode":"buy_it_now", "category_id":"MLB5125", "pictures":[{"source":"http://upload.wikimedia.org/wikipedia/commons/f/fd/Ray_Ban_Original_Wayfarer.jpg"}, {"source":"http://en.wikipedia.org/wiki/File:Teashades.gif"}] } response = self.meli.post(path="/items",body=body,params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testPut(self): body = {"title":"oculos edicao especial!", "price":1000 } response = self.meli.put(path="/items/test1",body=body,params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testDelete(self): response = self.meli.delete(path="/questions/123",params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) def testWithoutAccessToken(self): response = self.meli.get(path="/users/me") self.assertEqual(response.status_code, requests.codes.forbidden) def testWithAccessToken(self): response = self.meli.get(path="/users/me",params={'access_token' : self.meli.access_token}) self.assertEqual(response.status_code, requests.codes.ok) #auth tests def testAuthorize(self): self.meli.access_token = None self.meli.refresh_token = None response = self.meli.authorize(code="a code from get param", redirect_URI="A redirect Uri") self.assertEqual(self.meli.access_token, self.ACCESS_TOKEN) self.assertEqual(self.meli.refresh_token, self.REFRESH_TOKEN) def testDoRefreshToken(self): response = self.meli.get_refresh_token() self.assertEqual(self.meli.access_token, self.NEW_ACCESS_TOKEN) self.assertEqual(self.meli.refresh_token, self.NEW_REFRESH_TOKEN)
REDIRECT_URI = '''http://localhost:4567/redirect''' CLIENT_NAME = 'Stranger' meli = Meli(client_id=CLIENT_ID, client_secret=CLIENT_SECRET) category_list = ['MLB223835'] for category in category_list: paging_limit = 200 paging_offset = 0 items_total = 0 foo = 1 timestamp = datetime.datetime.now() while paging_offset <= items_total: response = (meli.get("/sites/MLB/search?category=" + category + "&condition=new&buying_mode=buy_it_now" + "&offset=" + str(paging_offset) + "&limit=" + str(paging_limit) + "&sort=relevance")) jresponse = response.json() #timestamp = response.headers['date'] paging_limit = jresponse['paging']['limit'] items_total = jresponse['paging']['total'] item_results = jresponse['results'] for item in item_results: category_id = item['category_id'] item_id = item['id'] seller = item['seller']['id'] price = item['price'] available_quantity = item['available_quantity'] sold_quantity = item['sold_quantity'] UF = item['address']['state_id'] free_shipping = item['shipping']['free_shipping']
def importar_vendas(): import json from datetime import datetime form = SQLFORM.factory( Field('order_id', 'string', label='Id do Pedido:'), Field('offset', 'integer', label='Inicio:', default=0), Field('limit', 'integer', label='Quantidade:', default=50, requires=IS_INT_IN_RANGE(1, 51, error_message='Entre 1 e 50 !')), table_name='importarvendas', submit_button='Importar Pedidos', ) itens = [] if form.process().accepted: order_id = form.vars.order_id offset = form.vars.offset limit = form.vars.limit if session.ACCESS_TOKEN: from meli import Meli meli = Meli(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, access_token=session.ACCESS_TOKEN, refresh_token=session.REFRESH_TOKEN) if order_id: args = "orders/%s" % (order_id) busca = meli.get(args, {'access_token': session.ACCESS_TOKEN}) if busca.status_code == 200: xitens = json.loads(busca.content) itens.append(xitens) else: args = "/orders/search/recent?seller=%s&sort=date_desc&order.status=paid&offset=%s&limit=%s" % ( USER_ID, offset, limit) busca = meli.get(args, {'access_token': session.ACCESS_TOKEN}) #busca = meli.get("/orders/search/recent?seller=158428813&sort=date_desc&order.status=paid", {'access_token':session.ACCESS_TOKEN}) if busca.status_code == 200: itens = json.loads(busca.content) itens = itens['results'] for item in itens: body = "/shipments/%s" % (item['shipping']['id']) busca = meli.get(body, {'access_token': session.ACCESS_TOKEN}) if busca.status_code == 200: shipping = json.loads(busca.content) Clientes.update_or_insert( Clientes.id == item['buyer']['id'], id=item['buyer']['id'], nome="%s %s" % (item['buyer']['first_name'], item['buyer']['last_name']), cnpj_cpf=item['buyer']['billing_info']['doc_number'], tipo=item['buyer']['billing_info']['doc_type'], endereco=shipping['destination']['shipping_address'] ['address_line'], bairro=shipping['destination']['shipping_address'] ['neighborhood']['name'], cidade=shipping['destination']['shipping_address']['city'] ['name'], estado=shipping['destination']['shipping_address']['state'] ['name'], cep=shipping['destination']['shipping_address'] ['zip_code'], fone="%s %s" % (item['buyer']['phone']['area_code'] or '', item['buyer']['phone']['number'] or ''), email=item['buyer']['email'], apelido=item['buyer']['nickname'], ) Pedidos.update_or_insert(Pedidos.id == item['shipping']['id'], id=item['shipping']['id'], buyer_id=item['buyer']['id'], date_created=datetime.strptime( item['date_created'][:10], '%Y-%m-%d'), status=shipping['status']) Pedidos_Itens.update_or_insert( Pedidos_Itens.id == item['id'], id=item['id'], shipping_id=item['shipping']['id'], payments_id=item['payments'][0]['id'], item=item['order_items'][0]['item']['title'], item_id=item['order_items'][0]['item']['id'], quantidade=item['order_items'][0]['quantity'], valor=item['order_items'][0]['unit_price'], taxa=0, frete=0, ) else: status = 'Antes Faça o Login....' elif form.errors: response.flash = 'Erro no Formulário' return dict(itens=itens, form=form)
def main(): meli = Meli(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) response = meli.get("/items/ITEM_ID") print response.content
] } return (self.wcapi.post("products", data).json()) full23 = Wooadd("https://full23.com/core/api/index.php/a3wfnrg2x4kr929c") a = full23.clean_store() # full23.add_item("MLV466061309") userid = full23.get_user() items = [] mel = Meli(client_id=5747735731654676, client_secret="ITYNDyPRzGGArOuwJk2684LwDiGotzCW", access_token=key, refresh_token=refresh) params = {'access_token': key, "limit": 50} resp = mel.get("/users/" + str(userid) + "/items/search", params=params).json() for i in resp['results']: items.append(i) times = math.ceil(int(resp['paging']['total']) / 50) + 1 offset = 0 for i in range(0, int(times)): params = {'access_token': key, "limit": 50, "offset": offset} resp = mel.get("/users/" + str(userid) + "/items/search", params=params).json() for i in resp['results']: items.append(i) offset = offset + 50 for i in items: