avelino / pycorreios

API correios.com.br in Python
https://github.com/avelino/pycorreios
MIT License
61 stars 33 forks source link

Corrigi para o python 3 segue o código, não consegui subir no git, pois ta negando #25

Open micael95 opened 5 years ago

micael95 commented 5 years ago

No init.py o nome da lib esta minusculo e necessario mudar para Correios e também instalar o Beautifysoup4

-- coding: utf-8 --

""" correios.py

Api para usar dados dos Correios """ from urllib.request import urlopen

version = '0.1.0' author = { 'Thiago Avelino': 'thiagoavelinoster@gmail.com', 'Dilan Nery': 'dnerylopes@gmail.com', }

from urllib import parse,request,response,error import re from xml.dom import minidom

try: from bs4 import BeautifulSoup except ImportError: raise Exception('Você não tem o modulo BeautifulSoup execute pip install beautifulsoup4', ImportError)

class Correios(object):

PAC = 41106
SEDEX = 40010
SEDEX_10 = 40215
SEDEX_HOJE = 40290
E_SEDEX = 81019
OTE = 44105
NORMAL = 41017
SEDEX_A_COBRAR = 40045

def __init__(self):
    self.status = 'OK'

def _getDados(self, tags_name, dom):
    dados = {}

    for tag_name in tags_name:
        try:
            dados[tag_name] = dom.getElementsByTagName(tag_name)[0]
            dados[tag_name] = dados[tag_name].childNodes[0].data
        except:
            dados[tag_name] = ''

    return dados

# Vários campos viraram obrigatórios para cálculo de frete:
# http://www.correios.com.br/webServices/PDF/SCPP_manual_implementacao_calculo_remoto_de_precos_e_prazos.pdf (páginas 2 e 3)
def frete(self, cod, GOCEP, HERECEP, peso, formato,
          comprimento, altura, largura, diametro, mao_propria='N',
          valor_declarado='0', aviso_recebimento='N',
          empresa='', senha='', toback='xml'):

    base_url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx"

    fields = [
        ('nCdEmpresa', empresa),
        ('sDsSenha', senha),
        ('nCdServico', cod),
        ('sCepOrigem', HERECEP),
        ('sCepDestino', GOCEP),
        ('nVlPeso', peso),
        ('nCdFormato', formato),
        ('nVlComprimento', comprimento),
        ('nVlAltura', altura),
        ('nVlLargura', largura),
        ('nVlDiametro', diametro),
        ('sCdMaoPropria', mao_propria),
        ('nVlValorDeclarado', valor_declarado),
        ('sCdAvisoRecebimento', aviso_recebimento),
        ('StrRetorno', toback),
    ]

    url = base_url + "?" + parse.urlencode(fields)
    dom = minidom.parse(urlopen(url))

    tags_name = ('MsgErro',
                 'Erro',
                 'Codigo',
                 'Valor',
                 'PrazoEntrega',
                 'ValorMaoPropria',
                 'ValorValorDeclarado',
                 'EntregaDomiciliar',
                 'EntregaSabado',)

    return self._getDados(tags_name, dom)

def cep(self, numero):
    url = 'http://cep.republicavirtual.com.br/web_cep.php?formato=' \
          'xml&cep=%s' % str(numero)
    dom = minidom.parse(urlopen(url))

    tags_name = ('uf',
                 'cidade',
                 'bairro',
                 'tipo_logradouro',
                 'logradouro',)

    resultado = dom.getElementsByTagName('resultado')[0]
    resultado = int(resultado.childNodes[0].data)
    if resultado != 0:
        return self._getDados(tags_name, dom)
    else:
        return {}

def encomenda(self, numero):
    # Usado como referencia o codigo do Guilherme Chapiewski
    # https://github.com/guilhermechapiewski/correios-api-py

    url = 'http://websro.correios.com.br/sro_bin/txect01$.QueryList?' \
          'P_ITEMCODE=&P_LINGUA=001&P_TESTE=&P_TIPO=001&P_COD_UNI=%s' % \
          str(numero)

    html = urlopen(url).read()
    table = re.search(r'<table.*</TABLE>', html, re.S).group(0)

    parsed = BeautifulSoup(table)
    dados = []

    for count, tr in enumerate(parsed.table):
        if count > 4 and str(tr).strip() != '':
            if re.match(r'\d{2}/\d{2}/\d{4} \d{2}:\d{2}',
                        tr.contents[0].string):

                dados.append({
                    'data': str(tr.contents[0].string),
                    'local': str(tr.contents[1].string),
                    'status': str(tr.contents[2].font.string)
                })

            else:
                dados[len(dados) - 1]['detalhes'] = str(
                    tr.contents[0].string)

    return dados
avelino commented 5 years ago

@nospelon consegue mandar PR corrigindo?