何を思ったのか美人時計24時間分取得するスクリプトを書きましたのでご紹介いたします。
//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";
}
}
美人時計を知らない方はいないと思いますが、リンクを貼っておきます。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クライアントライブラリを使いました。使い方も非常に簡単です。
zipを解凍したら適当なカ所に保存してください。Snoopyのダウンロード
私の場合、解凍して出来たフォルダは「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();
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してあげてください。
以上、ホリデープログラマから職業としてプログラマとなった僕でした。