Poderes de edição fenomenais… Utilizados pra criar esse banner de twitter de última hora |
O lance de aprender programação é que uma hora você tem que fazer algo pra valer. Além das atividades dos cursos e tutoriais, você eventualmente tem que lançar um projeto (ou arrumar um emprego) que justifique as horas de estudo. Claro, não precisa mergulhar de cabeça e lançar algo muito pretensioso logo de cara.
Nesse texto, o primeiro do que espero ser uma série curta, explico como coloquei meus dedos na água do GitHub com um projeto simples e como planejo expandir ele. Não leia isso como um guia, mas sim como um relato que você pode se basear para evitar os erros ou criar coragem para dar os primeiros passos.
Inspiração
Posso dizer que tudo começou quando olhei o código fonte do Philobot no Github e vi como era simples fazer um bot para o twitter. Eram poucas linhas de código com uma divisão clara de arquivos, o que me deixou inspirado para criar um bot de twitter também. Afinal de contas, o que eu tinha a perder? Estudo Python na faculdade e, até onde sei, essa é a linguagem franca dos bots de twitter. Resolvi então fazer um pequeno protótipo – mas antes, precisava saber o que esse robô faria.
Ideia
Logo de cabeça dá pra pensar em dois tipos de bot no twitter: Os que postam conteúdo (como o FeijoadaBot, que posta memes aleatórios) e aqueles que servem como ferramenta (como os milhares de bots para baixar vídeos). Dá até pra dizer que existem híbridos, já que o PhiloBot faz essas duas coisas.
Enfim, resolvi partir para o que era mais fácil pra mim no momento. Já tenho uma ideia de bot “ferramenta” para fazer, mas é melhor começar com calma para evitar maiores frustrações. Parti então para um conceito simples, um bot que posta notícias falsas geradas aleatoriamente. Ok, sei que pode parecer controverso programar algo que posta notícias falsas, mas o objetivo não é que elas sejam críveis. Queria algo que zoasse o modo como o Brasil funciona no modo aleatório. E claro, estaria estampado em todo lugar que é uma paródia.
Planejamento
Sei que é de praxe escolher quais ferramentas serão utilizadas no projeto logo no início. A questão é que… Esse era meu primeiro projeto, então eu não tinha familiaridade com nada além da própria linguagem de programação. Ficou decidido que escolheria as ferramentas com o andar do projeto.
Agora a pergunta era: como fazer?
Para fazer posts automaticamente no twitter com o python, eu sabia que teria de contar com o Tweepy. Trata-se de uma biblioteca voltada justamente para facilitar a criação de scripts para o twitter, com várias funções disponíveis, além de estar sempre sendo atualizada.
Nessa parte também me dei conta de que precisava criar uma conta de desenvolvedor no Twitter. Fiz todo o processo e fui aprovado rapidamente. Logo criei o perfil do App “Gazeta Robótica” e peguei as keys do aplicativo. A outras chaves necessárias, os tokens do usuário utilizado pelo bot, foram mais difíceis de conseguir. Isso porque elas não podem ser encontradas em qualquer página de configuração do usuário. Para saber os tokens da conta do bot, baixei o RubyGems, que por sua vez me permitiu baixar o Twurl, uma aplicação desenvolvida pela própria equipe do Twitter.
Dentro do Twurl, usei o comando que lhe dá uma URL do twitter para realizar o login e dar permissões ao aplicativo dono das keys fornecidas. O programa registrou os tokens num arquivo .twurlc que tive de procurar pelo computador, aí foi só abrir com o bloco de notas. Para fazer a autenticação e tweets automaticamente, só 2 funções já resolveram:
def criar_objeto_API(): #Realiza verificação e cria variável com dados armazenados
auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(bot_acess_tk, bot_acess_tk_secret)
return tweepy.API(auth)
def enviar_tweet(api_obj,tweet): #Posta tweets
api_obj.update_status(tweet)
Para criar as notícias, decidi começar pelo método .format(), que já tinha usado bastante em atividades da faculdade. Se você não sabe como ele funciona, é mais ou menos assim:
verbo = 'escrevendo'
blog = 'in-senso'
print("Estou {0} no {1}!".format(verbo, blog))
Saída -> “Estou escrevendo no in-senso!”.
Espero que esse exemplo tenha mostrado como o .format(), método nativo do Python, é simples e fácil de entender. Por isso resolvi escolher ele.
A ideia de como fazer o bot funcionar veio então de forma natural: bastava criar uma lista de frases e utilizar o .format() para colocar termos específicos nelas. Assim, criei uma lista de lugares, uma de pessoas, uma de substantivos, etc… E fiz o bot escolher uma frase aleatoriamente, escolhendo também de forma aleatória quais palavras iam entrar na frase à ser postada.
Para escolher a frase aleatoriamente, o computador escolhe um valor aleatório de 1 até QUANTIDADE, constante que representa a quantidade de frases disponíveis.
Para escolher as palavras que seriam encaixadas na frase, usei o random.choice, que recebe como argumento uma lista para retornar um elemento aleatório dela. Inspirado no Philobot, dividi cada lista em duas: uma “comum” e “rara” (com elementos mais pitorescos, mais raros de serem escolhidos pelo software). A função ficou assim:
def recebe_valor(probabilidade, array_raro, array_comum):
#Retorna valor aleatório de uma array ou outra
#ATRIBUIÇÃO DE VALORES
output = 'Null'
chance = random.random()*100
#Processamento
if (chance <= probabilidade):
output = random.choice(array_raro)
else:
output = random.choice(array_comum)
return output
Aqui já temos uma forma do bot fazer tweets automaticamente, de escolher frases e preencher elas com termos para criar notícias aleatórias. Tudo certo, mas um problema veio em mente – e se acontecesse de ele escolher a mesma frase várias vezes em um curto período de tempo? Certamente tiraria a graça dele.
No momento, temos 21 frases que podem ser escolhidas. A chance de sair uma repetida é (1/21)² = 0.22% – um valor pequeno, mas aqui só estamos levando em consideração se sair uma logo depois da outra. Para fazer um cálculo mais preciso, formulei a seguinte função
f(n) = (1/21)² + (20/21)^n
Onde n é a quantidade de frases avulsas entre as frases repetidas.
Assim, há cerca de 60% de chance de ocorrer uma repetição num intervalo considerável de tempo. Para diminuir essa probabilidade, criei um ‘histórico’ de frases já repetidas, que torna a chance de uma frase ser escolhida inversamente proporcional à quantidade de vezes que ela aparece no histórico.
No início do programa, criamos uma lista com tamanho igual ao número de frases possíveis e vamos preenchendo à medida que frases vão sendo escolhidas. Logo que uma nova frase é escolhida, o programa checa se ela já está presente nessa lista. Se não estiver, o processo corre normalmente o número correspondente à frase é adicionado na lista enquanto o valor mais antigo é descartado. Se a frase escolhida já estiver presente na lista, rolamos um valor aleatório para saber se o processo deve seguir normalmente ou se devemos escolher outra frase no lugar. Como resultado final, temos algo assim:
A estrutura final desse projeto já tinha bastante espaço para melhoras, mas… Algo não estava certo. De qualquer forma, o bot estava rodando e você pode ver o resultado final dele na conta do twitter. Eu estava feliz por ter conseguido não só idealizar um projeto, como colocar ele pra funcionar e solucionar problemas de lógica.
Quando postei sobre o bot no meu perfil, um colega logo veio falar sobre bots que geram notícias falsas à partir de notícias reais, utilizando o conceito da Corrente de Markov (que eu nunca tinha ouvido falar até então). Fui dar uma lida no tópico e fiquei impressionado com algumas coisas, principalmente a facilidade de implementar e como esse conceito me obrigaria a implementar diversas novas funcionalidades no bot.
Você veja, o modo como ele funcionava até então era baseado em listas, um método específico e as bibliotecas tweepy e random. Modificando o robô para ele analisar notícias reais e então gerar falsas envolve scrapping de dados, formatação de strings, criação/gerenciamento de dataframes, correntes de markov e, claro, a biblioteca tweepy.
Desde então comecei a trabalhar nessa versão 2.0 do bot e, no dia do lançamento desse post, ele já está praticamente pronto para ser publicado no GitHub e ter o código fonte atualizado. Mas quero ter a oportunidade de lançar a nova versão junto com outro post aqui no in-senso explicando todo o processo de atualização, então… Vejo vocês lá 🙂
Código fonte no GitHub | Conta no Twitter