Last active
May 9, 2021 10:34
-
-
Save thotypous/e9e4e596b29345f74fbfc0f2f71a6be0 to your computer and use it in GitHub Desktop.
Gera automaticamente certificados para uma ACIEPE no SEI da UFSCar
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import xml.etree.ElementTree as ET | |
from urllib.parse import urlencode | |
from html import unescape | |
import argparse | |
import requests | |
import locale | |
import time | |
import csv | |
import os | |
import re | |
locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8') | |
parser = argparse.ArgumentParser(description='Cria certificados no SEI') | |
parser.add_argument('--notas', required=True, type=argparse.FileType('r'), | |
help='notas em csv') | |
parser.add_argument('--processo_sei', required=True, | |
help='número do processo no SEI') | |
parser.add_argument('--processo_proex', required=True, | |
help='número do processo no proexweb') | |
parser.add_argument('--atividade_nome', required=True, | |
help='nome da atividade') | |
parser.add_argument('--atividade_inicio', required=True, | |
help='data de início da atividade') | |
parser.add_argument('--atividade_fim', required=True, | |
help='data de fim da atividade') | |
parser.add_argument('--atividade_horas', required=True, | |
help='total de horas da atividade') | |
args = parser.parse_args() | |
def sei_encode(data): | |
return {'data': urlencode(data, encoding='iso-8859-15').encode('ascii'), | |
'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=ISO-8859-1'}} | |
def get_hdn(text): | |
hdn = {} | |
for m in re.finditer(r'<input type="hidden" .*?name="(hdn.*?)" value="(.*?)"', text): | |
name, value = m.groups() | |
hdn[name] = value | |
return hdn | |
s = requests.session() | |
s.hooks = { # type: ignore | |
'response': lambda r, *args, **kwargs: r.raise_for_status() | |
} | |
# Login | |
login_url = 'https://sei.ufscar.br/sip/login.php?sigla_orgao_sistema=FUFSCar&sigla_sistema=SEI&infra_url=L3NlaS8=' | |
r = s.get(login_url) | |
m = re.search( | |
r'<input type="hidden" id="hdnCaptcha" name="hdnCaptcha" class="infraText" value="(.*?)"', r.text) | |
hdnCaptcha, = m.groups() | |
r = s.post(login_url, **sei_encode({'txtUsuario': os.getenv('SEI_USER'), | |
'pwdSenha': os.getenv('SEI_PASS'), | |
'selOrgao': '0', | |
'sbmLogin': 'Acessar', | |
'hdnCaptcha': hdnCaptcha | |
})) | |
m = re.search( | |
r'action="(controlador\.php\?acao=protocolo_pesquisa_rapida&.*?)"', r.text) | |
busca_path, = m.groups() | |
# Busca do processo | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(busca_path), | |
**sei_encode({'txtPesquisaRapida': args.processo_sei})) | |
m = re.search( | |
r'src="(controlador\.php\?acao=procedimento_visualizar.*?)"', r.text) | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(m.group(1))) | |
# Obter link para adicionar documento | |
m = re.search( | |
r'href="(controlador\.php\?acao=documento_escolher_tipo.*?)"', r.text) | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(m.group(1))) | |
m = re.search( | |
r'title="Despacho".*?<a href="(controlador\.php\?acao=documento_gerar.*?)"', r.text) | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(m.group(1))) | |
m = re.search( | |
r'action="(controlador\.php\?acao=documento_gerar.*?)"', r.text) | |
documento_gerar_path, = m.groups() | |
m = re.search( | |
r",'(controlador_ajax\.php\?acao_ajax=contato_auto_completar_contexto_RI1225.*?)'", r.text) | |
completar_path, = m.groups() | |
documento_gerar_hdn = get_hdn(r.text) | |
# setado via js ao submeter | |
documento_gerar_hdn['hdnFlagDocumentoCadastro'] = '2' | |
# Encontrar ID do usuário logado | |
user_id, user_desc, coordenador = None, None, None | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(completar_path), | |
**sei_encode({'palavras_pesquisa': os.getenv('SEI_USER')})) | |
root = ET.fromstring(r.text) | |
for item in root.iter('item'): | |
desc = item.get('descricao') or '' | |
if desc.endswith(' ({})'.format(os.getenv('SEI_USER'))): | |
coordenador = re.search(r'^(.*?) \(', desc).group(1) | |
user_desc = desc | |
user_id = item.get('id') | |
break | |
for row in csv.DictReader(args.notas): | |
aluno_nome = row['Nome'] | |
aluno_cpf = row['CPF'] | |
aluno_nota = row['Média'] | |
aluno_freq = row['Frequência'] | |
aluno_email = row['Email'] | |
print(aluno_nome, aluno_cpf, aluno_nota, aluno_freq, aluno_email) | |
# Criar documento | |
data = documento_gerar_hdn.copy() | |
data.update({'txtDataElaboracao': time.strftime('%d/%m/%Y'), | |
'rdoTextoInicial': 'N', | |
'txtDescricao': 'Certificado de {}'.format(aluno_nome), | |
'selDestinatarios': '100000050', # ProEx | |
'selAssuntos': '954', # 330 Projetos de Extensão | |
'selGrauSigilo': 'null', | |
'rdoNivelAcesso': '1', | |
'selHipoteseLegal': '4', # Informação pessoal | |
'hdnAssuntos': '954±330 - Projetos de extensão', | |
'hdnInteressados': '100000050±Pró-Reitoria de Extensão (ProEx)¥1000005206±Departamento de Computação (DC)¥{}±{}'.format(user_id, user_desc), | |
'hdnDestinatarios': '100000050±Pró-Reitoria de Extensão (ProEx)'}) | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(documento_gerar_path), | |
**sei_encode(data)) | |
# Editar documento | |
m = re.search( | |
r"janelaEditor.location.href = '(controlador\.php\?acao=editor_montar.*?)'", r.text) | |
editor_path, = m.groups() | |
m = re.search( | |
r"infraAbrirJanela\('(controlador\.php\?acao=documento_assinar.*?)'", r.text) | |
assinar_path, = m.groups() | |
m = re.search( | |
r",'(controlador\.php\?acao=documento_enviar_email.*?)'", r.text) | |
email_path, = m.groups() | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(editor_path)) | |
m = re.search( | |
r'action="(editor/editor_processar\.php\?acao=editor_salvar.*?)"', r.text) | |
editar_path, = m.groups() | |
conteudo = '<p><span>CERTIFICADO DE PARTICIPAÇÃO EM ATIVIDADE DE EXTENSÃO</span></p><p> </p><p dir="ltr"><span> Processo: </span>{num_processo_proex}</p><p> </p><p dir="ltr"><span> </span></p><p dir="ltr"><span>Certificamos que <strong>{aluno_nome}</strong></span><span>, CPF N° {aluno_cpf}</span><span>, participou como aluno(a) na Atividade de Extensão: <strong>{atividade_nome}</strong></span><span>, oferecida pelo <strong>Departamento de Computação</strong></span><span> da </span><strong><span>Universidade Federal de São Carlos</span></strong><span>, no período de {atividade_inicio}</span><span> </span><span>a {atividade_fim}</span><span>, em um total de</span><span> {atividade_horas}</span><span> horas.</span></p><p> </p><div align="center" dir="ltr"><table> <colgroup> <col /> <col /> </colgroup> <tbody> <tr> <td> <p dir="ltr"><span>Frequência:</span></p> </td> <td> <p dir="ltr"><span>{aluno_freq}</span></p> </td> </tr> <tr> <td> <p dir="ltr"><span>Nota:</span></p> </td> <td> <p dir="ltr">{aluno_nota}</p> </td> </tr> </tbody></table></div><p dir="ltr"><br /><span> </span></p><p dir="ltr"><span> </span></p><p dir="ltr"><span>São Carlos/SP, {data}.</span></p><p dir="ltr"><span> </span></p><p dir="ltr"><span>Atenciosamente,</span></p><p dir="ltr"><span> </span></p><p dir="ltr"><span> </span></p><p dir="ltr"><span>Prof. Dr. {coordenador}</span></p><p dir="ltr"><span>Coordenador Responsável</span></p>'.format( | |
num_processo_proex=args.processo_proex, | |
aluno_nome=aluno_nome, | |
aluno_cpf=aluno_cpf, | |
atividade_nome=args.atividade_nome, | |
atividade_inicio=args.atividade_inicio, | |
atividade_fim=args.atividade_fim, | |
atividade_horas=args.atividade_horas, | |
aluno_freq=aluno_freq, | |
aluno_nota=aluno_nota, | |
data=time.strftime('%-d de %B de %Y'), | |
coordenador=coordenador, | |
) | |
data = get_hdn(r.text) | |
for m in re.finditer(r'<textarea name="(txa.*?)".*?>(.*?)</textarea>', r.text, re.DOTALL): | |
name, value = m.groups() | |
value = unescape(value) | |
data[name] = value | |
data.update({'txaEditor_837': conteudo}) | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(editar_path), | |
**sei_encode(data)) | |
# Assinar documento | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(assinar_path)) | |
data = get_hdn(r.text) | |
data.update({ | |
'hdnFormaAutenticacao': 'S', | |
'selOrgao': '0', | |
'txtUsuario': coordenador, | |
'selCargoFuncao': 'Docente', | |
'pwdSenha': os.getenv('SEI_PASS'), | |
}) | |
m = re.search( | |
r'action="(controlador\.php\?acao=documento_assinar.*?)"', r.text) | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(m.group(1)), | |
**sei_encode(data)) | |
# Enviar e-mail | |
r = s.get('https://sei.ufscar.br/sei/{}'.format(email_path)) | |
m = re.search( | |
r'action="(controlador\.php\?acao=documento_enviar_email.*?)"', r.text) | |
enviar_email_path, = m.groups() | |
data = get_hdn(r.text) | |
data.update({ | |
'selDe': 'FUFSCar/DC <dc@ufscar.br>', | |
'hdnDestinatario': aluno_email, | |
'txtAssunto': 'Certificado - {}'.format(args.atividade_nome), | |
'txaMensagem': 'Olá {aluno_nome},\r\n\r\nSegue o certificado de participação na {atividade_nome}.\r\n\r\nAtenciosamente,\r\nProf. Dr. {coordenador}\r\nCoordenador Responsável\r\n'.format( | |
aluno_nome=aluno_nome, | |
atividade_nome=args.atividade_nome, | |
coordenador=coordenador), | |
'chkInfraItem2': data['hdnInfraItensSelecionados'], | |
}) | |
r = s.post('https://sei.ufscar.br/sei/{}'.format(m.group(1)), | |
**sei_encode(data)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment