super_banner_728x90

domingo, 12 de junho de 2011

Como criar um bot no Twitter (em Python)

Oi pessoal.

Estive trabalhando num projeto de um bot para o Twitter. Como achei que é relativamente fácil fazer uma aplicação básica, resolvi compartilhar com vocês.
Antes de tudo, você deve instalar o Python e a API python-twitter.

A palavra "bot" vem do inglês "robot" (robô)
O segundo passo é criar uma conta no Twitter e registrar uma aplicação na página de desenvolvimento de aplicativos para o Twitter (clique em "Register your own Twitter application").

Após criar uma aplicação (e estando devidamente logado no site), você deve buscar alguns códigos importantes, na seção "Your apps" (seus aplicativos). Já, já iremos falar deles. Vamos ao código:

# Você deve importar a API
# (é aqui que você confere se deu tudo certo na instalação)
import twitter, time

# Esses códigos aqui embaixo são encontrados 
# na seção que citei acima ("Your apps")
minha_consumer_key = 'AAAAAAAAAA'  # Busque por 'Consumer key'
minha_consumer_secret = 'EEEEE' # Busque por 'Consumer secret'

# Esses dois códigos abaixo estão na seção 'My Access Token'
# no menu do lado direito da tela
meu_oauth_token = 'IIIIIIIII'
# Access Token (oauth_token)
meu_oauth_token_secret = 'OOOOOOOOO'
# Access Token Secret (oauth_token_secret)

# Esse é o comando para se conectar à
# API usando os dados do seu aplicativo
api=twitter.Api(consumer_key        = minha_consumer_key,    \
                consumer_secret     = minha_consumer_secret, \
                access_token_key    = meu_oauth_token,       \
                access_token_secret = meu_oauth_token_secret)

# Como vamos fazer um bot respondedor automático de perguntas,
# vamos verificar suas 'mentions'
mentions = api.GetMentions()

# Para vê-las, você pode executar o seguinte comando
print 'Imprimindo mentions'
for m in mentions:
    print m.id, m.user.screen_name, m.text
# As 'mentions' são tweets, e têm vários atributos legais,
# que você pode ver executado o comando 'dir(mentions[0])'
# No exemplo acima, estamos imprimindo o id da 'mention',
# o nome do usuário que fez a 'mention' e o texto da mesma.
# Quando você chama a função api.GetMentions(), é
# possível obter o 'id' dela. Esse 'id' será 
# importante para, a cada verificação das 'mentions',
# identificar quais são novas. Basta, a cada 
# verificação, comparar o 'id' com o maior 'id'
# verificado anteriormente. Os 'ids' maiores
# indicam 'ids' de 'mentions' novas.


ultima_mention = mentions[0].id
# a API dá as 'mentions' como uma lista, na
# qual as 'mentions' mais novas vêm primeiro

# Agora iremos tratar as 'mentions' e respondê-las
while True:
    # Iremos fazer o programa esperar um pouco a
    # cada requisição, pois o Twitter não permite
    # que se faça muitas requisições em um espaço
    # curto de tempo (o intervalo de 20s é suficiente)
    time.sleep(20)

    # Pegando 'mentions' desde a última obtida
    mentions = api.GetMentions(since_id = ultima_mention)
    for m in mentions:
        # O texto, estará em m.text, e primeiramente iremos
        # retirar o nome da nossa aplicação do texto
        texto = m.text.replace('@perfil_da_aplicacao', '')

        # Se houver a hashtag '#calcule', no tuíte...
        if texto.find('#calcule') >= 0:
            #...iremos calcular como um comando comum
            # do Python (usando a função 'eval'
            # (mas antes, retiramos a hashtag,
            # com a função "replace")
            resultado = str(eval(texto.replace('#calcule','')))

            # Respondendo a 'mention':
            # A linha abaixo pega o nome (no perfil)
            # de quem fez a 'mention'
            quem_fez_a_mention = m.user.screen_name
            # A próxima já responde ao tuíte com
            # o resultado do cálculo
            status = api.PostUpdate('@' + quem_fez_a_mention  \
                                    + ': ' + resultado)
        else:
            # Ideias?
            pass # por enquanto, não faz nada

        # Essas linhas abaixo atualizam o id da última
        # 'mention', para que nas próximas requisições<
        # somente as novas 'mentions' sejam obtidas
        if m.id > ultima_mention:
            ultima_mention = m.id

Pronto! Você já pode usar seu pode para fazer cálculos simples. Se você tiver outras ideias, basta incrementar mais o seu bot. Lembre-se de que, dependendo do que sua aplicação irá fazer, alguma complexidade a mais será adicionada. E não se esqueça de configurar o tipo de acesso da aplicação ("Default Access type") para "Read, Write, & Private Message", que permite que sua aplicação leia dados, escreva (adicione pessoas, tuíte, etc.) e envie DMs (Direct Messages).

Atualização (07/08/2011)
A propósito: nessa brincadeira de criar bots, criamos esses 3 aí embaixo.
@desencurta: Você tuíta "@desencurta uma-url-curta" (ex: "@desencurta http://kingo.to/G0U") aí ele te devolve uma DM com a url original (pra isso vc precisa seguir o @desencurta)

@descobreai: Esse ainda está adquirindo novas funcionalidades. Por enquanto ele responde a cálculos e descobre resultados de jogos de futebol (Brasileirão séries A e B e Libertadores).
Basta vc tuitar "@descobreai #calcule um-cálculo" (ex: "@descobreai #calcule 3+5*8") ou "@descobreai time1 & time2 uma-data um-campeonato" (ex: "@descobreai flamengo & coritiba 06/08 brasileirão") que ele te responde na hora!

@bandejao_usp: Esse tuíta automaticamente o cardápio de todos os restaurantes (vulgo "bandejões") da USP (campus Butantã) todos os dias uma hora antes de os restaurantes abrirem.

@RUdaUFC: Faz a mesma coisa que o @bandejao_usp, mas para o Restaurante Universitário da Universidade Federal do Ceará. O código está disponível aqui: https://github.com/franzejr/RUdaUFC/