ラベル twitter の投稿を表示しています。 すべての投稿を表示
ラベル twitter の投稿を表示しています。 すべての投稿を表示

2011-08-15

OAuth on Simple Twitter Bot (2)




ちょっと @yasulabot というネタbotをつくるためだけに、SimpleTwitterBotを弄り直しました。基本的にはREADMEに書かれている通りにregister_pin.pyを実行すれば、OAuth周りの設定は勝手にやってくれるはずですが、個人的につまずいたポイントをちょろっとリストにしてみます。


- 1. botのtwitterアカウントでログインしたブラウザで、OAuthに登録する事。ChromeならCtrl+Shift+Nで開いたブラウザでbotアカウントにログインして、OAuthに登録すると楽。

- 2. デフォルトのAPIのpermissionは"Read only"なので、APIを通してtweetとかdeleteとかしたいならOAuthの設定画面から、Permissionを"Read & Write"に変更すること。

- 3. たぶん、Windowsだとうまく動かない(Issue 1)。Windows非対応。

基本的にこれらの点に注意して、あとはREADME通りにやれば、自作BotがGAE上で動くような気がします。

参考:OAuth on Simple Twitter Bot

2010-09-09

OAuth on Simple Twitter Bot




僕は直前になるまで、というか、実際に仕様変更されるまで気付かなかったわけですが、今月の頭からTwitterのBasic認証が使えなくなったそうですね。従って、Basic認証を用いてTwitterのAPIを使用しているBot達は、仕様変更の日を境に、屍と化してしまっているそうです。

僕が作ったtango! botなども同様に、Basic認証を利用していたので、屍と化してしまいました。ですが、tango! botにザオリクを唱えて欲しい(?)というご要望に応えまして、先週末にOAuth認証システムを実装しました。

で、せっかく実装したので、Simple Twitter Botを例にとって僕の実装例を次の場所に置いておきます。参考になるかどうかは甚だ疑問ではありますが、もし何かの参考になれたら幸いです。



*main.py(要約)
#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
import twitter
import sys, os, pickle
from oauthtwitter import *

# User Setting and Run Twitter Bot
#debug_flag = True
debug_flag = False
MAX_LEN = 140
SEARCH_TERM = u'"hogehoge" OR foobar'
CONSUMER_KEY    = "???"
CONSUMER_SECRET = "???"
KEY_FILE_API    = "api_key.dat"
KEY_FILE_TWITTER = "twitter_key.dat"
BOT_USERNAME = "YOUR_BOT_NAME"
BOT_PASSWORD = "???"

def oauth_twitter():
   access_token = pickle.load(file(KEY_FILE_API))
   return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
                                                                      
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None

   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)

def run(name, pswd, search_term):
   acc_token = pickle.load(file(KEY_FILE_API))
   gae_twitter = AppEngineTwitter()   
   gae_twitter.set_oauth(CONSUMER_KEY,
                         CONSUMER_SECRET,
                         acc_token.key,
                         acc_token.secret)

   results = gae_twitter.search(search_term.encode('utf8'), {'rpp': 20})
   api = oauth_twitter() 
   escape_user_list = []
   escape_user_list.append(name)
   
   # Get most corrently tweeted tweet
   status = api.GetUserTimeline()
   
   for s in status:
      if s.text.startswith("RT"):
         recent_tweet = s.text
         break
      else:
         print "The following tweet would be posted by hand, so skipped it."
         print "Tweet: " + s.text.encode('utf8')
         print
      
   print "Recent Tweet: "+recent_tweet.encode('utf8')
   print

   # Search Most Recent Tweet
   results.reverse()
   flag_enable = 0
   for i,result in enumerate(results):
      rt = "RT [at]" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      
      if flag_enable:
         print "I am going to tweet the tweet above."
         """
         Retweet and exit
         """
         print "I have re-tweeted: "+rt.encode('utf8')
         print "Result of my re-tweeting: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()
               
      if recent_tweet.replace("@", "[at]") == rt.replace("@", "[at]"):
         flag_enable = 1

   if flag_enable:
      print "There are no tweet found that I should tweet."
      exit()
   print
   print "There are no tweets recently tweeted, so tweet the oldest tweet."
   print

   for i,result in enumerate(results):  
      rt = "RT [at]" + result['from_user']  + " " + result['text']  
      rt_len = len(rt)

      print "I am going to tweet the tweet above."
      """
      Retweet and exit
      """
      print "I have tweeted: "+rt.encode('utf8')
      print "Result of my re-tweeting: " + str(gae_twitter.update(rt.encode('utf8')))
      exit()

# overriding API __init__
twitter.Api.__init__ = twitter_api_init_gae

# Start to run
run(BOT_USERNAME, BOT_PASSWORD, SEARCH_TERM)




*使い方(READMEから一部引用)
This bot runs in the following ways.

1. Search tweets using 'search_term' in Twitter.

2. Re-tweet the tweets.


HOW TO SETUP:
1. Register your OAuth client on Twitter
URL: http://twitter.com/oauth_clients
* you MUST choose 'client' for Simple Twitter Bot.

2. Run 'python register_pin.py' and
use CONSUMER_KEY and CONSUMER_SECRET you got from the registeration.

3. Change setting variables(e.g. CONSUMER_KEY, CONSUMER_SECRET) in main.py

4. Run Google App Engine dev_server and visit the following URL
URL: http://localhost:8080/cron/update
* If you finish all of your setting, set debug_flag in main.py off.

5. Done!

Enjoy developing your own twitter bot!

*他、ソースコード一式

*使ったもの
- App Engine Twitter
- python-twitter
- oauth-python-twitter
- Google App Engine

*参考にさせて頂いたサイト

2010-06-28

Simple Twitter Bot on Google App Engine




久々の更新です。mixiやtwitterなどで既につぶやきましたが、先週の週末に衝動的にtwitter botを作ってしまいました。このBotは次のように振る舞います。

1. Twitter上のつぶやきの中から、任意の単語が含まれるtweetを集める。

2. そのtweetをRe-tweetする。

以上です。
実際には例外処理などの細かな処理も含まれていますが、大まかな振る舞いは上述の通りです。この一連の処理を、cronを用いて1時間毎に1回実行します。

下記に、実際のコードの一部(main.py)を引用します。
Twitter Bot作成の参考になれたら幸いです。

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
import twitter
 
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None

   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)

def run(name, pswd, search_term):
   gae_twitter = AppEngineTwitter(name, pswd)
   results = gae_twitter.search(search_term.encode('utf8'), {'rpp': 20})
   api = twitter.Api(username=bot_username, password=bot_password)

   # Get most corrently tweeted tweet
   status = api.GetUserTimeline()
   
   for s in status:
      if s.text.startswith("RT"):
         recent_tweet = s.text
         break
      else:
         print "The following tweet would be posted by hand, so skipped it."
         print "Tweet: " + s.text.encode('utf8')
         print
      
   print "Recent Tweet: "+recent_tweet.encode('utf8')
   print

   # Search Most Recent Tweet
   results.reverse()
   flag_enable = 0
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if flag_enable and result['from_user'] != bot_username and rt_len < max_len :
         """
         Retweet and exit
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()
               
      if recent_tweet == rt:
         flag_enable = 1

   if flag_enable:
      print "There are no tweet found that I should tweet."
      exit()
      
   print "There are no tweets recently tweeted, so tweet the oldest tweet
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if result['from_user'] != bot_username and rt_len < max_len:
         """                                                                    
         Retweet and exit                                                       
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()

# overriding API __init__                                                       
twitter.Api.__init__ = twitter_api_init_gae

# User Setting and Run Twitter Bot                                              
bot_username = 'CafeMiyamaBot'
bot_password = '???'
max_len = 140
search_term = u'Cafe Miyama'
run(bot_username, bot_password, search_term)

なお、上述のコードには、cronの設定などは含まれていません。
詳細な振る舞いおよび設定を知りたい方は、下記のコマンドでcloneしてください。

     $ git clone git://github.com/yasulab/Simple-Twitter-Bot.git

もしくは、下記のGithubレポジトリに直接アクセスしてください。

     http://github.com/yasulab/Simple-Twitter-Bot

bot_usernameとbot_passwordの内容を別のtwitterアカウントに書き換えて、お手持ちのGoogle App EngineのアカウントにdeployするとTwitter Botが動くと思います。加えて、search_termを任意の単語に書き換えれば、オリジナルTwitter Botの出来上がりです。


参考にさせて頂いたサイトおよびコード:
1. Python Twitter, Google Code
http://code.google.com/p/python-twitter/

2. Google App Engineで手軽にTwitterアプリを作成!
http://0-oo.net/sbox/python-box/appengine-twitter

2009-06-28

Twitter + Google Desktop on Linux

I saw my friend said to recommend registration of twitter on his blog, so I registered it! twitterかー, 面白そうだなぁ。

my twitter account


追記:
おお, Google Desktop on Linux + twitterが出来るっぽい! これなら, 結構気軽に使えそうだ.



-"hogehoge"を入力


-twittering!

※gmailのgadgetはメールアドレスが表示されているので消去してます.