2011年8月アーカイブ

何を思ったのか美人時計24時間分取得するスクリプトを書きましたのでご紹介いたします。
美人時計を知らない方はいないと思いますが、リンクを貼っておきます。http://www.bijint.com/jp/

美人時計の画像ファイルのURLは単純でして、http://www.bijint.com/jp/tokei_images/0000.jpgといったURLになっています。
12:00であれば1200.jpg、05:30であれば0530.jpgといった風にわかりやすい形式です。

for文ループで回してfile_get_contentsすれば楽勝じゃんと思ったのですが、簡単にはいかず、
どうやら美人時計のサーバーはリファラを見ていて、リファラがなかったり不正であると表示しない仕様のようです。

ではリファラをセットして取得するにはどうしたらいいのでしょうか?それが今回の記事の主旨でもあります。

=======
■キーワード
HTTPクライアント
=======

リファラをセットしてファイルを取得するにはHTTPクライアントライブラリを使うのが手っ取り早いです。
今回私はSnoopyというPHPのHTTPクライアントライブラリを使いました。使い方も非常に簡単です。

Snoopyのダウンロード

zipを解凍したら適当なカ所に保存してください。
私の場合、解凍して出来たフォルダは「Snoopy」というフォルダ名に変えています。

===============================
<?php
//Snoopyライブラリを読んでいます。
require_once 'Snoopy/Snoopy.class.php';

class Bijin{
        //美人時計のトップURL、画像までのURLを格納しています。
        public $bijinUrl = 'http://www.bijint.com/jp/';
        public $baseUrl = 'http://www.bijint.com/jp/tokei_images/';

        //snoopyインスタンス用のメンバ変数です。
        public $snoopy;
        //美人時計画像を保存するディレクトリまでのPATHです。
        public $imgPath = './image/';

        //コンストラクタでsnoopyクラスをインスタンスしています。
        function __construct(){
                $this->snoopy = new Snoopy();
                //リファラをセットしています。
                $this->snoopy->referer = $this->bijinUrl;
        }

        //美人時計の画像を取得するロジックを書いたメソッドです。
        function getImage($time){
                $url = $this->baseUrl . $time . '.jpg';
                $this->snoopy->fetch($url);
                return $this->snoopy->results;
        }

        //画像を取得し、保存のロジックを書いたメソッドです。
        function setImage($time){
                $f = fopen($this->imgPath . $time . '.jpg','c');
                $img = $this->getImage($time);
                if(fwrite($f,$img)){
                        return true;
                }
                return false;
        }

        //画像取得、保存の実行メソッドです。str_padを使っているのは0詰めのためです。
        function execute(){
                for ($i = 0;  $i <=23; $i++ ){
                        $hour = str_pad($i, 2, "0", STR_PAD_LEFT);
                        for ($j = 0;  $j <=59; $j++ ){
                                $min = str_pad($j, 2, "0", STR_PAD_LEFT);
                                $time = $hour . $min;
                                $flag = $this->setImage($time);
                                if(!$flag){
                                        echo "error";
                                }else{
                                        echo $time . "\n";
                                }
                        }
                        //美人時計のサーバーに負荷を与えないよう1秒間のsleepを入れています。
                        sleep(1);
                }
        }
          
        //画像出力実行メソッドです。
        function view(){
               for ($i = 0;  $i <=23; $i++ ){
                        $hour = str_pad($i, 2, "0", STR_PAD_LEFT);
                        for ($j = 0;  $j <=59; $j++ ){
                                $min = str_pad($j, 2, "0", STR_PAD_LEFT);
                                $time = $hour . $min;
                                echo '<img src ="' . $this->imgPath . $time . '.jpg" /><br />';
                        }
                }
        }
}   

$bijin = new Bijin();
    
//日人時計の取得・保存
$bijin->execute();
    
//美人時計画像の出力
$bijin->view();
?>
===============================

このスクリプトを実行すると、execute()により、./image/ディレクトリに24時間分の画像、0000.jpgというファイル名形式で保存されます。
多くの数のリクエストを美人時計のサーバーに投げるので適度にsleepしてあげてください。

以上、ホリデープログラマから職業としてプログラマとなった僕でした。
個人的に作っているサイトで、RSSクローラーを巡回させて手に入れた記事情報をDBに保存しておき、各記事のはてなブックマーク数を1時間置きに取得してhatebu_tableに追加していくというバッチを書きました。

===============================================================
本題からそれますがはてなブックマーク数を取得する方法は下記に。

http://api.b.st-hatena.com/entry.count?url=http%3A%2F%2Fwww.hatena.ne.jp%2F

といった風にurlというパラメータにURLを付加させてGETでリクエストを送ると、
平文ではてなブックマーク数が取得できます。
詳細ドキュメント ➡ http://developer.hatena.ne.jp/ja/documents/bookmark/apis/getcount
===============================================================


過去に取得したはてなブックマーク数にUPDATEをかけてあげて、過去にはてなブックマーク数を取得したことにない記事に対しては新規にINSERTをかけてあげます。
UPDATEなのかINSERTなのか、どこかでチェックして分岐するのめんどくさいなーって思っていたのですが、REPLACE INTOというSQL構文を発見しました。

REPLACE INTO hatebu_table (article_id,hatebu_count) VALUES(1,100);

上記のSQLを投げた場合、article_id=1のレコードがなかった場合は新規にはてぶ数100とINSERTし、既にあった場合ははてぶ数100とUPDATEします。

SQLって知らないし、調べないだけで便利な構文が意外とあったりするんですね。以上、覚書でした。

このアーカイブについて

このページには、2011年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年6月です。

次のアーカイブは2011年9月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。