アシアルでtwitter始めます(後編)

こんにちは、岡本です。

この間、休みを取って河口湖に行ってまいりました。
とりあえず河口湖を自転車で一周してみましたが、
素晴らしい景色を眺めながらの運動は気分がいいですね。

本日は製作を先延ばしにしていた、
ブログ記事のtwitter投稿プログラムの続きを作りたいと思います

【前回までの復習】

●ブログ記事の取得
 ブログは大抵”RSS”という形で記事の概要を配信しています。
RSSはプログラムにとって利用しやすい書式になっているため、
PHPの関数を使えば簡単に利用することができます。

例えば、simplexml_load_file()という関数にRSSが配信されているURLを渡せば、
僅か一行でRSS情報を利用するためのオブジェクトを生成することができます。

前回はこの機能を使って、ブログ記事の概要を取得しました。

●記事の保存
 取得した記事を即twitterに投稿するのが一番簡単ですが、
そうすると、前に投稿した記事もお構いなしに送信してしまいます。
なので、いったん記事を記録して未投稿のものだけ投稿します。

 記事の記録を行うために、
今回はSQLiteというデータベースを利用します。
SQLiteはパスワード認証や厳密な型の定義など排した、
超お手軽なデータベースシステムです。


sqlite rss.db

上記のようにコマンドライン上で、
コマンドとファイル名を指定するだけで、
データベースファイルを作成することができます。

※尚、SQLiteにはバージョン2とバージョン3があります。
PHPのSQLite関数が標準で直接利用できるのはバージョン2なので、
エラーが出たらバージョンを確認してください。

テーブルの作り方やPHPのソースは、
前回の記事をご参照ください。
アシアルでtwitter始めます(前編)

【今日の課題】

●twitterに記事を投稿する

 twitterは機能の殆どをAPIと言う形で提供しています。
APIはtwitterのサイトで紹介されている、
PHP用のライブラリを使えば簡単に利用できます。
ただ、APIを利用するためには”認証”を行う必要があります。

 ”認証”の仕組みは結構複雑です。
しかし、自分のアカウントに対しての認証であれば、
管理画面から認証用のキーをコピーするだけで簡単に行えます。

 まずは認証キーを取得しましょう。
twitterにログインした状態で
http://dev.twitter.com/
にアクセスし「Register an app」からアプリの登録を行い、
管理画面から認証キーを取得します。

次にライブラリを取得します。

https://github.com/abraham/twitteroauth

上記のサイトからライブラリをダウンロードして、設置します。
今回は”lib”ディレクトリを作成して、
その中に全ての中身を展開してしまいます。


blogbot/
|-- db2tweet.php
|-- get_rss.php
|-- lib
|   |-- DOCUMENTATION
|   |-- LICENSE
|   |-- README
|   |-- callback.php
|   |-- clearsessions.php
|   |-- config.php
|   |-- connect.php
|   |-- html.inc
|   |-- images
|   |   |-- darker.png
|   |   `-- lighter.png
|   |-- index.php
|   |-- redirect.php
|   |-- test.php
|   `-- twitteroauth
|       |-- OAuth.php
|       `-- twitteroauth.php
`-- rss.db

※公開領域に設置するプログラムは、
ライブラリやdbファイルが外部から閲覧できないように注意しましょう。

丁度config.phpというファイルがあります。
折角なので、ここに認証キーの情報を記載してしまいましょう。


<?php
$twitter_config = array(
  'consumer_key' => '*********************',
  'consumer_secret' => '********************************',
  'access_token' => '*********************',
  'access_token_secret' => '***************************************'
);

定数じゃなくて配列を使うのは私の趣味です、はい。

最後に、投稿用のプログラムを設置します。


<?php
//tweeter用ライブラリも読み込む
 include_once('lib/twitteroauth/twitteroauth.php'); 
//twitterと接続するための設定を読み込む
include_once('lib/config.php');
$twitterOAuth = new TwitterOAuth(
                  $twitter_config['consumer_key'],
                  $twitter_config['consumer_secret'],
                  $twitter_config['access_token'],
                  $twitter_config['access_token_secret']
);
$link = sqlite_open('rss.db');
// 未投稿の記事を取得する
$query  = "SELECT * FROM rss WHERE tweeted_flag = 0 "; 
$result = sqlite_unbuffered_query($link, $query);
$rss = sqlite_fetch_all($result);
// 未投稿の記事があれば投稿する
if (count($rss)) { 
  foreach ($rss as $record) 
  {
    $tweet = $record['title']." ".$record['link'];
    $twitterOAuth->OAuthRequest(
                      "https://twitter.com/statuses/update.json",
                      "POST",
                       array(
                           "status"=> $tweet
                       )   
                   );  
    // 投稿済みフラグを立てる
    $escaped_link = sqlite_escape_string($record['link']);
    $query = "UPDATE rss SET tweeted_flag = 1 WHERE link = '$escaped_link' " ;
    $result = sqlite_query($link, $query);
  }
}

コマンドライン上から実行し、記事が投稿できることを確認しました。
このプログラムが自動的に実行されるよう、サーバの設定をすれば完成です。

しかし、何処のサーバに設置しようかな、考えていなかった。