Um bot do telegram para dividir sabedoria com o mundo! Para ver os resultados, basta acessar meu canal do Telegram, o site oficial ou meu canal no Youtube.
O script utiliza uma base de dados chamada citacoes.db
, a qual pode ser criada conforme abaixo:
import sqlite3
con = sqlite3.connect('citacoes.db');
cur = con.cursor();
cur.execute("CREATE TABLE images (ultima int, image text, red integer, green integer, blue integer, link text)");
cur.execute("CREATE TABLE "citacoes" (autor text, frase text, enviar int)");
con.commit()
As citações que eu utilizei estão disponíves aqui. Uma lista das imagens está disponível aqui, destaco, porém, que eu não sou proprietário dessas imagens, sendo todas disponibilizadas a partir do unsplash.
O código é bem simples, temos três funções: main, quebra_lista_alt, fazedor_de_imagem
.
É a responsável por selecionar a frase, a imagem e enviar para o Telegram.
O código abaixo é usado para selecionar a frase, perceba que o campo "enviar" é utilizado como um marcador, para evitar que uma frase já enviada seja enviada novamente. "Mas por que não excluir da BD?", eu preetendo reutilizar algumas frases à medida que eu for adicionando novas imagens.
# Selecionando a frase
rowid, autor, frase = cur.execute(f"select rowid, autor, frase from citacoes where enviar = 0 ORDER BY RANDOM() LIMIT 1;").fetchall()[0];
cur.execute(f"update citacoes set enviar=1 where rowid = {rowid};");
con.commit();
Abaixo, a seleção da frase, mas com o foco de evitar apenas que a mesma imagem seja enviado duas vezes seguidas:
imagem, red, green, blue, link = cur.execute(f"SELECT image, red, green, blue, link FROM images WHERE ultima=0 ORDER BY RANDOM() LIMIT 1;").fetchall()[0];
cur.execute(f"update images set ultima=0 where ultima=1;");
cur.execute(f"update images set ultima=1 where image = '{imagem}';");
con.commit();
color = (red, green, blue);
"Mas por que você não usou uma API de imagem como...", de fato, eu pensei em usar APIs do tipo como a loremflickr e a Lorem Picsum, o problema é que, como as imagens são aleatórias, há o risco de as palavras terem a mesma cor que o fundo da imagem, tornando a caption ilegível. Eu até considerei editar a imagem com um quadrado monocromático e escrever dentro dele, mas os resultados não me agradaram. No momento, o uso de APIs de imagem continua uma meta de desenvolvimento futuro.
O envio da imagem é feito por uma função assíncrona improvisada, o link é só uma forma de agradecer a Unsplash pelas imagens gratuitas:
async def enviando_mensagem():
await client.send_file('me',"temp.jpg",caption=f"[Foto original]({link})");
with client:
client.loop.run_until_complete(enviando_mensagem());
É a função responsável por escrever a frase selecionada na imagem. Por padrão, a frase é escrita a partir do meio da imagem, utilizando a quebra_lista_alt
para quebrar a frase em diferentes linhas (evitando que a frase saia da imagem). No futuro, pretendo adicionar uma variável "offset" com o objetivo de controlar o ponto de início da frase.
Para ver as opções disponíveis, basta acessar a opção "-h"
>python bot.py -h
usage: bot.py [-h] [--autor AUTOR] [--frase FRASE] [--inserir] [--delete DELETE] [--stats] [--teste]
Um bot para gerar imagens e postar no Telegram automaticamente.
options:
-h, --help show this help message and exit
--autor AUTOR Pesquisar citações de um dado autor.
--frase FRASE Pesquisar citações que contenham o termo inserido.
--inserir Inserir MANUALMENTE novas frases
--delete DELETE Deletar frase com base no rowid
--stats Gera relatório sobre as informações na base de dados
--teste Gera caption com imagem específica para teste
Essa opção permite visualizar todas as frases escritas pelos autores cujo autor se encaixe no padrão especificado. É interessante notar que a entrada é usada para pesquisar no SQL, ou seja, você pode utilizar o "%" para verificar todos os autores dentro daquele padrão.
>python bot.py --autor "Oscar%"
autor: Oscar%
rowid | autor | frase
------------------------------------------------------------------------------------
232 | Oscar Wilde | Os loucos às vezes se curam, os imbecis nunca.
------------------------------------------------------------------------------------
Similar à opção "autor" porém procura por frases contendo a string. Pode ser utilizada em combinação ou separado da função a cima para pesquisar por frases:
>python bot.py --autor "Fried%" --frase "%macaco%"
autor: Fried%
frase: %macaco%
rowid | autor | frase
------------------------------------------------------------------------------------
125 | Friedrich Nietzsche | O macaco é um animal demasiado simpático para que o homem descenda dele.
------------------------------------------------------------------------------------
Usada para inserir frases novas na base de dados e no arquivo json (o qual é usado para exportar as frases para o Github). Após apertar ENTER será exibido um prompt com as strings inseridas. Use a oportunidade para garantir que digitou corretamente e digite "n" caso tenha notado algum erro ou "y" caso tudo certo.
>python bot.py --inserir --autor "Terry Pratchett" --frase "A inteligência de uma criatura conhecida como multidão é a raiz quadrada do número de pessoas dentro dela."
-----------------
autor: Terry Pratchett
frase: A inteligência de uma criatura conhecida como multidão é a raiz quadrada do número de pessoas dentro dela.
-----------------
Posso inserir (y/n)? y
Citações: 299
Usada para deletar frases com base no id:
>python bot.py --delete 299
-----------------
rowid: 299
autor: Terry Pratchett
frase: A inteligência de uma criatura conhecida como multidão é a raiz quadrada do número de pessoas dentro dela.
Deletar?(y/n) y
Fornece estatísticas básicas sobre a base de dados, incluindo número de total de frases, número de frases a ser enviado, número de frases para enviar, autores, dentre outras:
>python bot.py --stats
GERANDO RELATÓRIO. AGUARDE UM POUCO.
========================================================
+------------------------------+------------+
| TOTAL DE FRASES | 300 |
| TOTAL DE FRASES ENVIADAS | 16 |
| TOTAL DE FRASES NÃO ENVIADAS | 284 |
+------------------------------+------------+
+-------------------------+------------+
| Abraham Lincoln | 1 |
| Agatha Christie | 3 |
| Albert Einstein | 8 |
| Andrew Carnegie | 1 |
...
| William Blake | 1 |
| William Shakespeare | 16 |
| Zenão de Cítio, pensador grego | 2 |
+-------------------------+------------+
========================================================
Adiciona watermark à imagem especificada na linha de comando.
>python bot.py --watermark "path_para_sua_imagem\imagem_alvo.jpg"
Autor | Total de Frases |
---|---|
Machado de Assis | 44 |
Mark Twain | 42 |
Abraham Lincoln | 36 |
Stephen King | 31 |
Ruy Barbosa | 30 |
Jean-Jacques Rousseau | 27 |
Robert Frost | 18 |
Helen Keller | 17 |
Marco Aurélio | 17 |
Provérbio Chinês | 17 |
William Shakespeare | 17 |
Douglas Adams | 16 |
Martin Luther King Jr. | 16 |
Mahatma Gandhi | 15 |
Benjamin Franklin | 15 |
Oscar Wilde | 15 |
Stephen Hawking | 14 |
Confúcio | 13 |
John Lock | 13 |
Fernando Pessoa | 12 |
Winston Churchill | 12 |
Sun Tzu | 12 |
Voltaire | 12 |
Jean-Paul Sartre | 12 |
Adam Smith | 11 |
Ayn Rand | 11 |
Pitágoras | 11 |
Charles Chaplin | 11 |
Simone de Beauvoir | 11 |
Erasmo de Roterdã | 11 |
Albert Einstein | 10 |
Florence Nightingale | 10 |
Franklin D. Roosevelt | 10 |
Nicolau Maquiavel | 10 |
Pablo Neruda | 10 |
Sêneca | 10 |
Clarice Lispector | 9 |
Immanuel Kant | 9 |
Thomas Hobbes | 9 |
Franz Kafka | 8 |
T. S. Eliot | 8 |
Charles Bukowski | 7 |
Graciliano Ramos | 7 |
Milton Santos | 7 |
René Descartes | 7 |
Carl Sagan | 6 |
Karl Marx | 6 |
Marie Curie | 6 |
Dito Popular | 6 |
Friedrich Nietzsche | 6 |
Renato Russo | 6 |
Simone Weil | 6 |
Edmund Burke | 6 |
Harvey Specter | 6 |
Henry Ford | 5 |
Malcolm X | 5 |
Jean-Jacques Russeu | 5 |
Neil deGrasse Tyson | 5 |
Buda | 4 |
Júlio Verne | 4 |
Kurt Vonnegut | 4 |
São Tomás de Aquino | 4 |
Steve Jobs | 4 |
Terry Pratchett | 4 |
Rachel de Queiroz | 4 |
Robin Williams | 4 |
Tommas Shelby | 4 |
Lao-Tsé | 4 |
Otto von Bismarck | 4 |
Agatha Christie | 3 |
Aristóteles | 3 |
Peter Drucker | 3 |
Carl Sewell | 3 |
Stan Lee | 3 |
Richard Adams | 3 |
Nikola Tesla | 3 |
Claus Moller | 3 |
Malala Yousafzai | 3 |
Dalai Lama | 2 |
Elbert Hubbard | 2 |
Samuel Johnson | 2 |
Eleanor Roosvelt | 2 |
Mozi | 2 |
Dito Popular Brasileiro | 2 |
Carl Sandburg | 2 |
Walt Disney | 2 |
Zenão de Cítio, pensador grego | 2 |
Provérbio italiano | 2 |
Protágoras de Abdera | 2 |
Provérbio Alemão | 2 |
Will Rogers | 2 |
Will Smith | 2 |
John F. Kennedy | 2 |
John Nash | 2 |
Michael Jordan | 2 |
Aldous Huxley | 1 |
Alexander G. Bell | 1 |
Alexander Soljenitsyn | 1 |
Alfred Tennyson | 1 |
Alvin Toffler | 1 |
Amelia Earhart | 1 |
Anatole France | 1 |
Anderson Silva | 1 |
Andrew Carnegie | 1 |
André Gide | 1 |
Anne Frank | 1 |
Antoine de Saint | 1 |
Ashton Kutcher | 1 |
Audrey Hepburn | 1 |
Ayn Randy | 1 |
Babe Ruth | 1 |
Barrie Hopson | 1 |
Bertrand Russell | 1 |
Beverly Sills | 1 |
Bill Gates | 1 |
Bob Esponja | 1 |
Bob Marley | 1 |
Booker T. Washington | 1 |
Carmen Miranda | 1 |
Catherine Romano | 1 |
Cesare Cant | 1 |
Charles Brower | 1 |
Charles Dickens | 1 |
Charles Swindoll | 1 |
Churton Collin | 1 |
Coco Chanel | 1 |
Constantino C. Vigil | 1 |
Cotton | 1 |
Célia Chaim | 1 |
Dave Lewis | 1 |
Dave Weinbaum | 1 |
Dean Rusk | 1 |
Denis Waitley | 1 |
Denis Walker | 1 |
Diógenes Laércio | 1 |
Dom Resende Costa | 1 |
Doutor Seuss | 1 |
Duke Ellington | 1 |
Earle Wilson | 1 |
Elmer Letterman | 1 |
Enzo Ferrari | 1 |
Ernest Hemingway | 1 |
Eugène Ionesco | 1 |
Eugéne Ionesco | 1 |
Fiódor Dostoiévski | 1 |
Forrest Gump | 1 |
François La Rochefoucauld | 1 |
Georg Wilhelm | 1 |
George Eliot | 1 |
George Gurdjieff | 1 |
George Lichtenberg | 1 |
George Lucas | 1 |
George Santayana | 1 |
George Savile | 1 |
George Washington | 1 |
Geraldo Vandré | 1 |
Gloria Steinem | 1 |
H. Jackson Brown Jr. | 1 |
H. Ross Perot | 1 |
Harols Abbott | 1 |
Henri Barbusse | 1 |
Henry D. Thoreau | 1 |
Horácio | 1 |
Hugh Prather | 1 |
J. P. L. Affonso | 1 |
J. Walters | 1 |
Jacques Prévert | 1 |
Jan Carlzon | 1 |
Jean Paul Sartre | 1 |
Joel L. Griffith | 1 |
Joel Osteen | 1 |
John S. Mill | 1 |
John Sewell | 1 |
John Tschohl | 1 |
John Wayne | 1 |
John Young | 1 |
João Guimar | 1 |
Karl Albrecht | 1 |
Ken O | 1 |
Kevin Kruse | 1 |
Lao Tsu | 1 |
Lao Tzu | 1 |
Lao-Tze | 1 |
Larry Wilson | 1 |
Laurence J. Peter | 1 |
Lecouve | 1 |
Leonard Berry | 1 |
Lord Chesterfield | 1 |
Louis Pasteur | 1 |
Louisa M. Alcott | 1 |
M. J. Babcock | 1 |
Malcolm Forbes | 1 |
Marabel Morgan | 1 |
Mario Andretti | 1 |
Mark van Doren | 1 |
Marry W. Shelley | 1 |
Masaaki Imai | 1 |
Michael de Montaigne | 1 |
Moliere | 1 |
N. V. Peale | 1 |
Neil Armstrong | 1 |
Nelson Mandel | 1 |
Norman Bawes | 1 |
Norman V. Peale | 1 |
Norman Vaughan | 1 |
Norman Vincent Peale | 1 |
Oliver W. Holmes | 1 |
Omar Khayyam | 1 |
Onassis | 1 |
Oprah Winfrey | 1 |
Orison S. Marden | 1 |
Orson Welles | 1 |
Paul Deschanel | 1 |
Paulo Freire | 1 |
Peter Ducker | 1 |
Peter Schutz | 1 |
Phill Knight | 1 |
Abbie Hoffman | 1 |
Platão | 1 |
Provérbio Chin | 1 |
Provérbio Estadunidense | 1 |
Provérbio Galês | 1 |
Provérbio Islandês | 1 |
Provérbio Japonês | 1 |
Provérbio Latino | 1 |
Provérbio Oriental | 1 |
Provérbio Persa | 1 |
Provérbio espanhol | 1 |
Provérbio grego | 1 |
Provérbio romano | 1 |
R. Buckminster Fuller | 1 |
Ralph W. Emerson | 1 |
Reinaldo Polito | 1 |
Richard Whiteley | 1 |
Robert Frost (adaptado) | 1 |
Robert H. Schuller | 1 |
Robert Peterson | 1 |
Ron Bern | 1 |
Ronald Osborn | 1 |
Roy L. Smith | 1 |
Sam Walton | 1 |
Samuel Beckett | 1 |
Samuel Smiles | 1 |
Santo Agostinho | 1 |
Segundo Mandamento da TAM | 1 |
Sholom Aleichem | 1 |
Simone de Beauvoi | 1 |
Soren Kierkegaard | 1 |
Stephen Covey | 1 |
Stubby Currence | 1 |
Sérgio Almeida | 1 |
Sétimo Mandamento da TAM | 1 |
Sócrates | 1 |
Sófocles | 1 |
T.S. Eliot | 1 |
Theodore Roosvelt | 1 |
Thomas Carlyle | 1 |
Vincent Van Gogh | 1 |
W. F. Grenfel | 1 |
W. S. Landor | 1 |
Walter Gagehot | 1 |
Walter Reuther | 1 |
Warren Buffet | 1 |
Warren Buffett | 1 |
William Blake | 1 |
William McKnight | 1 |
xkcd | 1 |
Abigail Van Buren | 1 |