Um script que manda um e-mail quando há um campeonato novo na WCA. A script which send an e-mail when there's a new WCA competition.
"A World Cube Association regula competicões de quebra-cabeças mecânicos que são operados girando-se os lados, comumente chamados de "twisty puzzles". O mais famoso deles é o "Rubik's Cube" (Cubo Mágico ou Cubo de Rubik), inventado pelo professor Rubik, da Hungria. Alguns destes quebra-cabeças são eventos oficiais da WCA. À medida que a WCA evoluiu ao longo da última década, mais de 100.000 pessoas já participaram de nossas competições."
- Fonte: "Quem somos nós" acessado em 08 de Agosto de 2020.
Eu e meus amigos temos como hobbie o speedcubing, simplificadamente: montar cubo-mágico e outros quebra-cabeças no menor tempo possível.
Existem campeonatos oficiais por todo o mundo, organizados pela Organização Mundial de Cubo Mágico (WCA), supracitada.
Nós participamos deles, e é bem comum consultarmos o site da WCA em buscas de competições por perto. Às vezes, entrávamos algumas vezes na semana, e nada; às vezes, esquecíamos de entrar e perdíamos um campeonato tão aguardado. Para resolver este problema, tive a ideia de fazer um script que verificasse o site periodicamente e nos notificasse quanto identificasse uma competição por perto que poderia ser de nosso interesse.
Se inscreva, inserindo seu nome, e-mail, idioma e a cidade que deseja ser notificado preenchendo o seguinte formulário:
Para executar o projeto, eu inicialmente usei Python com as bibliotecas requests
e BeaultifulSoup
para web scrapping no site em sí e smtplib
para o envio de e-mails.
Mas eu fiz uma migração para a linguagem Go, com a API da WCA no lugar do front-end do site. Eu estudei modulação do código em pacotes locais, o uso de bibliotecas como spreadsheet
para conectar-se com a API do Google Planilhas e o gomail
para enviar as notificações.
O código funciona assim:
- Busca os dados da planilha na minha conta do Google (dados dos destinatários e as credenciais para o envio dos e-mails);
- Verifica as competições futuras na cidade de cada destinatário;
- Atualiza na planilha;
- Compara a verificação atual com a última;
- Manda um e-mail caso estes números sejam diferentes;
O log de todo este processo é armazenado num arquivo
main.log
.
Na minha conta do Google, a planilha está organizada neste formato (com os nomes em inglês):
Os dados providos pelo formulário e as verificações anteriores.
Formulário preenchido em | Nome | Cidade | Idioma | Competições Futuras | Última Verificação | |
---|---|---|---|---|---|---|
00/00/0000 00:00:00 | anne | [email protected] | New Jersey | English | 7 | 0000-00-00 00:00:00 |
... | ... | ... | ... | ... | ... | ... |
Meus amigos que concordaram em ser beta testers. Quando o código está em desenvolvimento, ele roda aqui primeiro.
- | Nome | Cidade | Idioma | Competições Futuras | Última Verificação | |
---|---|---|---|---|---|---|
- | tagu | [email protected] | São Paulo | Português | 2 | 0000-00-00 00:00:00 |
... | ... | ... | ... | ... | ... | ... |
O e-mail e senha da conta que envia os e-mails.
Senha | |
---|---|
[email protected] | minh453nh4 |
- Adicionar um
map
em tempo de execução com{cidade : competições futuras}
e se a cidade já foi verificada em outro destinatário, não verificar de novo e pegar este dado domap
. - Adicionar testes em toda a aplicação.
Sugira algo a fazer nos issues :)
Alerta-deCampeonatos-WCA - A script which send an e-mail when there's a new WCA competition.
Copyright (C) 2020 Luis Felipe Santos do Nascimento
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.