ツイートにリンクを追加する PHP スクリプト(TwitterEntitiesLinker)

(追記)指定した文字列をハイライトするための機能も追加しました。

twtr2src で、ツイート内の URL、@mention、ハッシュタグ(これらをエンティティと呼びます)に自動的にリンクを張るを処理を入れているのですが、パースがうまく行かないケースがあって、リンクが張れないことがありました。その結果、Evernote 投稿時に XML バリデーションエラーになってしまい、投稿されていないケースがあります(後日対策予定)。

最近の Twitter API では、ツイート本文の他に、それらエンティティの情報も含まれていて、その内容や位置を取得できるようになっています(参考:Tweet Entities)。

その情報を使って、ツイートにリンクを張るスクリプトを書いてみました。

twitter_entities_linker.php at master from ogaoga’s TwitterEntitiesLinker – GitHub

下記のような感じで使えます。

// $tweet should be an object of tweet.
$html = TwitterEntitiesLinker::getHtml($tweet);

引数 $tweet には、JSON を json_decode() でデコードして得られるオブジェクトを渡します。クラスにするほどでもないですが、ソートの比較関数をカプセル化できたので、クラスにしてみました。

ただ、実は Twitter API が返してくる entities の情報の中で、URL の一部であるアンカーをハッシュタグと間違えて認識しているようで、その位置を返してしまっているようです。なので、アンカー付き URL を含むツイートの場合は、うまくリンクが張れないケースがあります。一応、Twitter Developer Talk に投稿しておきました。

あと、Twitter で @kansai_takako さんが、

@ogaoga 正確に判定するのが結構めんどうでした…とくに検索文字を黄色でハイライトさせるとかが入 ってるとつらい><less than a minute ago via Tweetie for Mac

って言っていたので、特定文字をハイライトする機能も入れてみました。複数の単語に対して、複数の置き換えが可能です。たとえば複数単語で検索したときに、それぞれの検索語ごとに色を分けてハイライト、みたいなことも可能です。もちろん、リンク内の文字列を置き換えてしまうこともありません。

git の流儀とかよくわかっていませんが、こんな感じでコードを公開することも今後やっていきたいと思っています。まだバグも残っていると思うので、何かありましたら @ogaoga までお知らせください。

Join the Conversation

1 Comment

Leave a comment