10年ほど前にあったデリシャスというブックマーク共有サービスから移行して使っているタンブラーの運用について、以前は投稿の連携機能を利用して名言などをツイッターへ流していましたが、そのままだと先頭から140文字を可読性の悪い状態で出力することに起因する手動の編集作業が面倒臭くなったことや次のような理由もあって、タンブラーへ入ってくる興味のあるツイッター投稿に対して「スキ」フラグをつけて保存し、その一覧を参照して定期的にリツイートするようにしました。
最近タンブラーがツイッターハイライトみたいのになってる気がしてきた。
— h. kitago (@hkitago) 2018年3月2日
これはタンブラーとツイッターの API を併用するいわゆるボットと呼ばれるもの(ライブラリは TwitterOAuth と、それにインスパイアして作られた techslides-tumblroauth を使用)で、その中で最も厄介だった部分を考えてみるというのが今回のお題目になり、まずツイッターの URL 形式の種類について調べました。
この条件から次のようなもので利用してみたところ、いくつか取りこぼしが見つかりました。
#https?://twitter.com/?(?:\#!/)?(?:\w+)/status(?:es)?/(\d+)#i
そのログを元に更に調べてみると、この4つに加えてサブドメインの付与 twitter.com
と mobile.twitter.com
について考慮する必要があるということが分かり、現状で次の正規表現で運用しています。
#(?:https?://)?(?:mobile.)?(?:www.)?(?:twitter.com/)?(?:\#!/)?(?:\w+)/status(?:es)?/(\d+)#i
preg_match
関数で $match
に入れたものを var_dump
して確認すると次のように取得できていることが分かります。
array(2) {
[0]=>
string(50) "https://twitter.com/{AccountID}/status/{TweetID}"
[1]=>
string(18) "{TweetID}"
}
これで良し、と思ったところでまた一つ取りこぼしの問題を見つけました。それは to.co で知られる短縮 URL の場合で、運良く Stack Overflow に URL を変換する関数を紹介していた方がいらしたので、タンブラー投稿 JSON データの “caption”、”summary” と “body” キーの文字列値に含まれる短縮 URL を取得して返すように調整して使うことにしました。
function getFollowUrl($string) {
preg_match('#https?://t.co/[a-zA-Z0-9\-\.]{10}#i', $string, $match);
if(!$match) {
return $string;
}
$url = $match[0];
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_NOBODY => true,
CURLOPT_FOLLOWLOCATION => true,
));
curl_exec($ch);
$follow_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close($ch);
return $follow_url;
}
ここで発生した問題は正規表現の g フラグの使い方です。この関数の引数 $string
にはテキストエリア入力による文章が入ってくるので複数の短縮 URL を持っていることがあります。$follow_url
を配列で返せば良いかと思うのですが、この場合(極力避けたい)連投ツイートになってしまうことが必至で、最近ツイッターに実装されたスレッド機能による関連内容の表示にも期待しながら一旦処理を保留することにしました。
最後に余談で、URLを含む際の正規表現はバックスラッシュ地獄を避けるのが吉だと思いました。
処理全体の説明は別の投稿にしたいと思いますが、タンブラーに流れてくる投稿のスキボタンを押すだけでツイッターの運用も可能になるのは大変楽なこと極まりないです。
- 参照:
-
- php – Regex: Extract Tweet Username and ID From URL – Stack Overflow
- Regex Twitter Username from different URLs in PHP – Stack Overflow
- php – converting twitter short url to original and getting numbers of tweets containing that url – Stack Overflow
- abraham/twitteroauth: The most popular PHP library for use with the Twitter OAuth REST API.
- Tumblr API Example using oAuth and PHP | TechSlides