こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
NABOTは、自分の名前から取りました、はい。洒落てるでしょう(←?)
更新情報通知に投稿されている記事の中からランダム選出して、一日一回つぶやいたら面白いかなーと思った次第です。過去の埋もれていた記事が目に触れる機会が増える見込みです。
今回はTwitterbot、ナボットの作成方法について記述します。
仕様
- このサイト(Wordpress)に既に投稿されている記事をランダムに取得し、Twitterに投稿するbot
- 通常投稿とカスタム投稿を含む(固定ページは除外)
- ライブラリは「abraham / twitteroauth」を使用
- botなので自動実行する設定を組み込む(サーバー設定)
開発時間:3時間弱
作り方
TwitterAPIを使えるようにしておく(2019年10月追記)
開発前に、TwitterAPIを使えるようにしておいてください。
以前はそんなに厳しくなかったのですが、現在(2019年10月時点)は「APIをどのように使うのか」といったことを書かなければなりません。
とはいえ審査が厳しいというわけではないので、ありのままの事実を英語で記述すれば大丈夫です。
WordPress関数を外から使えるようにする
// WordPress関数を使えるようにする
require_once( dirname( __FILE__ ) . '/../wp/wp-load.php' );
読み込み先のパスはbot設置場所などの環境に合わせてください。
データベースに直接アクセスするロジックを書いて、とも思ったのですが、リンクを生成するにあたってパーマリンク生成が面倒なので、今回はこちらの方法を使用しました。
このbot自体が、そこまで重い処理でもないのでネックにはならないかと…
Twitterライブラリを読み込む
// Twitterライブラリ
require ( dirname( __FILE__ ) . '/twitteroauth/autoload.php');
use Abraham\TwitterOAuth\TwitterOAuth;
先ほどダウンロードしてきたライブラリを読み込みます。パスは環境に合わせてください。
Twitter認証情報を設定
// Twitter認証情報4つ
$consumerKey = "コンシュマーキー";
$consumerSecret = "コンシュマーキーシークレット";
$accessToken = "アクセストークン";
$accessTokenSecret = "アクセストークンシークレット";
botを作動させたいTwitterアカウントのAPIキーです。
WordPressから情報を取得する
投稿タイプにカスタム投稿を追加し、その中からランダムに1件取得します。
取得した情報から、botに投稿させたい内容を編集します。
URLはそのまま記述してもただのテキストになってしまうので、Twitter短縮リンクを生成してそれを載せるようにします。
// カスタム投稿タイプを取得
$args = array(
'public' => true,
'_builtin' => false
);
$postTypes = get_post_types($args);
// 通常投稿タイプを追加
$postTypes['post'] = 'post';
// Twitter短縮リンクを生成する
$url = get_permalink($posts[0]->ID);
$api_url = "http://tinyurl.com/api-create.php?url=";
$resultUrl = @file_get_contents( $api_url.$url );
// 投稿する文章を設定
// $post[0]->post_title などで必要なものを取得可能
$string = "投稿したい取得した文章を記述";
Twitterに投稿する
編集した文章をTwitterに投稿します。
140文字以上になっていると投稿エラーで投稿できないので、注意してください。
$api_url = "http://tinyurl.com/api-create.php?url=";
$resultUrl = @file_get_contents( $api_url.$url );
//接続
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
//ツイート 投稿させたい文章をstatusに設定
$res = $connection->post("statuses/update", ["status" => $string]);
投稿例
Twitter動作するとこんな感じになります。
TwitterをCron設定する
botですから、自動投稿してくれないと意味がないですよね。
私はさくらのレンタルサーバーを使用しているので、そこの説明通りに設定しました。
公式サイトもですが、Cron設定方法の解説はこちらがわかりやすいです。
セキュリティ:サーバーからしか実行できないようにする←大切ですよ!
現状のままでは、誰かがURLを踏んでしまうと、ツイートされてしまいます。
これを防ぐためには、「サーバーからしか実行できないようにする」仕組みが必要です。
ここではプログラムで判定させることにしました。
プログラムの頭に
if(!isset($_SERVER['SHELL'])) {
exit;
}
を入れて、シェルでなければ実行させないようにしています。
余談:こういう自動実行系やただの処理系は、クローラーが悪さをするかもしれない
前に経験した話ですが、こういった自動実行プログラムや、「これが実行されたら+1する」的なものを置いていたときに、予想外のツイートや処理が実行されたことがあります。
このときの犯人はクローラーでした。
クローラーがアクセスしに来たので処理が実行されてしまい、予想外のツイートやカウント数になってしまったことが…
なので、URLを踏まれたら実行するようなCronや処理系のプログラムは
- 「クローラーには実行させない」
- 「サーバーからのアクセス以外には実行させない」
仕組みが必要です。
悩んだ、ハマったところ
悩んだ、ハマったポイント1-改行反映されないよ-
投稿文章内の改行がなかなかうまく反映されず、ハマりました。
調べた結果、「改行文字コードを可変にしてあげればいい」とのことでした。
改行がある場合は改行を「\\n」で登録しておいて、最後に「PHP_EOL」で置換しています。
$string = str_replace("\\n", PHP_EOL, $string);
悩んだ、ハマったポイント2-リンクがただのテキストになっちゃうよ-
リンクは表示されるのですが、ただのテキストです。クリックできない。
これ、クリックされないよねー…どうしたらいいんだろう、とあれこれ試行錯誤した結果、短縮URLを使えばいいらしい!ということがわかりました。
ということで、上にもありますが、URLは短縮URLを生成して載せています。
$api_url = "http://tinyurl.com/api-create.php?url=";
$resultUrl = @file_get_contents( $api_url.$url );
悩んだ、ハマったポイント3-画像が表示されないよ-
Twitterの画像が表示されたリンクは「Twitterカード」というようです。
このカードですが、以前はTwitterに申請して許可が下りてからだったようですが、現在(2018/7/14現在)はmetaタグが入っていれば問題ないようです。
WordPressであれば、All in One SEOで設定してしまうのが早そうです。
そうでなければheader.phpなどにmetaタグを直接出力する仕組みを記述する方法を取ります。
これらのタグが出ていれば問題ないようです。
All in One SEOで設定する場合はこちらを参照してください。
以上、TwitterBot、ナボット-NABOT-の作り方でした。
これ、ソース書くの面倒、又は書けないからそのまま欲しい!っていう需要はあるんでしょうか?あるなら配布を考えなくもない…