Google App Engine + Twitter + OAuth

Google App EngineOAuth認証になったTwitterにツィートする

半年前に自分用に書いたメモですが,いまのところはまだ有効な情報なのでアップしておきます.読みにくかったらすまぬ.

方針

ほとんどのサイトに書いてある情報は,Eclipseを用いてプロジェクトを作成するようになっている.でもわたしの場合は基本が分かっていないので,Eclipseはつかわずコマンドラインからするべきと判断.Eclipseはつかわなくても,antコマンドを使えば十分コマンドラインからでもプロジェクトが作れる.

注意点

  • TwitterBasic認証だったころ(Oauth認証が採用される前)の2010年9月以前の記事は基本的に参考にならない.なのに検索サイトの上位を占めており,正確な情報を得るのに苦労する.
  • Google App EngineJRubyを用いるのはやめたほうがよい.負荷が高いため,高い確率でGAEの挙動が不安定になり,毎日の定期的なツィートなどが失敗しやすい.

antコマンドでGoogle App Engineをためす

  • Google App EngineSDKをダウンロードする.
  • new_project_templateをもとにプロジェクトを新規作成.
  • 他の資料と合わせるために,build.xmlの40行目のlocationを,"www"→"war"に変更するとよい.
  • antのインストール

Google App Engine Javaで遊んでみる - syttruの日記

コンパイル
$ ant


ローカルで確認するため http://localhost:8080/ を有効にする
$ ../bin/dev_appserver.cmd ../アプリの名前/war


アップロード
$ ../bin/appcfg.cmd update war

Google App EngineからTwitterにツィートさせる

  • Twitter4J 2.2以降はTwitterFactory.getOAuthAuthorizedInstance()がつかえないなど,大幅な仕様変更が行われているため,ほとんどのサイトは参考にならない.公式サイトすらあてにならない.

Twitter4J - A Java library for the Twitter API
OAuth - SANADAの実験工房

try{
TwitterFactory factory = new TwitterFactory();
Twitter twitter = factory.getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
twitter.setOAuthAccessToken(new AccessToken(TOKEN_KEY, TOKEN_SECRET));
twitter.updateStatus(message);
}catch(TwitterException e){
}

  • twitter4j-core-2.2.3.jarをwar\WEB-INF\libにコピー.
  • bulid.xmlの76行目あたりに次のテキストを追加すると,クラスパスが追加できる.



Herokuを使って1日1回名言をツイートするTwitter Botの作り方 - アインシュタインの電話番号☎

$ gem get-twitter-oauth-token
$ get-twitter-oauth-token

cronの設定

  • 毎日1回つぶやくようにcron.xmlの設定.
  • cronで起動するパスを他の人からアクセスできないよう,admin限定にweb.xmlで設定.

ログ出力

  • cronで起動すると目では見られないので,ログ出力させよう

import java.util.logging.Logger;
Logger logger = Logger.getLogger(this.getClass().getName());
logger.info(message);

さいごにメモ

  • どうやらGAEはURLのキャッシュをしているようなので,ウェブサイトを参照するとその情報が古い場合がある.

GAE/JでのURL Fetchで取得したデータがGoogleにキャッシュされてる? - RIA Service