URLからツイートIDを取得する正規表現

10年ほど前にあったデリシャスというブックマーク共有サービスから移行して使っているタンブラーの運用について、以前は投稿の連携機能を利用して名言などをツイッターへ流していましたが、そのままだと先頭から140文字を可読性の悪い状態で出力することに起因する手動の編集作業が面倒臭くなったことや次のような理由もあって、タンブラーへ入ってくる興味のあるツイッター投稿に対して「スキ」フラグをつけて保存し、その一覧を参照して定期的にリツイートするようにしました。

これはタンブラーとツイッターの API を併用するいわゆるボットと呼ばれるもの(ライブラリは TwitterOAuth と、それにインスパイアして作られた techslides-tumblroauth を使用)で、その中で最も厄介だった部分を考えてみるというのが今回のお題目になり、まずツイッターの URL 形式の種類について調べました。

http://hkitago.tumblr.com/post/164275112841

この条件から次のようなもので利用してみたところ、いくつか取りこぼしが見つかりました。
#https?://twitter.com/?(?:\#!/)?(?:\w+)/status(?:es)?/(\d+)#i

そのログを元に更に調べてみると、この4つに加えてサブドメインの付与 twitter.commobile.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を含む際の正規表現はバックスラッシュ地獄を避けるのが吉だと思いました。

http://hkitago.tumblr.com/post/164816686035

処理全体の説明は別の投稿にしたいと思いますが、タンブラーに流れてくる投稿のスキボタンを押すだけでツイッターの運用も可能になるのは大変楽なこと極まりないです。

参考:

投稿者: hkitago

個人事業主でウェブと iOS, Android アプリの開発者で一児の父親。JavaScript, ActionScript, AppleScript, PHP, SQL, ObjC, Swift, Java の読書実行試験運用管理を生業とし、Bind, Postfix, Apache を MacOS で使い、エディタは Vi, mi, Kod, Smultron, TextWrangler を経て Coda, Xcode, Android Studio といった IDE と CotEditor を重用しています。