*

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

関連記事

Tokyo tower

TOKYO HACKATHONが面白そう

最近発見したTOKYO HACKATHONという学生向けハッカソンイベントが面白そう。

記事を読む

no image

ラブライブ!スクールアイドルフェスティバルが相変わらず面白い。

相変わらずプレイしています。 きちんと毎日ログインするのはもちろん、LPの回復を無駄にしないた

記事を読む

no image

検索エンジンのロボットに対する命令を記述するrobots.txtについてのメモ

Robots... / jeffedoe 毎朝早朝に送られてくるlogwatchからのメールを

記事を読む

no image

YAMAHAのルータ NVR500を買った。

前からIO-DATAの無線LANルータWN-G300DGRの調子が悪かったので、買っちゃった

記事を読む

a0006_002425_m

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

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

記事を読む

no image

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

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

記事を読む

no image

RSSリーダーのReederをこれから本格的に使っていこうと思う。

Googleリーダーのサービスが停止する7/1まであと一ヶ月あまり。今までiPhoneとiPadで使

記事を読む

no image

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

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

記事を読む

no image

/tmpパーティションの領域の拡大をしてみる

今回拡大するのは/tmpパーティション。学校のデータベースの講義でDB2 express-cを使うか

記事を読む

a0002_008425_m

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

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

記事を読む

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

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

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

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

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

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

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

作りました。 HideNicoVideoNews http:/

Tokyo tower
TOKYO HACKATHONが面白そう

最近発見したTOKYO HACKATHONという学生向けハッカ

→もっと見る

  • follow us in feedly
PAGE TOP ↑