1. TOPTOP
  2. Webサービス
  3. PHP

PHPとMySQLを使ってTwitter APIで取得したツイートの追加と削除を繰り返す(その3~データ追加のためのプログラミング)

|

php

今回は、ツィートの追加と削除を繰り返すために、追加のプログラムを実際に作成します。前回の記事(新しいタブで開く)はこちらまで。

テーブルの構造

プログラミングをする前に、データベースをにツイートを挿入するための、テーブルを用意しておきましょう。

自分のつぶやきで、ステータスIDの桁数を数えたら、18桁ありました。将来、何桁になるのか見当がつきませんので、tw_idはText型にしておきます。

create table tweet (
	id int(11) not null auto_increment primary key,
	tw_id text,
	tw_screen varchar(16),
	tw_date varchar(25),
	tw_txt text
);

1回目のツイートを100件追加

プログラムの内容

最初、データベースには何も入っていません。1回目のツイート追加のプログラムは、次のような流れになります。

  • twitteroauthライブラリを読みこむTwitterOAuthでインスタンス化する
  • OAuthRequestメソッドを使って、user_timeline.jsonのエンドポイントにアクセスする
  • ユーザータイムラインの引数(array)を設定するPDOクラスでデータベースに接続する
  • ステータスID、スクリーンネーム、ツイート日時、ツイート本文をデータベースに挿入する
  • 格納したツイートの中で、最大のステータスIDを抽出する
  • 文字列型のステータスIDを数値型に変換する

実際のプログラム

実際にプログラミングをすると、こんな感じ

<?php

// twitteroauthライブラリ
require_once("twitteroauth/twitteroauth.php");

$consumerKey = "MYCONSUMERKEY";
$consumerSecret = "MYCONSUMERSECRET";
$accessToken = "MYACCESSTOKEN";
$accessTokenSecret = "MYACCESSTOKENSECRET";

// TwitterOAuthでインスタンス化する
$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);

// user_timeline.jsonのエンドポイントにアクセス
// 引数(array)を設定
$request = $twObj->OAuthRequest('https://api.twitter.com/1.1/statuses/user_timeline.json','GET',
    array(
        'count'=>'100',
        'screen_name' => 'echizenya_yota',
        ));
$results = json_decode($request);

if(isset($results) && empty($results->errors)){
    foreach($results as $tweet){
		// PDOクラスによるデータベース接続
		try {
		 	$dbh = new PDO('mysql:host=localhost;dbname=tweet1;charset=utf8', 'myusername','mypassword');
		} catch(PDOException $e) {
		 	var_dump($e->getMessage());
		 	exit;
		}
		// ステータスID、スクリーンネーム、ツイート日時、ツイート本文の挿入
		$stmt = $dbh->prepare("insert into tweet (tw_id, tw_screen, tw_date, tw_txt) values (:tw_id, :tw_screen, :tw_date, :tw_txt)");

		$stmt->bindParam(":tw_id", $tw_id);
		$stmt->bindParam(":tw_screen", $tw_screen);
		$stmt->bindParam(":tw_date", $tw_date);
		$stmt->bindParam(":tw_txt", $tw_txt);

		$tw_id = $tweet->id;
		$tw_screen = $tweet->user->screen_name;
		$tw_date = date('Y-m-d H:i:s', strtotime($tweet->created_at));
		$tw_txt = $tweet->text;

		$stmt->execute();

         // 最大のステータスIDの番号を取得する
		$sql = "select * from tweet where tw_id >= all (select tw_id from tweet)";
		$stmt2 = $dbh->query($sql);
		$statusid_str = $stmt2->fetchColumn(1);

		$stmt2->execute();

		$dbh = null;
	}
  }else{
	echo "関連したつぶやきがありません。";
 }

// 文字列型のステータスIDを数値型に変換
$statusid = intval($statusid_str);

 ?>

2回目のツイートを100件追加

1回目のツイート追加と2回目のツイート追加で、異なるところは、ユーザータイムラインの引数設定(array)です。

1回目の引数

array(
        'count'=>'100',
        'screen_name' => 'echizenya_yota',
        ));

2回目の引数

array(
        'count'=>'100',
        'screen_name' => 'echizenya_yota',
     'since_id' => '$statusid'
        ));

since_idとは、指定したステータスIDより大きい(より最近の)オブジェクトを返すための引数です。その値として、1回目で取得した最大のステータスIDを代入します。

if文を使う

従って、1回目のデータ取得なのか、2回目以降のデータ取得なのかを、if文で条件判定します。

そのプログラムは、こんな感じになるでしょう。

if(1回目のデータ取得) {
	$request = $twObj->OAuthRequest('https://api.twitter.com/1.1/statuses/user_timeline.json','GET',
	array(
        'count'=>'20',
        'screen_name' => 'echizenya_yota',
        ));
} else {
	$request = $twObj->OAuthRequest('https://api.twitter.com/1.1/statuses/user_timeline.json','GET',
	array(
        'count'=>'20',
        'screen_name' => 'echizenya_yota',
        'since_id' => '$statusid'
        ));
}

条件判定文は分かりません

ただし、if文の中で使っている(1回目のデータ取得)というのは、どう書くか分かりません。時間を費やして調べましたが、どうしても分からないので、詳しい人からオフラインで聞くことにします。

次回(新しいタブで開く)は、ツィートの削除とプログラムの定期実行について説明します。

〔参考サイト〕