Twitterには外部プログラムとの連携を行うためのAPIが公開されています。現在のColdFusionにはTwitterに接続して処理を行うようなCFタグや関数は用意されていません。そこで、今回はJavaベースで作られたTwitter APIを呼び出すライブラリ「Twitter4J」をColdFusionで利用し、Twitterと連携した処理を試してみたいと思います。
ColdFusion 実験室で公開している情報は、ColdFusionの標準の機能では無いため動作の保証外(未サポート)となります。下記の事項も含めてそれらを予めご認識頂いた上で、参考にされるかどうかをご判断下さい。
今回使用したTwitter4Jライブラリは、Twitter APIのバージョンが変わったことによって認証ルールの制限や変更が行われています。今回紹介したプログラムも、今後の変更によってそのままでは動かなくなる場合もあります。予めご了承下さい。
Twitter4Jライブラリを初め、 このページを作成している時点でのTwitter API のバージョンは 1.1 です。APIの呼び出し回数等の制限については、Twitterの公式サイトやユーザーサイトで情報を確認下さい。
http://www.forest.impress.co.jp/docs/serial/moritalk/20120911_558641.html
http://blog.jp.twitter.com/2012/08/twitter-api-v11aip.html
ColdFusion女史(※以前のTwitter APIバージョンでの接続方法の記事。
http://www.cf-girl.net/tec/27
その他の参考サイト
http://cfmlblog.adamcameron.me/2012/10/sending-tweets-via-coldfusion-via.html
http://twitter4j.org/ja/configuration.html
Twitter APIでの呼び出し回数には制限があります。制限を超える回数の呼び出しを行った場合はTwitter APIからエラーが返され、再び呼び出せるようになるまで待つ必要が出てきます。
今
Twitter4Jライブラリの公式サイトを確認すると、Twitter4Jを介してOAuth認証を行う方法がいくつかあるようです。私は、Twitter4Jの下記のページを参考にして、ConfigurationBuilder クラスを使った接続を試してみました。
http://twitter4j.org/ja/configuration.html
<cfscript> objTwt4jConf = createObject("java", "twitter4j.conf.ConfigurationBuilder"); objTwt4jConf.setOAuthConsumerKey("*********************"); // consumerKey objTwt4jConf.setOAuthConsumerSecret("******************************************"); // consumerSecret objTwt4jConf.setOAuthAccessToken("**************************************************"); // accessToken objTwt4jConf.setOAuthAccessTokenSecret("******************************************"); // accessTokenSecret objTwitterFactory = createObject("java", "twitter4j.TwitterFactory").init(objTwt4jConf.build()); objTwitter = objTwitterFactory.getInstance(); </cfscript>
前述の準備で取得した4つの値をConfigurationBuilderにセットし、それをTwitterFactoryのインスタンスを生成する際に引数に指定します。その後、getInstanceメソッドを呼び出してTwitterオブジェクトを生成しています。
このサンプルでは、タイムラインからツイート検索してその結果を取得します。Twitter4Jの公式サイトに記載されているように、Queryクラスと Twitterオブジェクトのsearchメソッドで検索を行います。
(参考: 4. Tweetの検索)http://twitter4j.org/ja/code-examples.html
<cfscript> objTwt4jConf = createObject("java", "twitter4j.conf.ConfigurationBuilder"); objTwt4jConf.setOAuthConsumerKey("*********************"); // consumerKey objTwt4jConf.setOAuthConsumerSecret("******************************************"); // consumerSecret objTwt4jConf.setOAuthAccessToken("**************************************************"); // accessToken objTwt4jConf.setOAuthAccessTokenSecret("******************************************"); // accessTokenSecret objTwitterFactory = createObject("java", "twitter4j.TwitterFactory").init(objTwt4jConf.build()); objTwitter = objTwitterFactory.getInstance(); //検索する言葉を変数に指定する searchWord = '"ColdFusion" OR "Cold Fusion" OR "コールドフュージョン"'; //twitter4j.Queryクラスのオブジェクトを生成し、検索語を指定する objTwt4jQuery = createObject("java", "twitter4j.Query").init(searchWord); //Twitterオブジェクトのsearchメソッドを実行 objResult = objTwitter.search(objTwt4jQuery); </cfscript>
※デフォルトの設定では1度の呼び出しで15件のツイートを取得しています。取得個数や言語の絞り混みを twitter4j.Queryクラスの setCount や setLang で変更ができるようです(この取得件数もTwitter APIでの制限があるようです)。
objTwt4jQuery.setCount(50); objTwt4jQuery.setLang("ja");
検索結果のオブジェクトにどのようなメソッドがあるかを参照します。<cfdump>やWriteDump()でオブジェクトを指定して確認下さい。
例:writeDump(objResult);
検索した結果の情報は、objResultオブジェクトのgetTweets()メソッドを実行すると取得できます。実行結果は配列で戻され、それぞれの配列の項目には多くのメソッドを持つオブジェクトが配置されていることがわかります。検索結果が何件戻されたかを確認する場合は、配列に対してColdFusionのArrayLen()関数を使用するとよいでしょう。
例:writeDump(objResult.getTweets());
各配列の値にはオブジェクトが格納されていて、getXXXメソッドなどを呼び出すことで情報を取得できるようです。
今回は、下記のメソッドを呼び出して、取得した情報の一覧を表示してみました。
(※ objResult = objTwitter.search(objTwt4jQuery); の後に下記のコードを追加します)
<cfscript> //Twitterの検索結果を取得 aResultSearch=objResult.getTweets(); for (idx=1; idx LTE ArrayLen(aResultSearch); idx=idx+1) { WriteOutput(aResultSearch[idx].getCreatedAt() & "<br>"); WriteOutput(aResultSearch[idx].getUser().getName() & "<br>"); WriteOutput(aResultSearch[idx].getText() & "<br>"); WriteOutput("<hr>"); } </cfscript>
上記で出力される情報以外にも、ユーザのプロフィール画像やリツイート数、フォロー・フォロワーの数など、さまざまな情報も取得することが可能です。
このサンプルでは、タイムラインへ投稿をツイートします。認証が通った状態で、下記のようにプログラミングすることで、投稿をツイートすることができます。投稿は、getInstanceメソッドを呼び出して生成したTwitterオブジェクトのupdateStatusメソッドを実行します。
<cfscript> objTwt4jConf = createObject("java", "twitter4j.conf.ConfigurationBuilder"); objTwt4jConf.setOAuthConsumerKey("*********************"); // consumerKey objTwt4jConf.setOAuthConsumerSecret("******************************************"); // consumerSecret objTwt4jConf.setOAuthAccessToken("**************************************************"); // accessToken objTwt4jConf.setOAuthAccessTokenSecret("******************************************"); // accessTokenSecret objTwitterFactory = createObject("java", "twitter4j.TwitterFactory").init(objTwt4jConf.build()); objTwitter = objTwitterFactory.getInstance(); //今回の実験で追加したのは下記の1行だけです。 status = objTwitter.updateStatus('Hello Twitter4j & CF!'); </cfscript>
ColdFusionでフォーム処理を行い、updateStatus に入れる文字を動的に指定することで、アプリケーションとしての機能を高めることができます。
今回の実験室はいかがだったでしょうか?今回は「検索」と「ツイート(投稿)」のTwitter4J ライブラリのほんのさわりの部分のみの紹介だったのですが、ライブラリをColdFusionから呼び出す例として参考にして頂ければと思います。
ただ、ちょっと直しては確かめるという方法を繰り返すとすぐにTwitter API制限に達してしまって次の処理までしばらく待たされることにもなります。このあたりが今回の一番難しいところだと思います。インターネットにはTwitter4Jに関する有益な情報が数多く公開されています。それらを有効的に活用して頂くと良いと思います。