Eyecatch twitter

cron PHP

時限式でブログタイトルとURLをツイートするbotもどきをPHP+cronで作ってみた

2014/01/18

自分でチョイスしたブログのタイトルとURLをツイッターにポストするアプリケーションを作り、cron と連携させ、毎時、自動的にツイートさせる仕組みを作ってみましたので、その内容を公開したいと思います。

ゼロスタートで大体、半日あれば出来る内容なので、このポストを読んだ人でしたら数時間で出来ると思います。

まずは、ツイッター側の作業。
デベロッパー用APIを使用するための前準備です。

アプリケーション作成手順<Twitter側準備>

Step1

Twitter Developers
https://dev.twitter.com/

右上の「Sign in」をクリック。

Twitter-Developers

Step2

ログインします。
今回は既にある、いつも使っているアカウントを使用することとしました。

sign in

Step3

自分のアイコンにメニューがあるので、中から「My applications」を選択

menu

Step4

My applications画面。
何も作成していないので寂しいですね。
「Create a new application」をクリック

applications

Step5

以下の画面になるので、各内容を埋めていきます。

アプリケーションの概要入力

「*」印の必須項目を入力。

Name
アプリケーション名を指定(日本語使用可能)。 ただし既に同じ名前でのアプリケーション登録がある場合や twitterという文字列が含まれる場合は は使用できないらしいです。
とりあえず、「tgReservationTweets」とします。

Description
アプリケーションの簡単な説明を設定。特に無い場合は適当な文字列で埋めて良いらしい。短いとエラーになるらしいので、20文字程度で記述。
とりあえず、「ランダムに取得したブログタイトルを時限式にツイートさせるプログラム」を英文化した「Program to let it-type, the blog title which I acquired at random tweet in a period」を入れてみます。
日本語が使えりゃ良いのですけどね。

Website
自分のホームページ(blogなど)を指定。 ホームページが無い場合は自分のツイッターのホームを指定します。
ブログURL「https://nodoame.net/」を入れてみました。

Callback URL
必須じゃないので、空欄のままにしておきます。

「Yes, I agree」にチェックし、CAPTCHAで指定された文字列を入力し、「Create your Twitter application」ボタンを押下。

Step6

成功すると、先ほど入れた、アプリケーション名の画面になります。

06_tgReservationTweet---Twitter-Developers

「Details」タブの「OAuth settings」欄にある「Consumer key」と「Consumer secret」の値をメモ。

Step7

「Settings」タブに移り「Application Type」の選択値を「Read and Write」にして「Update this Twitter application's settings」ボタンをクリック

07_tgReservationTweet---Twitter-Developers

Step7

「Details」タブに戻って「Your access token」欄にある「Recreate my access token」ボタンを押し、作成されるトークンの「Access token」「Access token secret」の値をメモ。

まとめると、「Consumer key」「Consumer secret」「Access token」「Access token secret」の4つの値が必要なので用意する、という形です。

これで Twitter 側の準備が完了です。

アプリケーション作成手順<PHP作成>

当初、ランダムでポスト内容を取得して流してみようと考えたのですが、古いポストや日記など、あまり意味のないポストを宣伝しても仕方ないと考え、自分で指定した記事をツイートすることとしました。

外部ファイル(CSVファイル)を用意して、そこにツイートする記事のIDを記述する方法を採択。
分かりやすし、簡単ですしね。

毎日同じ内容を流していても変化に乏しいので、ファイル名を曜日にして、読み込むファイルを変えることにもしました。
自分でチョイスした記事を流すというのが今回の目的でもありましたので、多少面倒くさいですが、1週間分のデータを用意します。

これらを箇条書きにするとこんな感じ。

  • 自分で記事をチョイスできるようにする
  • 多少面倒臭いが、曜日分の7ファイルを用意する
  • 曜日でファイル名を作り、(更新しなければ)週刊で同じ記事をツイートする
  • CSVファイルの記述はできるだけ簡単にする

以上を踏まえて、作成します。

Step1 認証関係スクリプトのダウンロード

https://github.com/abraham/twitteroauth/tree/master/twitteroauth/ から、
「twitteroauth.php」
「OAuth.php」

の2つをダウンロード。

ダウンロードの方法はこんな感じで。
FILEをクリック。
08_GitHub

雲のアイコンの、ZIPをクリックすればダウンロードが始まります。
09_GitHub

ダウンロードしたZIPファイルを展開します。

Step2 キック用PHP作成

先ほどのCSVファイルを読み込んで...というのを踏まえて、こういう感じにしてみました。

PHPファイルなので、ブラウザアクセスでキックされると起動してしまうので、ドキュメントルート以外にアップロードする事としますので、require_once するパスもそのようにします。
今回は、www と同階層に「script」ディレクトリを作成し、さらに tgReservationTweets ディレクトをを作成し、設置します。

[php]
//************************************************************
// CSV設定
//************************************************************
$todayWeek = date("D");
$filename = $todayWeek . '.csv';
$nowHour = date("H");

$file = fopen($filename, 'r');
while ( $result = fgetcsv($file, 1024) ) {
if ( $result[0] == $nowHour ) {
$id = $result[1];
break;
}
}

// IDが指定されていない時間は、処理を止める
if ( empty($id) ) {
exit;
}

//************************************************************
// DB設定
//************************************************************
$db = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'database-server',
'login' => 'loginId',
'password' => 'loginPassword',
'database' => 'dbName',
'prefix' => 'wp_',
'encoding' => 'utf8',
);

// DB接続
$dbConnect = mysql_connect($db['host'], $db['login'], $db['password']) or die("MySQLへの接続に失敗しました。");

// データベースを選択する
$sdb = mysql_select_db($db['database'], $dbConnect) or die("データベースの選択に失敗しました。");

// SQL
$sql = 'SELECT * FROM wp_posts WHERE ID = ' . $id;

// クエリを送信する
$result = mysql_query($sql, $dbConnect) or die("クエリの送信に失敗しました。
SQL:".$sql);

// 取得記事を成形
while ( $data = mysql_fetch_array($result) ) {
$postMsg = $data['post_title'] . ' | https://nodoame.net/archives/' . $data['ID'];
}

// 文字コード変換
$postMsg = mb_convert_encoding($postMsg, 'UTF-8', 'UTF-8,EUC-JP,Shif-JIS');

// 結果保持用メモリを開放する
mysql_free_result($result);

// MySQLへの接続を閉じる
mysql_close($dbConnect) or die("MySQL切断に失敗しました。");

//************************************************************
// Twitter設定
//************************************************************
// ライブラリの読み込み
// 「OAuth.php」「twitteroauth.php」を同ディレクトリに配置
require_once('/home/username/script/tgReservationTweets/twitteroauth.php');

// 設定
// Consumer key
$ck = '********************';

// Consumer secret
$cs = '********************';

// Access Token
$at = '********************';

// Access Token Secret
$ats = '********************';

// リクエストを投げる先(固定値)
$url = "http://api.twitter.com/1/statuses/update.xml";

// メソッド
$method = "POST";

// OAuthオブジェクト生成
$toa = new TwitterOAuth($ck, $cs, $at, $ats);

// 投稿
$res = $toa->OAuthRequest($url, $method, array('status' => $postMsg));

// レスポンス表示
header("Content-Type: application/xml");
echo $res;
[/php]

途中で require_once している箇所がありますが、cron で動かす場合はフルパスを書く必要があります。

さくらインターネットの場合、大体、/home/username/www/ が通常、HTMLなどをアップするディレクトリかと思いますので、そのようにします。

同様に、先ほどダウンロードしたスクリプト(twitteroauth.php)内にも require_once している箇所があるので、フルパスにします。

以上のスクリプトを、文字コード UFT-8、改行コード LF で保存。
ファイル名は tgReservationTweets.php とします。

[2013.04.17追記]
ツイッターのAPIのバージョンが、1 → 1.1 に上がるのに伴い、いくつか仕様が変わっています。
このポスト内容で使用変更にひっかかるのが、リクエスト先とポスト先のファイル形式。
ver.1 では xml でしたが、1.1 では xml は廃止され、json のみとなっております。
なので、リクエスト先は、

[php]
$url = "http://api.twitter.com/1.1/statuses/update.json";
[/php]

としてください。
とりあえず、それだけで動作はします。

エラーなど、API からのレスポンスを受け取る際も xml ではなく、json となるため、パーサーなり、デコーダーが必要となりますが、それはまた別途、処理を追加したいと思います。
[追記ここまで]

[2014.01.18追記]
2014年1月14日夜あたりに行われたAPI仕様変更にて、リクエスト先が http ではなく、https に変更になっております。
なので、リクエスト先は、

[php]
$url = "https://api.twitter.com/1.1/statuses/update.json";
[/php]

としてください。
とりあえず、それだけで動作はします。
[追記ここまで]

Step3 表示させる記事設定ファイル(scv)作成

CSVファイルのフォーマットは『ツイート時,記事ID[改行]』とします。
具体的には以下のように。

[php]
9,2552
10,2529
11,2442
12,2378
13,2372
14,2297
15,2233
16,2384
17,2597
18,550
19,2378
20,1121
21,2589
22,2572
[/php]

ファイル名は Sun.csv Mon.csv Tue.csv ?とします。
コチラはShift-JISでも構いません。

Step3 ファイルのアップロード

ではアップロード。
/home/usename/ に、script ディレクトリを作成し、アップします。

アップした .php 3種は、パーミッションを 755 とし、csvファイルは 666 とします。

アプリケーション作成手順<cron設定>

最後に、cron の設定です。

toogieが使用しているサーバはさくらインターネットなので、cronが使えますが、使用しているサーバでcronが使えない方は諦めてください(えー

Step1

コントロールパネルにログイン。

phpのパスを確認します。さくらの場合は /usr/local/bin/php だと思われますが、確認は忘れずに。

10_serversetting

11_path

Step2

cron設定ページヘ。

12_cronmenu

「新規項目の追加」をクリックして、フォームへ移動。

実行コマンドには以下の要領でpathを合わせて記述。

[shell]
cd /home/username/script/tgReservationTweets; /usr/local/bin/php tgReservationTweets.php
[/shell]

毎時5分に起動させる場合は、* * * 5 とします。

13_cron

コマンドに「 1> /dev/null」を追加した場合は、postmaster 宛のメールを送信しなくなります。
無用な人はつけてください。
toogieはデバッグ用にしばらくはつけないで、メールを受信したいと思い、つけていません。
そのうち、問題なく動作するようでしたら、メールを拒否してみようと思っています。

帰ってきたエラー

エラーが有る場合、ツイッターAPIがエラーメッセージをXMLで返してくれます。
実際に受けたエラーを晒しておきます。

[xml]


/1/statuses/update.xml
Could not authenticate you.

[/xml]

OAuth の認証に失敗している際に出る。
コピペミスなどないか確かめてください。

[xml]


/1/statuses/update.xml
Status is a duplicate.

[/xml]

重複ツイートをしようとした際に出る。
今回の仕様では、テストの度にIDを変更の必要があります。

[xml]


/1/statuses/update.xml
Invalid Unicode value in one or more parameters

[/xml]

投稿する文字列の文字コードがUTF-8以外の場合に出る。
SELECTのあとに、mb_convert_encoding で文字コードをUTF-8に変更することで解決。

作成の際には上記3種のエラーでしたが、他にもあるようなので、出た際はググるなりして解決してください。

と、早足でしたが、botもどきの作成方法でした。

-cron, PHP
-, , ,