それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Bk1のブリーダーCGIをHackしてみた。

AmazonWebサービスだと、みんなと同じなのでBk1を使ってみることにした。

bk1の画像とか各情報がリアルタイムで欲しい

でもAmazonのような巨大WebサービスがBk1には存在しない。ブリーダーの新規募集が終わってるほどお粗末。なんとかして、価格情報とか各種データを取り出してみたい。スクレーピングは最終手段として何か良い方法を探してきた。

簡単リンク君をみつける。こいつ送信したTMLコードをそのまま返してくる。これは使えそうだ。JavaScriptPHPPerlのコードも吐き出すんじゃないか。

BK1の簡単リンク君にPHPソースコードを書かせればEvalできる。

思ったより使える。レスポンスも早い。これは便利なんじゃ・・・

ISBNからBk1の情報を調べられる。

<?php
/*
 * Bk1の商品情報を取得するスクリプト
 * 
 * 動作原理:簡単リンク君にEvalできるソースコードを作ってもらう。
 * @since 07/03/21
 * @last modified 07/03/21
 * @param $isbn ISBN か BIBID を指定する。
 * @return Object Bk1の商品情報を持つオブジェクト
 */
function Utena_Bk1_ItemLookUp($isbn)
{
  /** HTTP_Client */
  require_once "HTTP/Client.php";
  $cli = new HTTP_Client();
  
  /** request headers */
  $header["UserAgent"] = "bookmacro.com/Spider (hatena_id=takuya_1st)";
  $header["UA-CPU"] = "x86";
  $header["Referer"] = "http://breeder.bk1.jp/cgi-bin/link/create.cgi";

  /** request data **/
  $data["bibid"] = $isbn;
  $data["tmpl"] = '__PHP__SRC__START__$bk1_item->URL="[URL]";'
          .'$bk1_item->BIBID="[BIBID]";'
          .'$bk1_item->ProductName="[ProductName]";'
          .'$bk1_item->Author="[Author]";'
          .'$bk1_item->ISBN="[ISBN]";'
          .'$bk1_item->ReleaseDate="[ReleaseDate]";'
          .'$bk1_item->Manufacturer="[Manufacturer]";'
          .'$bk1_item->ImageUrlSmall="[ImageUrlSmall]";'
          .'$bk1_item->ImageUrlLarge="[ImageUrlLarge]";'
          .'$bk1_item->Availability="[Availability]";'
          .'$bk1_item->ListPrice="[ListPrice]";'
          .'__PHP__SRC__END__';

  /** post data to server */
  $cli->post("http://breeder.bk1.jp/cgi-bin/link/create.cgi", $data );
  $response = $cli->currentResponse();
  
  /** get response and eval **/
  $html = $response["body"];
  $server_enc = str_replace( 
            "text/html;charset=", "",
            $response["headers"]["content-type"]);
  $html= mb_convert_encoding( $html, "utf-8", $server_enc );
  $code = preg_match("/__PHP__SRC__START__(.*)__PHP__SRC__END__/", $html, $matches);
  $src = $matches[1];
  $src = str_replace("&#165;","", $src );
  eval($src);
  return $bk1_item;

}


//動作てすと
var_dump( Utena_Bk1_ItemLookUp("4592182847") );
/** テスト結果 ***************************
object(stdClass)#3 (11) {
  ["URL"]=>
  string(58) "http://www.bk1.co.jp/product/2761920/?partnerid=99easylink"
  ["BIBID"]=>
  string(7) "2761920"
  ["ProductName"]=>
  string(28) "ボクを包む月の光 4"
  ["Author"]=>
  string(16) "日渡 早紀著"
  ["ISBN"]=>
  string(10) "4592182847"
  ["ReleaseDate"]=>
  string(6) "2007.3"
  ["Manufacturer"]=>
  string(9) "白泉社"
  ["ImageUrlSmall"]=>
  string(55) "http://img.bk1.co.jp/bookimages/0276/027619200000_s.jpg"
  ["ImageUrlLarge"]=>
  string(53) "http://img.bk1.co.jp/bookimages/0276/027619200000.jpg"
  ["Availability"]=>
  string(41) "通常24時間以内に発送します。"
  ["ListPrice"]=>
  string(3) "410"
}
*/


amazonに画像無くてもBk1から取得できたりするんだけど。

取得しちゃうとBk1に怒られるんじゃ。。。bk1の中の人教えてください。この使い方ダメデスカ?



bk1のbibidとISBNの相互変換ができるのはかなり便利だと思います。ISBNからBIBIDに変換するのにもっと良いやり方あるかな?教えてほすぃ・・・


ちなみに戻り値のObjectは,簡単リンク君そのもの

//オブジェクト戻り値
//[URL]  商品ページへのアフィリエイト対応URL   
//[BIBID]  商品コード   
//[ProductName]  商品名   
//[Author]  著者名   
//[ISBN]  ISBNコード   
//[ReleaseDate]  刊行年月   
//[Manufacturer]  出版社   
//[ImageUrlSmall]  画像のURL(小)   
//[ImageUrlLarge]  画像のURL(大)   
//[Availability]  在庫状況   
//[ListPrice]  価格   

これで、Amazon ECSとbk1マッシュアップしたAPIを作れますよね〜〜。Bkamazon1みたいなサイトができそうだ。残念なのはBk1のブリーダーの新規募集が終わってること。