アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

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

こんにちは、岡本です。

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

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


【前回までの復習】

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


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

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

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

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



sqlite rss.db


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

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

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

【今日の課題】

twitterに記事を投稿する

 twitterは機能の殆どをAPIと言う形で提供しています。
APItwitterのサイトで紹介されている、
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);
  }
}


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

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