Commits

lhonda  committed a05e5ab

adicionei uma versao 'classuda', credenciais e um arquivo de unittest

  • Participants
  • Parent commits b645553

Comments (0)

Files changed (4)

+\.pyc
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from pynswers.Answers import Answers
+
+import urllib
+import string
+import random
+import re
+import simplejson
+import time
+from twitter import twitter
+from comofas_credentials import *
+
+class Comofas(object):
+    """
+    Esta classe pretende cumprir a nobre missao de responder
+    a todos os usuarios... Pedro... reescreva este docstring...
+    nao tenho skill p/ descricoes inspiradoras
+    """
+    def __init__(self,twitter_connection=None,answers_connection=None):
+        """
+        o twitter_connection pode ser substituido por outra classe
+        para executar testes offline.
+        """
+        self.twitter_connection = twitter_connection
+        self.twitter_connection.SetXTwitterHeaders('fasassim',"http://twitter.com/fasassim",'Ni!')
+        self.answers_connection = answers_connection
+        self.search_url='http://search.twitter.com/search.json?q=comofas'
+
+    def get_last_feed(self):
+        """
+        este metodo retorna o ultimo resultado, com os
+        campos text e from_user apenas
+        """
+        feed = urllib.urlopen(self.search_url)
+        updates = feed.read()
+        updates = simplejson.loads(updates)
+
+        return updates['results'][0]['text'].lower(), updates['results'][0]['from_user']
+
+    def get_feeds(self):
+        """
+        Este metodo retorna todos os resultados, sem filtrar por text e from_user
+        """
+        feed = urllib.urlopen('http://search.twitter.com/search.json?q=comofas')
+        updates = feed.read()
+        updates = simplejson.loads(updates)
+
+        return updates['results']
+
+    def clean_text(self,txt):
+        """
+        vou falar o obvio: este metodo limpa o texto
+        """
+        pergunta = re.sub('#\w+',' ', txt)
+        pergunta = re.sub('@\w+',' ', pergunta)
+
+        pergunta = pergunta.replace('comofas',' ')
+        s=string.find(pergunta,'http://')
+        if s != -1:
+            t = string.find(pergunta[s+7:], " ")
+            pergunta = string.replace(pergunta,pergunta[s:t+s+7],' ')
+
+        replacements = [(u'é','e'),(u'á','a'),(u'í','i'),(u'ó','o'),(u'ú','u'),(u'â','a'),(u'ê','e'),(u'ô','o'),(u'ã','a'),(u'õ','o'),(u'ç','c')]
+
+        for a, b in replacements:
+            pergunta = pergunta.replace(a, b)
+        for punct in string.punctuation:
+            pergunta = pergunta.replace(punct, ' ')
+
+        pergunta = re.sub('\n','', pergunta)
+        pergunta = re.sub('\s\s','', pergunta)
+
+        pergunta = string.joinfields(pergunta.split(), ' OR ')
+
+        return pergunta
+
+    def nao_entendi(self,usuario):
+        """
+        este metodo pede que o usuario pergunte de outra forma
+        """
+        nao_entendi=[u"Não entendi mt bem, vc poderia me explicar?",u"Vc poderia explicar melhor?", u"Hã? Repete aí, mas fala diferente."]
+        mensagem = self.build_message(to_user=usuario, raw_answer=nao_entendi[random.randint(0,len(nao_entendi)-1)])
+        status = self.twitter_connection.PostUpdate(mensagem)
+        print '-' * 50
+        print "twitter.fasassim(nao entendi) postUpdate: %s" % mensagem
+
+    def build_message(self,to_user, raw_answer):
+        """
+        este metodo:
+        remove palavras que nao ficam bem no final da frase.
+        limita o tamanho da frase
+        """
+        chars = 140
+        msg = "@%s " % to_user
+        chars = chars - len(msg)
+        if len(raw_answer) < chars:
+            return "%s%s" % (msg, raw_answer)
+        last = 0
+        for indice, c in enumerate(raw_answer):
+            if indice > chars:
+                break
+            if c == " ":
+                last = indice
+        # Lista de palavras que não ficam bem no fim da frase.
+        dispensaveis = ['e','a','o','de','da','do','na','no','para','pra','mas','se','que','como','porque']
+        a = raw_answer[:last].split()
+        while a[-1] in dispensaveis:
+            a.pop(-1)
+        return "%s%s" % (msg, " ".join(a))
+
+
+def old_main():
+    """
+    este eh o antigo comofas funcional
+    """
+    answers = Answers()
+    answers.appid = answers_appid
+
+    twitter_api = twitter.Api(username=twitter_username, password=twitter_password)
+
+    comofas =Comofas(twitter_api)
+    ultimos_usuarios={}
+    ultima_pergunta=''
+
+    while (True):
+        time.sleep(random.randint(15,30)*2)
+        (pergunta,usuario) = comofas.get_last_feed()
+
+        follow_counter=0
+
+        ultimos_usuarios[usuario]=1
+
+        if ultima_pergunta == pergunta:
+            continue
+        else:
+            ultima_pergunta = pergunta
+            pergunta = comofas.clean_text(pergunta)
+
+            try:
+                questions = answers.questionSearch({'query':pergunta, 'search_in':'question', 'region': 'br', 'type':'resolved', 'results':'1'})
+            except:
+                continue
+
+            follow_counter = follow_counter + 1
+
+            if follow_counter==5:
+                follow_counter = 0
+                added_friends = twitter_api.GetFriends()
+
+                for friend in added_friends:
+                    if not ultimos_usuarios.has_key(friend.name) and usuario != 'fasassim':
+                        twitter_api.CreateFriendship(friend)
+                        print "twitter.fasassim.following %s" % friend.name
+                        ultimos_usuarios.pop(friend.name)
+                ultimos_usuarios={}
+
+            if questions:
+                for question in questions:
+                    try:
+                        print '-'* 50
+                        print "Twitter: %s\nPergunta: %s \n\n" % (pergunta, question['Subject'])
+                        mensagem = comofas.build_message(to_user=usuario, raw_answer=question['ChosenAnswer'])
+                        meu_timeline = twitter_api.GetUserTimeline(twitter_username)
+                        if mensagem == meu_timeline[0].text:
+                            ultima_pergunta = pergunta
+                            continue
+
+                        print '-' * 50
+                        print "twitter.fasassim postUpdate: %s" % mensagem
+                        status = comofas.twitter_connection.PostUpdate(mensagem)
+                        ultimos_usuarios[usuario]=1
+                    except UnicodeEncodeError:
+                        continue
+            else:
+                #nao_entendi(usuario)
+                pass
+
+
+def run_comofas():
+    """
+    este metodo busca os feeds do twitter, limpa o texto e processa a resposta para cada feed
+    ele nao foi testado e deve ser refatorado p/ dividir as responsabilidades
+
+    twitter keys:
+    [u'iso_language_code',
+ u'text',
+ u'created_at',
+ u'profile_image_url',
+ u'from_user',
+ u'from_user_id',
+ u'to_user_id',
+ u'id']
+    """
+    answers = Answers()
+    answers.appid = 'GwZLVv32'
+
+    twitter_api = twitter.Api(username=twitter_username, password=twitter_password)
+    twitter_api.SetXTwitterHeaders('fasassim',"http://twitter.com/fasassim",'Ni!')
+
+    comofas =Comofas(twitter_connection = twitter_api,answers_connection = answers)
+    last_users=dict()
+
+    follow_counter=0
+
+    while (True):
+        time.sleep(random.randint(15,30)*2)
+        feeds = comofas.get_feeds()
+
+
+        last_feeds=dict()
+        for feed in feeds:
+            if not last_feeds.has_key(feed.get('id')):
+                last_feeds[feed.get('id')] = feed
+
+            usuario = feed.get('from_user')
+            pergunta = feed.get('text')
+            last_users[usuario]=1
+
+            pergunta = comofas.clean_text(pergunta)
+
+            try:
+                questions = answers.questionSearch({'query':pergunta, 'search_in':'question', 'region': 'br', 'type':'resolved', 'results':'1'})
+            except:
+                continue
+
+            follow_counter = follow_counter + 1
+
+            if follow_counter==5:
+                follow_counter = 0
+                added_friends = comofas.twitter_connection.GetFriends()
+
+                for friend in added_friends:
+                    if not last_users.has_key(friend.name) and usuario != 'fasassim':
+                        twitter_api.CreateFriendship(friend)
+                        print "twitter.fasassim.following %s" % friend.name
+                        last_users.pop(friend.name)
+                last_users=dict()
+
+            if questions:
+                for question in questions:
+                    try:
+                        print '-'* 50
+                        print "Twitter: %s\nPergunta: %s \n\n" % (pergunta, question['Subject'])
+                        mensagem = comofas.build_message(to_user=usuario, raw_answer=question['ChosenAnswer'])
+                        meu_timeline = twitter_api.GetUserTimeline(twitter_username)
+                        if mensagem == meu_timeline[0].text:
+                            ultima_pergunta = pergunta
+                            continue
+
+                        print '-' * 50
+                        print "twitter.fasassim postUpdate: %s" % mensagem
+                        status = comofas.twitter_connection.PostUpdate(mensagem)
+                        last_users[usuario]=1
+                    except UnicodeEncodeError:
+                        continue
+            else:
+                #nao_entendi(usuario)
+                pass
+
+
+if __name__=='__main__':
+    old_main()
+    #run_comofas()

File comofas_credentials.py

+twitter_username = 'fasassim'
+twitter_password = 'abc123'
+
+answers_appid='GwZLVv32'
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import unittest
+from comofas import Comofas
+from pynswers.Answers import Answers
+import twitter
+from comofas_credentials import *
+
+class TestComofas(unittest.TestCase):
+
+    def setUp(self):
+        answers = Answers()
+        answers.appid = answers_appid
+
+        twitter_api = twitter.Api(username=twitter_username, password=twitter_password)
+        twitter_api.SetXTwitterHeaders('fasassim',"http://twitter.com/fasassim",'Ni!')
+
+        self.comofas = Comofas(twitter_connection = twitter_api,answers_connection = answers)
+
+    def test_get_last_feed(self):
+        res = self.comofas.get_last_feed()
+        self.assertTrue(len(res) > 0)
+
+    def test_clean_text(self):
+        msg='@comofas para manter  sanidade mental dos incansaveis doidos?'
+        res = self.comofas.clean_text(msg)
+        self.assertEqual(res,u'para OR mantersanidade OR mental OR dos OR incansaveis OR doidos')
+
+    def test_build_message(self):
+    	res = self.comofas.build_message('pvalente',"voce pode abrir a lata com aquele tijolo que deixei na cozinha, pois a revolta dos designers direciona a energia positiva pela Dutra.")
+    	self.assertTrue(len(res)<=140)
+
+if __name__ == '__main__':
+    unittest.main()