*

MySQLからツイートを選択してツイートするPHPコード

公開日: : サーバ運用, 未分類 , ,

この記事の所要時間:約9分34秒

Twitter escultura de arena
Twitter escultura de arena / Rosaura Ochoa

Apple信者の毒舌な妹botを作ったので、そこでわかったことなどをメモ。

目的や前提は以下のとおり。

  • cronで2時間毎に実行し、/var/log/autotweet.logにログを記録
  • ツイートはMySQLデータベースから、重み付きランダムで取り出す
  • 呟くTwitterアカウントは既にdev.twitter.comに登録済み
  • abraham氏のtwitteroauthライブラリを使用
  • 重み付きランダムを取り出す関数はweighted_random(別エントリ)

MySQLのユーザbot、パスワードpassword、データベースtwitterbot、テーブルtweetsに、例えば以下のようにツイートを保存しておく。dateはタプルを追加した日付、num_of_timesはつぶやいた回数。

ID tweet date num_of_times
1 おはよう! 2013-06-13 0
2 こんにちは! 2013-06-13 4
3 こんばんは! 2013-06-15 2
4 そう、iPhoneならね 2013-06-16 1

API1.0は先日廃止されたので、twitteroauth-master/twitteroauth/twitteroauth.phpの21行目のpublic $hostをhttps://api.twitter.com/1.1/にした。twitteroauth-masterディレクトリを同じディレクトリに入れておく。botfunction.phpという外部ファイルをrequireしていて、その中にweighted_randomという関数が入っている。中身については別エントリで。

<?php

print date('Y-m-d H:i:s ');

// twitteroauthを読み込む
require_once("twitteroauth-master/twitteroauth/twitteroauth.php");
// 外部関数を読み込み
require_once("botfunction.php");

// dev.twitter.comを見るとわかるキーたち
$consumer_key = "************************";
$consumer_secret = "************************";
$access_token = "************************";
$access_token_secret = "************************";

// OAuthオブジェクト生成
$to = new TwitterOAuth(
$consumer_key,
$consumer_secret,
$access_token,
$access_token_secret);

// MySQLに接続
$MySQLlink = mysql_connect('localhost','bot','password');
if (!$MySQLlink) {
  die('MySQLへの接続に失敗しました。');
}

// データベースの選択
$db_selected = mysql_select_db('twitterbot',$MySQLlink);
if (!$db_selected) {
  die('データベースの選択に失敗しました。');
}

// ツイートを重み付きランダムに取得
$tweetnum = mysql_query('SELECT ID,num_of_times FROM tweets ORDER BY ID;');

// ツイートIDとつぶやかれた回数の読み込み
$itr = 0;
while ($row = mysql_fetch_assoc($tweetnum,MYSQL_NUM) ) {
  $num_of_times[$itr] = $row[1];
  $itr = $itr + 1;
}

// 回数の逆?を重みに。
// つぶやかれた回数が少ないものに大きな重みをもたせる。
foreach ($num_of_times as $key => $num) {
  $weights[$key] = max($num_of_times)-$num+1;
}
$tmp = weighted_random($weights);
$tweetid = $tmp+1; //インデックスを1始まりに

// 改めてツイート内容を取得
$select_tweet = "SELECT tweet FROM tweets WHERE ID = $tweetid ;";
$tweet_ = mysql_fetch_assoc(mysql_query($select_tweet));
$tweet = $tweet_['tweet'];

// TwitterへPOST
$req = $to->OAuthRequest(
  "https://api.twitter.com/1.1/statuses/update.json",
  "POST",
  array("status"=>"$tweet")
  );

// Twitterから返されたJSONをデコードする
$result = json_decode($req);

// echo "<pre>";
// var_dump($result);

// ツイート回数を更新
$numoftimes = mysql_fetch_assoc(
  mysql_query(
  'SELECT num_of_times AS num FROM tweets WHERE ID = '."$tweetid".';'
  )
);
$numoftimes = (int) $numoftimes['num'];

$increment = 'UPDATE tweets SET num_of_times = '
              ."$numoftimes+1".' WHERE ID = '."$tweetid".' ;';
$count_twinum = mysql_query($increment);

if ($count_twinum) {
  $tmp = $numoftimes +1;
  print "Tweet $tweetid was incremented to $tmp.\n";
} else {
  print "Cannot incremented.";
};

$close_flag = mysql_close($MySQLlink);
if (!$close_flag)
  die('Cannot disconnect MySQL.');
}

?>

非常に粗いですが、今のところ問題なく動いてくれている。

自動でツイートさせたければcronに登録する。コードは/usr/share/phpに入れておくとする。もちろんtwitteroauth-masterも。エラー以外のログは/var/log/autotweet.logに書くとする。エラーが出たらcronから登録したメールアドレスにメールが届くようになっている。

# crontab -e
(cronのエディタ)
# 毎日の深夜以外に一時間ごとに実行
00 6-23 * * * /usr/bin/php /usr/share/php/autotweet.php 1 >> /var/log/autotweet.log

ツイートを追加はphpMyAdminを使ってブラウザ上で行うので非常に便利。ツイートの内容ごとにテーブルを分けて、一日につぶやかれる内容のバランスをコントロールするのも良いかもしれない。

[amazonjs asin=”486146188X” locale=”JP” title=”誰でもできるTwitter Botの作り方―人気キャラにつぶやかせる”]

関連記事

NVR500にプロバイダの固定IPサービスを設定する手順

ついに私も、固定IPサービスを使うことにしました。ルータへの設定で若干詰まったのでメモ。自鯖

記事を読む

2dayで新規事業を創る 初めてインターンというものに参加した

昨日一昨日と、とあるベンチャー企業の二日間のサマーインターンに行ってきました。 インターン

記事を読む

no image

新サーバにMaildirディレクトリを移動させたときのトラブル

サーバを作りなおした件で、Postfix・Dovecotサーバもリストアしました。 新サーバで

記事を読む

no image

USB外付けHDDをext4にフォーマットする手順

前エントリの玄人志向のHDDケースを買った。で出来上がった外付けHDDをフォーマットして、Cent

記事を読む

no image

iPhone3GSを綾波レイ仕様にしてみた。

iPhone5を買ってからも、音楽やポッドキャストを聞くときはiPhone3GSがまだ使えるのでまだ

記事を読む

no image

3月に受けたTOEICの結果が返ってきた。

TOEICの結果が封筒で返ってきた。860点だった。 今まで2回受けたが、どちらも全くの無勉強

記事を読む

XtraFinderのアイコン

最強ツールと誉れの高いXtraFinderをインストールしてみたが・・・・

今日はMacのお話。 XtraFinderというものがすごいらしい。 http://www.

記事を読む

no image

ApacheでSSLを有効に(mod_ssl)

動機は、ownCloudをインストールしたこと。自分しか使わないとはいえブラウザでアクセスできるオン

記事を読む

no image

BackWPupでWordPressブログの全てをリストアした

サーバの再構築をした関係で、WordPressブログ(このブログ)の移動をしたのでその時のログ。以下

記事を読む

no image

DockからHDMIに出力するコネクタ

Keynoteから研究室の大型ディスプレイに出力して発表したくて前に買いました。 Apple

記事を読む

ブログを移行しました

新しいブログはこちら http://queryok.ikuwow.co

ChefとAnsibleの比較 〜Ansibleはじめました〜

今まで個人のMacの環境構築には、Brewfileなるものを作成してい

no image
モチベ低い大学院生でも院進学で得られたもの

つい今月の頭に修士論文を提出して、長いプレッシャーから解放されました。

Apple Thunderbolt Displayを使って30分で理解した利点3つ

今まで研究室ではMac ProとDellのちゃちな21インチモニタで作

ニコニコ動画の動画上部のニュースを非表示にするSafari機能拡張

作りました。 HideNicoVideoNews http:/

→もっと見る

PAGE TOP ↑