ブログじゃないもん

IFTTTとPHPでサイト更新時の自動ツイートを時間差で行う

11分くらいで読める

サイト更新のRSSを読み込んで決まった時間に自動ツイートするツール、といえばdlvr.itが便利だったのですが、料金体系が変わって1日3ツイートを超える利用は有料となってしまいました

ある程度の規模のサイトだと3ツイートの枠はすぐ埋まってしまいます。

有料といっても月1,000円くらいなので、そのくらいだったら契約しちゃうのが一番簡単なのですが、上司とか経理に説明して稟議を通すのが面倒くさかったので、PHPが動くサーバー環境があれば無料で実現できる方法をひねり出しました(1日25ツイートまで、という制限はありますが)。

設定の流れ

大枠のフローは以下のとおりです。

  1. RSSを読み込んで別のRSSを生成するPHPを書いておく
  2. IFTTTで決まった時間にこのPHPを叩く
  3. そこで生成された別のRSSをIFTTTで読み込んで自動ツイート

IFTTT(イフト)は「○○が起こったら××をせよ」という命令を書いておくことで自動でいろいろできるやつです。

TwitterとかFacebookとかiOSとかAndroidとかいろいろ対応しているので、WebにアプリにIoTに、汎用性高すぎなサービス

この中にRSSの更新を検知して自動でTwitterに投稿する機能があるのですが、そのまま使うと即時ツイートしてしまいます。

今回行うのは、RSSを時間差で生成することで、サイトの更新時間とTwitterの更新時間にタイムラグを発生させる、という手法です。

 

フロー2の決まった時間にPHPを叩くのはcronでもいいんですが、IFTTTをフロー3でも使うので今回はこちらもIFTTTでやってみます。

最初に書いた「1日25ツイートまで」というのは、IFTTTのツイート投稿制限がこの数字だからです。

RSSを読み込んで別のRSSを生成するPHP

こんな感じのPHPを作って、好きなところにアップロードします。

<?php
// エンコードとタイムゾーンを指定
mb_internal_encoding('UTF-8');
date_default_timezone_set('Asia/Tokyo');

// サイトの通常RSSのURL
$site_feed_url = 'https://notblog.jp/feed.xml';

// 新たに生成するRSSのファイル名を指定
$feed_for_ifttt = '/feed_for_ifttt.xml';
// RSSを吐き出すディレクトリを指定。
// ここではPHPと同じところ、としています。
$feed_path_for_ifttt = dirname(__FILE__). '/'. $feed_for_ifttt;

// 吐き出し用の変数
$output = '';

// 新たな記事かどうかを判定する関数
function is_new($item_date) {
    // 引数の日時と、PHPが叩かれた日の0時のタイムスタンプを比較。
    // ここはPHPが叩かれた時間から24時間以内に更新された、とか
    // 目的に合わせて調整してください。
    $difference = strtotime($item_date) - strtotime('today');
    // 差異が24時間以内なら真を返す(別のRSSに含める)
    if(0 <= $difference && $difference < 60 * 60 * 24) {
        return true;
    }
    return false;
}

// simplexml_load_file関数で通常のRSSを読み込み
$site_feed = simplexml_load_file( $site_feed_url,
    'SimpleXMLElement', LIBXML_NOCDATA );
if( $site_feed ){
    // 吐き出し用の変数にXML宣言などを入れる
    $output .= '<?xml version="1.0" encoding="UTF-8"?>';
    // このあたりの名前空間宣言は必要に応じて入れてください
    $output .= '<rss version="2.0"'
        .' xmlns:content="http://purl.org/rss/1.0/modules/content/"'
        .' xmlns:dc="http://purl.org/dc/elements/1.1/"'
        .' xmlns:media="http://search.yahoo.com/mrss/"'
        .' xmlns:snf="http://www.smartnews.be/snf"><channel>';
    // ここは仕様上必須ですが、使わないんで何でもいいです
    $output .= '<title>俺のサイト</title>'
        .'<link>https://notblog.jp/</link>'
        .'<description>ヤバいサイト</description>';

    // 通常のRSSの<channel>内の<item>を1件1件見て、
    // 必要なとこだけ新しいRSSにコピーしていきます。
    foreach( $site_feed->channel->item as $item ){
        // <pubDate>タグから記事の更新日時を取得
        $item_date = $item->pubDate;
        // 先ほど定義した関数で新たな記事かどうか判定
        if( is_new($item_date) ) {
            // <item>タグとその中身を書いていきます。
            // サイトごとにRSSの書き方は違いますので、
            // 吐き出されている通常RSSを見ながら調整してください。
            // 新しいRSSに入れるのはTwitter投稿に必要なものだけでOK。
            $output .= '<item>'
                .'<title>'. $item->title. '</title>'
                .'<link>'. $item->link. '</link>';
            // 「dc:」とかのやつはこうやって取り出す
            $output .= '<dc:creator>'
                .$item->children('dc', true)->creator
                .'</dc:creator>';
            $output .= '<pubDate>'. $item->pubDate. '</pubDate>'
                .'</item>';
        }
    }
    // 全体を閉じます
    $output .= '</channel></rss>';

    // $output変数に入れた内容で、新しいRSSを生成
    echo 'Total: '
        .file_put_contents($feed_path_for_ifttt, $output)
        .' bytes.<br />';
    // RSSのリンクもPHP上で表示するようにしておくと便利。
    echo 'See <a href="'. $feed_for_ifttt. '">RSS file</a>.';
}
?>

これをサイトの好きなところにアップロードします。

アップロードできたら、PHPにアクセスして正しく動いているか確認しましょう。

IFTTTで決まった時間にこのPHPを叩く

まずIFTTTにアカウント登録します。

右上の「Sign up」か「Get started」から(既にアカウント登録済みであればログインします)。

ログイン後、右上の自分のアバターをクリックすると出てくるメニューで、「Create」を選択します。

IFTTTのレシピは

  1. ○○が起こったら
  2. ××をせよ

という形式。
1の「○○が起こったら」の条件のほうから順番に設定していきます。

検索で「Date & Time」を探し、クリックします。

「毎日○時に~(Every day at)」や「毎時○分に~(Every hour at)」などのオプションがありますが、今回は前者を選択します。

次の画面で時間を指定します。
時間は自由に、分数は15分きざみで選べます。

「Create trigger」をクリックすると、「○○が起こったら」の部分が設定されます。

次に「××をせよ」の命令のほうを設定していきます。

 

検索で「Pocket」を探し、クリックします。

「Connect」をクリックし、Pocketのアカウント登録をします(アカウントを持っている方はログイン)。

Pocketは「はてなブックマーク」のようなソーシャルブックマークサービスの1つですが、ここではPHPを叩くためだけに利用します。

「Save for later」をクリックします。

「URL」に先ほど作ったPHPのURLを入力し、「Create action」をクリックします。

これで、毎日夜10時にPHPを叩いて別のRSSを生成するレシピができました。

「このレシピが動いたときに通知を受け取る(Receive notifications when this Applet runs)」の部分はオフでよいでしょう。

生成されたRSSをIFTTTで読み込んで自動ツイート

あとは、ここで生成されたRSSをもとに自動ツイートの設定をすれば完成です。

先ほどと同じく、IFTTTのレシピの「○○が起こったら」という条件の部分から設定していきます。

メニューから「Create」をクリックして、「RSS Feed」を検索します。

「New feed item」をクリックします。

「Feed URL」に新たに生成されるRSSのURLを入力し、「Create trigger」をクリックします。

ここまでで「○○が起こったら」の部分は完了。続いて「××をせよ」という命令のほうを設定します。

検索でTwitterを選びます。

今回はシンプルに「Post a tweet」を選びます。

次の画面で、ツイート文面を設定できます。

「Add ingredient」で、RSSに含まれる内容を参照できます。

日本語もちゃんと使えますので、好みの文面に編集してください。

「Create action」をクリックして設定完了です。

こちらのレシピの動作通知設定もオフでよいでしょう。

以上ですべての設定が完了です。

注意点・アレンジ

IFTTTでの自動ツイートが発動するのはRSSが「更新」されたときなので、最初に読み込まれたときにはツイートされませんのでご注意ください。

通常のRSSをIFTTTに読み込ませての自動ツイートなどと合わせて1日2回ツイートさせることもできます。PHPを他にも用意すれば3回、4回、……と増やすことも可能(1日25ツイートまでという条件に注意)。

PHPを噛ませているので、特定カテゴリーの記事が更新されたときや、画像を含む記事が更新されたとき、などツイート対象とする記事をPHPのほうで柔軟にフィルタリングできます

ツイート内容も、RSSとIFTTTの連携の部分で余っている「content」領域を使ってランダムな文字列を入れたり他サービスと連携して文言を変えたりできますね。