*

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

関連記事

DiCEの設定の仕方まとめ

DDNSを利用している皆さんはいつもお世話になるであろう、自動IP通知ツールDiCEの登録の一部始終

記事を読む

zip

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

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

記事を読む

OP25Bを越えてメールの送信を可能にする手順

やっと出来るようになりました。この本のお陰ですほんとに。 送信関連でやったことは、SM

記事を読む

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

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

記事を読む

no image

祝ブログ開設

ブログを開設しました! まずCent OSで自宅サーバーを作成するところから始まって、とりあえ

記事を読む

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

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

記事を読む

部屋がどんどん暑くなる熱源たち

最近は毎日暑いですね。先日エアコンを稼働させ始めました。 家に帰ると閉めきった部屋がもんのすご

記事を読む

no image

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

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

記事を読む

no image

/tmp/orbit-ユーザ名以下の謎のファイルが/tmpパーティションを圧迫する問題

これも以前から解決していなかった問題。tmpwatchの設定を変更することで解決した。 cronか

記事を読む

no image

WordPress記事にツイートを埋め込むテスト

なんとWordPressでは何もプラグインを導入しなくても、デフォルトでTwitterのツイートを貼

記事を読む

ブログを移行しました

新しいブログはこちら 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 ↑