「この記事にTwitterでコメント」ボタンの記事URLをbit.lyで短縮するようにしたよ

以前このようなことをしたわけですが

このままだとブログ記事の URL をそのまま Twitter に渡すので
こんな不格好なことになってしまいますね。

@とURLが入ったtwitter投稿画面

これだとすぐ Twitter の文字制限にかかってしまうので
ここに出る元記事 URL を bit.ly で短縮するようにしました。

一応やったことを書いときます。

bit.ly の API は JSONP に対応してるから
JavaScript でやればいいんだけど、
以前別のところで使ったのを使い回せて手っ取り早いので
今回は PHP で。

bit.ly の API Key を取得

bit.ly にユーザー登録して
アカウント設定のページに行けば
API Key が表示されるのでそれをコピー。
R_ のあとに32桁の英数字が並んでるやつです。

短縮 URL 取得部分

こんな感じの関数を用意。

function bitly($url) {
$cache_dir = "*****"; //キャッシュファイルを置くディレクトリへのパス
$cache_id = md5($url);
$filename = $cache_dir . $cache_id;
if (file_exists($filename)) {
$short_url = file_get_contents($filename);
return $short_url;
} else {
$login = '*****'; //自分のbit.ly ログイン ID
$key = '**********'; //自分のbit.ly API Key
$api = 'http://api.bit.ly/shorten?format=xml&version=2.0.1&login=' . $login . '&apiKey=' . $key . '&longUrl=' . $url;
$bitly = simplexml_load_file($api);
$short_url = $bitly->results->nodeKeyVal->shortUrl;
file_put_contents($filename, "{$short_url}", LOCK_EX);
return $short_url;
}
}

初回だけ短縮 URL を生成してキャッシュファイルに保存、
2回目からはそれを呼び出す格好です。

キャッシュを置くディレクトリはあらかじめどっかに作成して
PHP から書き込みができるように権限を設定しときます。

このままだと
万一キャッシュファイルが破損したら URL を読み出せなくなるので
それが気になる場合は
キャッシュが bit.ly の URL として妥当かどうかチェックするなり
定期的に取得し直すなりして
具合のいいように。

ボタン表示部分

先ほどの関数を呼び出して、短縮 URL を出力します。

Movable Type の場合


<a href="http://twitter.com/home?status=@[自分のTwitter ID]%20(<?php echo bitly('<$MTEntryPermalink$>'); ?>%20)" title="この記事にTwitterでコメント" rel="nofollow"><img src="[アイコンのURL]" alt="t" /></a>

WordPress の場合


<a href="http://twitter.com/home?status=@[自分のTwitter ID]%20(%20<?php echo bitly(get_permalink()); ?>%20)" title="この記事にTwitterでコメント" rel="nofollow"><img src="[アイコンのURL]" alt="t" /></a>

結果

ボタンをクリックして表示される Twitter 投稿画面は
こんな感じになるはず。

bit.ly URL入り投稿画面

以前よりはだいぶスマートですね。

↓ではどうぞ。
t

  • このエントリーをはてなブックマークに追加

4 Responses to “「この記事にTwitterでコメント」ボタンの記事URLをbit.lyで短縮するようにしたよ”

  • kaz

    2009/10/17 01:23

    はじめまして
    初歩的な質問で申し訳ないのですが…
    短縮 URL 取得部分の関数は、どこに記載すれば良いのでしょうか?
    私はMovable Typeを使っているのですが、
    メインページ等のテンプレートに記載した
    <a href=”http://twitter.com/home?~~
    の直前でしょうか?
    もしくは、
    インデックステンプレートでPHPファイルを作る感じでしょうか?
    ぜひ実装してみたいので、ご教授ください。
    よろしくお願いします。

  • 2009/10/18 20:47

    > kaz さん
    Twitter へのリンクを吐き出す部分の直前に関数を書くと、インデックスページなどでは関数の記述が記事の数だけ繰り返されてしまうので、 <MTEntries> より外側に書くのがいいと思います。あとはどこでもいいんですが、テンプレートの冒頭に置いておくとわかりやすいんじゃないでしょうか。
    関数を書くためのテンプレートを一つ作ってインポートした方が便利かもしれませんね。
    WordPress だったら関数記述用の functions.php というテンプレートがあります。

  • kaz

    2009/11/01 03:51

    質問への回答ありがとうございます。
    アドバイスを元にいろいろと試しているのですが、
    エラーで出てしまい、うまく進めませんでした。
    短縮URLは生成できているのですが、キャッシュファイルの保存に失敗しているようです。
    以下に作業した手順を記載します。
    できましたら、アドバイスをお願いします。

    下記の関数をファイル名「bitly.php」で保存
    ----
    <?php
    function bitly($url) {
        $cache_dir = "http://サイト名.com/***/twitter_cache/&quot;;
        $cache_id = md5($url);
        $filename = $cache_dir . $cache_id;
        if (file_exists($filename)) {
            $short_url = file_get_contents($filename);
            return $short_url;
        } else {
            $login = ‘***’;
            $key = ‘R_741bb*****480877’;
            $api = ‘http://api.bit.ly/shorten?format=xml&version=2.0.1&login=’ . $login . ‘&apiKey=’ . $key . ‘&longUrl=’ . $url;
            $bitly = simplexml_load_file($api);
            $short_url = $bitly->results->nodeKeyVal->shortUrl;
            file_put_contents($filename, "{$short_url}", LOCK_EX);
            return $short_url;
        }
    }
    ?>
    ----

    「twitter_cache」というキャッシュ用フォルダを作り、属性を707に設定。

    </head> の直前に、
    <?php require_once("bitly.php");?>
    を記述。

    ボタン表示部分を記載
    ▼結果として、ボタンを押すと短縮URLの表示部分に下記のエラーが表示されます。
    (<br /><b>Warning</b>:  file_put_contents(http://サイト名.com/*****/twitter_cache/9907fc1ca9165be0c95c92004d1cd683) [<a href=’function.file-put-contents’>function.file-put-contents</a>]: failed to open stream: HTTP wrapper does not support writeable connections in <b>/virtual/****/public_html/******/bitly.php</b> on line <b>15</b><br />http://bit.ly/***** )
    以上です。よろしくお願いします。

  • 2009/11/02 08:30

    > kaz さん
    $cache_dir には書き込み先のディレクトリを記述するので、
    HTTP 越しではなくサーバ内のパスを書くことになります。
    レンタルサーバだったら
    /home/[ユーザー名]/public_html/twitter_cache/
    かなんかそういう感じじゃないでしょうか。