Current section
Files
Jump to
Current section
Files
lib/elixbndes.ex
defmodule ElixBndes do
@moduledoc """
Documentation for `ElixBndes`.
"""
require Logger
alias ElixBndes.Banco
@url_bancos_credenciados "https://www.bndes.gov.br/wps/portal/site/home/instituicoes-financeiras-credenciadas/rede-credenciada-brasil"
@url_produtos "https://www.cartaobndes.gov.br/cartaobndes/PaginasCartao/Catalogo.asp?Acao=LP&CTRL="
@url_produtos_regex "https://www.cartaobndes.gov.br/cartaobndes/PaginasCartao/Catalogo.asp?Acao=RBS&CTRL="
@doc """
Busca os bancos credenciados.
"""
def get_bancos_credenciados() do
case HTTPoison.get(
@url_bancos_credenciados,
%{"User-Agent" => "elixbndes/1.0.1"}
) do
{:ok, %{body: raw_body, status_code: _code}} ->
html = raw_body
{:ok, document} = Floki.parse_document(html)
document
|> Floki.find("h2[class*=fechado]")
|> Enum.map(fn {_chave, _valor1, valor2} -> %Banco{nome: Enum.at(valor2, 0)} end)
{:error, %HTTPoison.Error{reason: reason}} ->
Logger.error(inspect(reason))
end
end
@doc """
Busca os fornecedores cadastrados no BNDES pelo nome.
"""
def get_fornecedores_by_nome(nome_fornecedor, pagina \\ 1) when is_bitstring(nome_fornecedor) do
case HTTPoison.get(
"https://www.cartaobndes.gov.br/cartaobndes/Servico/Fornecedores.asp?acao=busca&chr_tiposaida=JSON&fornecedor=#{nome_fornecedor}&pagina=#{pagina}",
[{"User-Agent", "elixbndes/1.0.1"}, {"Accept", "*/*"}]
) do
{:ok, %{body: raw_body, status_code: _code}} ->
retorno = Jason.decode!(raw_body)
retorno["Catalogo"]
{:error, %HTTPoison.Error{reason: reason}} ->
Logger.error(inspect(reason))
end
end
@doc """
Busca os fornecedores cadastrados no BNDES pelo nome do produto.
"""
def get_fornecedores_by_nome_produto(nome_produto, pagina \\ 1)
when is_bitstring(nome_produto) do
case HTTPoison.get(
"https://www.cartaobndes.gov.br/cartaobndes/Servico/Fornecedores.asp?acao=busca&chr_tiposaida=JSON&produto=#{nome_produto}&pagina=#{pagina}",
[{"User-Agent", "elixbndes/1.0.1"}, {"Accept", "*/*"}]
) do
{:ok, %{body: raw_body, status_code: _code}} ->
retorno = Jason.decode!(raw_body)
retorno["Catalogo"]
{:error, %HTTPoison.Error{reason: reason}} ->
Logger.error(inspect(reason))
end
end
@doc """
Busca os Busca os produtos cadastrados no BNDES pelo nome.
"""
def get_produtos_by_nome(nome_produto, pagina \\ 1) when is_bitstring(nome_produto) do
case HTTPoison.post(
@url_produtos,
{:form, [{"chr_PalavraPesquisadaHidden", nome_produto}, {"int_PaginaAtual", pagina}]},
%{"Content-Type" => "application/x-www-form-urlencoded", "source" => "elixbndes"}
) do
{:ok, %{body: raw_body, status_code: _code}} ->
html = raw_body
{:ok, document} = Floki.parse_document(html)
valida_captcha(document)
total_produtos = get_quantidade_produtos_by_regex(nome_produto)
lista_produtos = get_produtos(document)
lista_fabricantes = get_fornecedores(document)
tamanho_lista = length(lista_produtos)
list_itens =
for x <- 0..(tamanho_lista - 1) do
produto = lista_produtos |> Enum.at(x)
fabricante = lista_fabricantes |> Enum.at(x)
%{produto: produto, fabricante: fabricante}
end
%{
itens: list_itens,
total: total_produtos,
pagina_atual: pagina,
total_paginas: Kernel.round(total_produtos / 10) + 1
}
# document
{:error, %HTTPoison.Error{reason: reason}} ->
Logger.error(inspect(reason))
end
end
defp valida_captcha(document) do
is_on =
document
|> Floki.find("form[id=frmCaptcha]")
|> Floki.find("input[value=S]")
|> Enum.count()
case 1 do
^is_on -> Logger.error("captcha ativo")
_ -> Logger.info("captcha nao ativo")
end
end
defp get_produtos(document) do
document
|> Floki.find("table[class=Tabela1]")
|> Floki.find("tr[valign=top")
|> Floki.find("a[id*=cat_anchor]")
|> Floki.find("a[onclick^=JavaScript")
|> Enum.map(fn {_chave, _valor1, valor2} -> valor2 |> Floki.text() end)
end
defp get_fornecedores(document) do
document
|> Floki.find("table[class=Tabela1]")
|> Floki.find("tr[valign=top")
|> Floki.find("a[id*=cat_anchor]")
|> Floki.find("a[href^=Catalogo]")
|> Enum.map(fn {_chave, _valor1, valor2} -> valor2 |> Floki.text() end)
end
defp get_quantidade_produtos_by_regex(nome_produto) do
case HTTPoison.post(
@url_produtos_regex,
{:form,
[
{"chr_PalavraPesquisadaHidden", nome_produto},
{"chr_PalavraPesquisada", nome_produto}
]},
%{"Content-Type" => "application/x-www-form-urlencoded", "source" => "elixbndes"}
) do
{:ok, %{body: raw_body, status_code: _code}} ->
html = raw_body
{:ok, document} = Floki.parse_document(html)
valida_captcha(document)
document
|> Floki.find("a[id=qtdeprod_anchor5]")
|> Floki.text()
|> String.replace(~r/[^\d]/, "")
|> String.to_integer()
{:error, %HTTPoison.Error{reason: reason}} ->
Logger.error(inspect(reason))
end
end
end