*

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

関連記事

no image

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

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

記事を読む

no image

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

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

記事を読む

ブログを移行しました

新しいブログはこちら http://queryok.ikuwow.com Middlemanで作っ

記事を読む

no image

MacBookAirが欲しい

空から降ってこないかなあ。

記事を読む

Cent OSサーバを起動するたびにいろいろとプロセスがクラッシュする問題

いつからか、Cent OSサーバを再起動するたびに件名が" full clash repor

記事を読む

no image

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

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

記事を読む

最近の自宅サーバ事情

最近一番問題なのが、以前までMac miniの方で起きていた不定期にネットが切断される現象が、サーバ

記事を読む

no image

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

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

記事を読む

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

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

記事を読む

「ラブライブ! スクールアイドルフェスティバル」が面白い。

4月15日にリリースされた、ラブライブのiOSアプリのゲームが非常に面白い。 ゲームシステムは

記事を読む

ブログを移行しました

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