domingo, 27 de maio de 2012

Cálculo online de frete utilizando python

Este post foi escrito em 20/10/11: quando a greve dos correios estava terminando.
Sim, soa estranho começar o texto com isso, mas continue lendo que você vai entender. ;)

Estes dias no serviço, estávamos desenvolvendo um e-commerce e precisávamos fazer o cálculo do frete para envio de encomendas utilizando os serviços PAC e SEDEX dos correios.

Até aí, tudo bem. Peguei as especificações no site dos Correios e comecei a implementar.
Inicialmente o que me deu mais trabalho foi aprender a ler arquivos XML. Aliás, primeiro foi encontrar um pacote bom para ler XML. No fim das contas encontrei um site com vários exemplos utilizando o minidom. Além de consultar a documentação oficial para alguns detalhes.
De qualquer forma, depois de diversos testes e tentativas nos servidores dos exemplos e constatar que estava funcionando tudo direitinho, fomos para os testes no servidor dos Correios...

Bem, creio eu que não preciso dizer o quão
decepcionante foi confirmar que esse tipo de serviço online dos Correios é péssimo. Não me levem a mal, tenho certeza que a equipe deles tem dado duro pra manter tudo funcionando. Pois estão com salários defasados, falta de equipamentos, falta de equipe, etc. Sendo que daí veio a greve dos Correios, que no fim das contas não adiantou de nada... ><

De qualquer forma, como no momento não podemos confiar muito nos serviços online dos Correios, procurei e encontrei um serviço de cálculo de frete gratuito e muito bom: Calculador gratuito de frete - Sedex e encomenda PAC. Fiz uma função para integração com ele e está tudo funcionando muito bem.

Aqui está o código dela para quem estiver precisando:

def calculaFreteW21(codigo, peso, x, y, z, cep_destino):
    import httplib
    import urllib
    import re
    from xml.dom.minidom import parse, parseString

    #codifica os parametros para serem inclusos na url
    params = urllib.urlencode({'cod': codigo,
    'cep': cep_destino,
    'peso': peso,
    'comprimento': x,
    'largura': y,
    'altura': z,
    'servico':'3'})

    #inicia a conexao com o servidor e envia os dados via GET
    conn = httplib.HTTPConnection("frete.w21studio.com")
    conn.request("GET", "/calFrete.xml?"+params)

    #obtem a resposta do servidor
    response = conn.getresponse()

    #transforma a resposta (pagina XML) em DOM
    dom = parseString( response.read() )
    conn.close()

    #recupera os dados necessarios da folha xml
    values = {'status':'', 'valor_sedex':'', 'valor_pac':''}
    for key in values.keys():
        try:
            values[key] = dom.getElementsByTagName(key)[0].childNodes[0].nodeValue
        except:
            pass

    if values['status'] != 'OK':
        raise Exception( values['status'] )

    return {'pac': values['valor_pac'], 'sedex': values['valor_sedex']}

Antes de terminar, gostaria de agradecer à equipe da w21studio por manter um serviço tão útil e funcional sem cobrar nada. Espero que muito mais pessoas façam o mesmo.

Até mais pessoal!
Abraços with lasers!




Nenhum comentário: