Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
micael95 opened this issue Aug 15, 2019 · 1 comment

Comments

@micael95
Copy link

micael95 commented Aug 15, 2019

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': '[email protected]',
'Dilan Nery': '[email protected]',
}

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
Copy link
Owner

avelino commented Aug 15, 2019

@nospelon consegue mandar PR corrigindo?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants