IFTTTとPHPでサイト更新時の自動ツイートを時間差で行う
サイト更新のRSSを読み込んで決まった時間に自動ツイートするツール、といえばdlvr.itが便利だったのですが、料金体系が変わって1日3ツイートを超える利用は有料となってしまいました。
ある程度の規模のサイトだと3ツイートの枠はすぐ埋まってしまいます。
有料といっても月1,000円くらいなので、そのくらいだったら契約しちゃうのが一番簡単なのですが、上司とか経理に説明して稟議を通すのが面倒くさかったので、PHPが動くサーバー環境があれば無料で実現できる方法をひねり出しました(1日25ツイートまで、という制限はありますが)。
設定の流れ
大枠のフローは以下のとおりです。
- RSSを読み込んで別のRSSを生成するPHPを書いておく
- IFTTTで決まった時間にこのPHPを叩く
- そこで生成された別の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の「○○が起こったら」の条件のほうから順番に設定していきます。
検索で「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」領域を使ってランダムな文字列を入れたり他サービスと連携して文言を変えたりできますね。
この記事を書いた人
バフォメット柳生
、千葉県生まれ。ウェブ制作会社 → 出版社のウェブ担当。地下のライブハウスにいがち。ぬか床育て中。