言語(PHP他)PHPその他技術系
更新日 : 2022年5月13日
投稿日 : 2018年7月15日

【PHP×WordPress】エンジニア婦人ノートの記事をTwitterに投稿するBot

【PHP×WordPress】エンジニア婦人ノートの記事をTwitterに投稿するBotの画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。

NABOTは、自分の名前から取りました、はい。洒落てるでしょう(←?)

更新情報通知に投稿されている記事の中からランダム選出して、一日一回つぶやいたら面白いかなーと思った次第です。過去の埋もれていた記事が目に触れる機会が増える見込みです。

今回はTwitterbot、ナボットの作成方法について記述します。

仕様

  1. このサイト(Wordpress)に既に投稿されている記事をランダムに取得し、Twitterに投稿するbot
  2. 通常投稿とカスタム投稿を含む(固定ページは除外)
  3. ライブラリは「abraham / twitteroauth」を使用
  4. 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動作するとこんな感じになります。

botが投稿した紹介記事

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-の作り方でした。

これ、ソース書くの面倒、又は書けないからそのまま欲しい!っていう需要はあるんでしょうか?あるなら配布を考えなくもない…

参考元

PR

※本サイトはアフィリエイトプログラムを利用して商品を紹介しています。