Skip to content

Instantly share code, notes, and snippets.

@thotypous
Last active May 9, 2021 10:34
Show Gist options
  • Save thotypous/e9e4e596b29345f74fbfc0f2f71a6be0 to your computer and use it in GitHub Desktop.
Save thotypous/e9e4e596b29345f74fbfc0f2f71a6be0 to your computer and use it in GitHub Desktop.
Gera automaticamente certificados para uma ACIEPE no SEI da UFSCar
#!/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&Ccedil;&Atilde;O EM ATIVIDADE DE EXTENS&Atilde;O</span></p><p>&nbsp;</p><p dir="ltr"><span>&nbsp;Processo: </span>{num_processo_proex}</p><p>&nbsp;</p><p dir="ltr"><span>&nbsp;</span></p><p dir="ltr"><span>Certificamos que <strong>{aluno_nome}</strong></span><span>, CPF&nbsp;N&deg; {aluno_cpf}</span><span>, participou como aluno(a) na Atividade de Extens&atilde;o: <strong>{atividade_nome}</strong></span><span>,&nbsp;oferecida pelo <strong>Departamento de Computa&ccedil;&atilde;o</strong></span><span> da&nbsp;</span><strong><span>Universidade Federal de S&atilde;o Carlos</span></strong><span>, no per&iacute;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>&nbsp;</p><div align="center" dir="ltr"><table> <colgroup> <col /> <col /> </colgroup> <tbody> <tr> <td> <p dir="ltr"><span>Frequ&ecirc;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>&nbsp;&nbsp;</span></p><p dir="ltr"><span>&nbsp;</span></p><p dir="ltr"><span>S&atilde;o Carlos/SP, {data}.</span></p><p dir="ltr"><span>&nbsp;</span></p><p dir="ltr"><span>Atenciosamente,</span></p><p dir="ltr"><span>&nbsp;</span></p><p dir="ltr"><span>&nbsp;</span></p><p dir="ltr"><span>Prof. Dr. {coordenador}</span></p><p dir="ltr"><span>Coordenador Respons&aacute;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