以前このようなことをしたわけですが
このままだとブログ記事の 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 投稿画面は
こんな感じになるはず。
以前よりはだいぶスマートですね。
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 というテンプレートがあります。
2009/11/01 03:51
質問への回答ありがとうございます。
アドバイスを元にいろいろと試しているのですが、
エラーで出てしまい、うまく進めませんでした。
短縮URLは生成できているのですが、キャッシュファイルの保存に失敗しているようです。
以下に作業した手順を記載します。
できましたら、アドバイスをお願いします。
▼
下記の関数をファイル名「bitly.php」で保存
----
<?php
function bitly($url) {
$cache_dir = "http://サイト名.com/***/twitter_cache/";
$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/
かなんかそういう感じじゃないでしょうか。