*

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の作り方―人気キャラにつぶやかせる”]

関連記事

ソースコードを綺麗に貼り付けるWordPressプラグイン

Cent OS サーバ運用開始から二日目。FTP機能もきちんと整備して、WordPressの

記事を読む

no image

4つのiOSデバイスにどのように音楽を振り分けるか考えてみた

Mi iPod con vídeo / juanpol もう8年間ぐらい、定期的にTSUT

記事を読む

ApacheにDigest認証を設定する方法

私は自鯖でownCloud、phpMyAdmin、Cactiを使っているのですが、外部に外部

記事を読む

no image

rsyncで毎日自動差分バックアップを構成

毎日の明け方に、外付けHDDにrsyncバックアップをするようにした。rsyncを実行するシェルスク

記事を読む

Postfixの本をちまちま読んでいる

メールサーバはできているものの、OP25Bを乗り越えるのがうまく行かず、メールの送信だけができない状

記事を読む

no image

外付けHDDを起動時に自動マウントする

  前エントリでフォーマットからマウントまでやったが、自動マウントの設定を忘れていた

記事を読む

zip

懐かしきストレージZIPを実家からもらって写真を撮った

実家から昔使っていたZIPを持ってきたので、一応写真をとっておくことにしました。 ZIPとはフ

記事を読む

no image

Postfixのroot宛のメールを全て特定のユーザに

はじめての英語論文もいちおう書き上がったので、サーバいじりを再開。 /etc/aliase

記事を読む

MyDNSの自動更新のためにDiCEを導入

すっかりすっかり忘れていた、DiCEの導入。 こちらのサイトを参考にしました。毎回お世

記事を読む

no image

Twitterで自動フォロー返しをするPHPコード

Apple信者の毒舌な妹botで使用している自動フォロー返しのコードをメモ。前提は Githu

記事を読む

ブログを移行しました

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

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

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

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

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

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

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

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

作りました。 HideNicoVideoNews http:/

→もっと見る

  • follow us in feedly
PAGE TOP ↑