260 lines
10 KiB
Python
260 lines
10 KiB
Python
import os
|
|
import hashlib
|
|
import base64
|
|
import requests
|
|
import re
|
|
import json
|
|
import consultoras as c
|
|
import datas as d
|
|
import pandas as pd
|
|
|
|
def generate_code_verifier():
|
|
"""Gera um code_verifier aleatório."""
|
|
return base64.urlsafe_b64encode(os.urandom(32)).decode('utf-8').rstrip("=")
|
|
|
|
def generate_code_challenge(code_verifier):
|
|
"""Gera o code_challenge usando SHA-256."""
|
|
sha256_hash = hashlib.sha256(code_verifier.encode('utf-8')).digest()
|
|
return base64.urlsafe_b64encode(sha256_hash).decode('utf-8').rstrip("=")
|
|
|
|
def send_authorization_request(session, code_challenge):
|
|
"""Envia uma requisição GET para a página de login usando a sessão."""
|
|
url = "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/oauth2/v2.0/authorize"
|
|
params = {
|
|
"p": "B2C_1A_JIT_SIGNUPORSIGNIN_FEDCORP_APIGEE_PRD",
|
|
"client_id": "b3001e60-a8e0-4da8-82ba-c3a701405f08",
|
|
"redirect_uri": "https://extranet.grupoboticario.com.br/auth/callback",
|
|
"response_type": "code",
|
|
"scope": "openid email https://gboticariob2c.onmicrosoft.com/a6cd4fe6-3d71-455a-b99d-f458a07cc0d1/extranet.api offline_access",
|
|
"state": "15d9d7f95f8648d1941426f4665aa383",
|
|
"code_challenge": code_challenge,
|
|
"code_challenge_method": "S256",
|
|
"response_mode": "query"
|
|
}
|
|
|
|
response = session.get(url, params=params)
|
|
if response.status_code == 200:
|
|
print("Página de login carregada com sucesso.")
|
|
return response.text # Retorna o HTML
|
|
else:
|
|
print(f"Erro ao acessar a página de login: {response.status_code}")
|
|
print("Resposta de erro:", response.text)
|
|
return None
|
|
|
|
def extract_tokens(html_content):
|
|
"""Extrai o CSRF Token e StateProperties do conteúdo HTML."""
|
|
csrf_token = None
|
|
state_properties = None
|
|
|
|
if html_content:
|
|
csrf_match = re.search(r'"csrf":"(.*?)"', html_content)
|
|
csrf_token = csrf_match.group(1) if csrf_match else None
|
|
|
|
state_properties_match = re.search(r'"transId":"StateProperties=(.*?)"', html_content)
|
|
state_properties = state_properties_match.group(1) if state_properties_match else None
|
|
|
|
return csrf_token, state_properties
|
|
|
|
def send_login_request(session, csrf_token, state_properties, username, password):
|
|
"""Envia uma requisição POST para realizar o login usando a sessão."""
|
|
url = "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/B2C_1A_JIT_SignUpOrSignin_FedCorp_APIGEE_PRD/SelfAsserted"
|
|
|
|
params = {
|
|
"tx": f"StateProperties={state_properties}",
|
|
"p": "B2C_1A_JIT_SignUpOrSignin_FEDCorp_APIGEE_PRD"
|
|
}
|
|
|
|
headers = {
|
|
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
|
|
"X-CSRF-TOKEN": csrf_token,
|
|
"X-Requested-With": "XMLHttpRequest",
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
|
|
"Accept": "application/json, text/javascript, */*; q=0.01",
|
|
"Origin": "https://login.extranet.grupoboticario.com.br",
|
|
"Referer": "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/oauth2/v2.0/authorize"
|
|
}
|
|
|
|
data = {
|
|
"request_type": "RESPONSE",
|
|
"signInName": username,
|
|
"password": password
|
|
}
|
|
|
|
response = session.post(url, params=params, headers=headers, data=data)
|
|
if response.status_code == 200:
|
|
print("Login realizado com sucesso!")
|
|
return response.text
|
|
else:
|
|
print(f"Erro ao realizar login: {response.status_code}")
|
|
return None
|
|
|
|
def send_final_request(session, csrf_token, state_properties):
|
|
"""
|
|
Envia a última requisição GET para obter a página HTML.
|
|
"""
|
|
url = "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/B2C_1A_JIT_SignUpOrSignin_FedCorp_APIGEE_PRD/api/CombinedSigninAndSignup/confirmed"
|
|
|
|
params = {
|
|
"rememberMe": "false",
|
|
"csrf_token": csrf_token,
|
|
"tx": f"StateProperties={state_properties}",
|
|
"p": "B2C_1A_JIT_SignUpOrSignin_FedCorp_APIGEE_PRD"
|
|
}
|
|
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
|
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
|
|
"Referer": "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/oauth2/v2.0/authorize"
|
|
}
|
|
|
|
response = session.get(url, headers=headers, params=params, allow_redirects=False)
|
|
if response.status_code == 200:
|
|
print("Requisição final bem-sucedida!")
|
|
return response.text # Retorna o HTML
|
|
else:
|
|
print(f"Erro na requisição final: {response.status_code}")
|
|
return response.text
|
|
|
|
def extract_code_from_html(html_content):
|
|
"""
|
|
Extrai o valor do parâmetro `code` da URL no HTML fornecido.
|
|
|
|
:param html_content: O conteúdo HTML como string.
|
|
:return: O valor do código ou None, se não encontrado.
|
|
"""
|
|
# Regex para encontrar o parâmetro `code` na URL do atributo `href`
|
|
match = re.search(r'href="[^"]*?code=([^&"]+)', html_content)
|
|
if match:
|
|
return match.group(1) # Captura o valor do parâmetro `code`
|
|
return match
|
|
|
|
def send_token_request(code, code_verifier):
|
|
"""
|
|
Envia uma requisição POST para obter o token usando o código e o code_verifier.
|
|
|
|
:param code: O código extraído da etapa anterior.
|
|
:param code_verifier: O code_verifier usado no início do fluxo.
|
|
:return: A resposta do servidor.
|
|
"""
|
|
url = "https://login.extranet.grupoboticario.com.br/1e6392bd-5377-48f0-9a8e-467f5b381b18/oauth2/v2.0/token"
|
|
params = {
|
|
"p": "B2C_1A_JIT_SIGNUPORSIGNIN_FEDCORP_APIGEE_PRD"
|
|
}
|
|
|
|
headers = {
|
|
"Host": "login.extranet.grupoboticario.com.br",
|
|
"Connection": "keep-alive",
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
|
|
"Accept": "*/*",
|
|
"Origin": "https://extranet.grupoboticario.com.br",
|
|
"Sec-Fetch-Site": "same-site",
|
|
"Sec-Fetch-Mode": "cors",
|
|
"Sec-Fetch-Dest": "empty",
|
|
"Referer": "https://extranet.grupoboticario.com.br/",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "pt-BR,pt;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
|
}
|
|
|
|
data = {
|
|
"client_id": "b3001e60-a8e0-4da8-82ba-c3a701405f08",
|
|
"code": code,
|
|
"redirect_uri": "https://extranet.grupoboticario.com.br/auth/callback",
|
|
"code_verifier": code_verifier,
|
|
"grant_type": "authorization_code"
|
|
}
|
|
|
|
response = requests.post(url, params=params, headers=headers, data=data)
|
|
return response.text
|
|
|
|
|
|
def extract_tokens_2(response_1):
|
|
response = json.loads(response_1)
|
|
try:
|
|
access_token = response.get("access_token")
|
|
id_token = response.get("id_token")
|
|
refresh_token = response.get("refresh_token")
|
|
|
|
return {
|
|
"access_token": access_token,
|
|
"id_token": id_token,
|
|
"refresh_token": refresh_token
|
|
}
|
|
except Exception as e:
|
|
print(f"Erro ao extrair tokens: {e}")
|
|
return None
|
|
|
|
def extract_data(file):
|
|
consultoras = pd.read_excel(f"{file}", sheet_name="PDV")
|
|
consultoras.drop(index=1, inplace=True)
|
|
consultoras.columns = consultoras.iloc[0]
|
|
consultoras.drop(index=0, inplace=True)
|
|
consultoras= consultoras.iloc[:,[0,2,3,8,9]]
|
|
consultoras.columns = ['PDV','GMV ATUAL', 'VAR GMV', 'BOLETO MEDIO', 'VAR BOL']
|
|
return consultoras
|
|
|
|
def busca_realizado(codigo_pesquisar, file):
|
|
dimensao = pd.read_csv('Dimensao.csv',encoding='utf-8')
|
|
df = dimensao
|
|
codigos_correspondentes = df[(df['cpf_gr'] == codigo_pesquisar) | (df['cpf_sup'] == codigo_pesquisar)]['codigo'].tolist()
|
|
dados = extract_data(file)
|
|
pdv_filtrados = dados[dados['PDV'].isin(codigos_correspondentes)]
|
|
receita_gmv = pdv_filtrados["GMV ATUAL"].sum()
|
|
return int(receita_gmv)
|
|
|
|
# Processo principal
|
|
def main(codigo_pesquisar):
|
|
session = requests.Session() # Iniciar uma sessão persistente
|
|
|
|
code_verifier = generate_code_verifier()
|
|
code_challenge = generate_code_challenge(code_verifier)
|
|
print(f"Code Verifier: {code_verifier}")
|
|
print(f"Code Challenge: {code_challenge}")
|
|
|
|
# Enviar requisição GET para obter tokens
|
|
html_content = send_authorization_request(session, code_challenge)
|
|
csrf_token, state_properties = extract_tokens(html_content)
|
|
|
|
if not csrf_token or not state_properties:
|
|
print("Falha ao extrair CSRF Token ou StateProperties.")
|
|
else:
|
|
print("CSRF Token:", csrf_token)
|
|
print("StateProperties:", state_properties)
|
|
|
|
# Dados de login
|
|
username = "andressa.santos4"
|
|
password = "Admufal@202"
|
|
|
|
# Enviar requisição POST para login
|
|
login_response = send_login_request(session, csrf_token, state_properties, username, password)
|
|
|
|
if login_response:
|
|
print("Resposta do servidor:", login_response)
|
|
|
|
# Enviar requisição final
|
|
final_page_html = send_final_request(session, csrf_token, state_properties)
|
|
code = extract_code_from_html(final_page_html)
|
|
token = send_token_request(code, code_verifier)
|
|
|
|
# Carregar o JSON do arquivo texto
|
|
tokens = extract_tokens_2(token)
|
|
if tokens:
|
|
Access = tokens["access_token"]
|
|
#print("ID Token:", tokens["id_token"])
|
|
#print("Refresh Token:", tokens["refresh_token"])
|
|
else:
|
|
print("Falha ao carregar ou processar o JSON.")
|
|
|
|
url = c.consultoras(Access, d.acumulado_mes_atual()[0], d.acumulado_mes_atual()[1])
|
|
baixar = requests.get(url)
|
|
file_name = f"consultoras{d.data_hora_atual()}.xlsx"
|
|
if baixar.status_code == 200:
|
|
# Salvar o conteúdo do arquivo
|
|
with open(file_name, "wb") as file:
|
|
file.write(baixar.content)
|
|
dados = extract_data(file_name)
|
|
realizado = busca_realizado(codigo_pesquisar, file_name)
|
|
print(f"Arquivo salvo com sucesso como {file_name}.")
|
|
else:
|
|
print(f"Erro ao acessar o arquivo. Código de status: {baixar.status_code}")
|
|
return realizado |