2010/12/18

Google App Engineを使って、OAuth対応のTwitterボットの作り方を調べてみました。まず、Twitter APIの操作から



以前、「ASE(Android Scripting Environment)で作成したPythonスクリプトから、OAuth認証を経てTweet出来ました。」の記事でAndroidアプリから、OAuth認証経由でのTweetが出来たので、今度は、Google App Engineで同じことをやってみます。


ASE(Android Scripting Environment)で作成したPythonスクリプトから、OAuth認証を経てTweet出来ました。
http://vivo-design.blogspot.com/2010/10/aseandroid-scripting.html

同様のことを実装されている方のサイトを色々と拝見しました。その中で、下記のサイトの説明がとても分かりやすかったので、その方法で試させてもらいます。

Google App Engineで手軽にOAuthアプリを作成!(Twitterとか!) - AppEngine-OAuth
http://0-oo.net/sbox/python-box/appengine-oauth

 

必要なファイルを確認します。
  • main.py
  • app.yaml
  • basehandler.py
  • appengine_oauth.py
  • appengine_twitter.py

まず、TwitterアプリケーションをTwitterアプリケーションプラットフォームに登録をします。今回は、赤枠の「vivo_bot_by_gae」というアプリケーションを登録しました。この画面は、登録後の画面ですが、新規に追加をする際は、下部にある「新しいアプリケーションを追加」をクリックします。


 アプリケーション登録申請画面が表示されるので、必要事項を入力します。この画面は設定後のものです。


「アプリケーションの種類」は、「ブラウザアプリケーション」を指定します。「コールバックURL」はユーザ登録をするロジックを用意して、そのURLを設定しなければいけません。今回の場合は、

http://vivo-red.appspot.com/oauth/
にて、Twitterへの認証を申請して

http://vivo-red.appspot.com/oauth/callback
にて、Twitter APIより送られてきた認証結果を記録する処理をしています。その後は、記録した認証情報を使って、アクセスしていきます。

よって、「コールバックURL」には
http://vivo-red.appspot.com/oauth/callback
を指定します。

必要な情報を入力後、「保存する」を押すと申請の登録が完了します。

Application Details画面で表示されるので、
  • Consumer key
  • Consumer secret
の値を控えておきます。


次に main.py を3箇所修正します。
  • Consumer key を設定
  • Consumer secret を設定
  • メッセージの表示の部分を自分用に変更
    msg += u'http://vivo-red.appspot.com/oauth/callback からこんにちは!'

下記が変更したソースです。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
Sample for AppEngine-OAuth on Google App Engine
 
See: http://0-oo.net/sbox/python-box/appengine-oauth
See also: http://apiwiki.twitter.com/OAuth-FAQ
'''
 
import logging
import wsgiref.handlers
from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
from django.utils import simplejson
from google.appengine.ext import db
from google.appengine.ext import webapp
 
 
OAUTH_KEY = '*** ここにConsumer keyを設定 ***'
OAUTH_SECRET = '*** ここにConsumer secretを設定 ***'
 
 
class DemoHandler(BaseHandler):
 
  def demo_header(self):
    self.simple_header(u'AppEngine-OAuthのデモ')
 
    self.p(u'

AppEngine-OAuthのデモ

') def demo_footer(self): self.p(' ') self.p('
', True) self.p(u'このページは') self.p('') self.p(u'AppEngine-OAuth と ') self.p('') self.p(u'AppEngine-Twitter のデモです') self.simple_footer() class InitHandler(DemoHandler): def get(self): twitter = AppEngineTwitter() twitter.set_oauth(key=OAUTH_KEY, secret=OAUTH_SECRET) req_info = twitter.prepare_oauth_login() # request_tokenはcallbackされた後で使うのでDatastoreに保存しておく OAuthRequestToken(token=req_info['oauth_token'], secret=req_info['oauth_token_secret']).put() self.demo_header() self.p('') self.p(u'TwitterのOAuthログインへ', True) self.demo_footer() class CallbackHandler(DemoHandler): def get(self): twitter = AppEngineTwitter() twitter.set_oauth(OAUTH_KEY, OAUTH_SECRET) # TwitterからHTTP GETでrequest_tokenが渡される req_token = self.request.get('oauth_token') # Datastoreに保存しておいたreqest_token_secretを取り出す query = OAuthRequestToken.all() query.filter('token = ', req_token) req_tokens = query.fetch(1) # request_tokenとaccess_tokenを交換する acc_token = twitter.exchange_oauth_tokens(req_token, req_tokens[0].secret) # ここまで来ればOAuthを使ってAPIが使える。試しにユーザー名を取得 twitter.verify() name = simplejson.loads(twitter.last_response.content)['screen_name'] self.demo_header() self.p(u'こんにちは、' + name + u'さん!', True) self.p(' ') # 以後は再ログインせずにaccess_tokenを繰り返し使うことができる tw2 = AppEngineTwitter() tw2.set_oauth(OAUTH_KEY, OAUTH_SECRET, acc_token['oauth_token'], acc_token['oauth_token_secret']) msg = u'AppEngine-OAuth (on Python and Google App Engine) ' msg += u'http://vivo-red.appspot.com/oauth/callback からこんにちは!' tw2.update(msg.encode('utf8')) self.p(u'つぶやいたよ(自分のTLを見てね)', True) self.p(' ') if tw2.is_following('uresuji_books') == False: tw2.follow('uresuji_books') self.p(u'@uresuji_books をフォローしたよ', True) self.p(' ') self.p(u'最初のページへ戻る', True) self.demo_footer() #Model(s) class OAuthRequestToken(db.Model): token = db.StringProperty() secret = db.StringProperty() logging.getLogger() routing = [('/oauth/', InitHandler), ('/oauth/callback', CallbackHandler)] application = webapp.WSGIApplication(routing, debug=False) wsgiref.handlers.CGIHandler().run(application)
次に、Google App Engine Launcherを使ってアップします。
アプリを選んで、「Deploy」ボタンをクリックします。


Deploy Application to Googleの認証画面で、Emailとパスワードを入れて、「OK」ボタンを押します。


その後は自動でアップロードが始まり、動作状況がモニタされます。アップが完了すると、ウィンドウを閉じてもいいですよと、メッセージが表示されます。


用意が出来たサイトにアクセスをします。
「TwitterのOAuthログインへ」をクリックします。


Twitterへの認証許可の確認ページが表示されます。「許可する」をクリックします。


認証が完了し、Twitterユーザ名の取得と表示、そのTwitterユーザでのツイート、@uresuji_booksへのフォロー追加を実行した旨の表示がされます。


実際に動作したのかどうかを確認します。正常に動作していました。

ツイートの確認

 

フォロー追加の確認


これで後は、つぶやく内容、何をいつ、つぶやくかを設定していきます。

この内容を確認できるまでに、他にも、沢山のサイトに教えていただきました。ありがとうございます。

Twitter OAuth 自動化 with GAE/Py (Python-twoauth 版) - 混沌脳内
http://d.hatena.ne.jp/blaue_fuchs/20100926/1285497228

TwitterのbotをOAuthに対応させる
http://d.hatena.ne.jp/shibason/20090802/1249204953

TwitterボットをOAuthに対応させてみた - Google App Engine(Python)
http://blog.mudaimemo.com/search/label/google%20app%20engine

Google App Engine + Twitter + OAuthでTwitterにつぶやくためのメモ
http://blog.mudaimemo.com/2010/02/google-app-engine-twitter-oauth.html

GAE用のOAuthライブラリ simpleoauth-gae を作ってる

http://d.hatena.ne.jp/tagomoris/20100523/1274603964

python-twitter とついでに Mercurial を入れてみる

http://d.hatena.ne.jp/idemo/20100905/p2

Python-Twitter API構築
http://k-communication.sakura.ne.jp/blog/?p=83

0 件のコメント:

人気の投稿 (過去 30 日間)