楽天API(というか、PHP)の質問です。


初歩的なことかもしれませんが、Wordpressの記事内で、
<?php
$keyword = "はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>
のように、商品画像を取得する際、このコードの下に別のコード(例:キーワードの中だけを変えたり)を使って、
別の楽天商品を表示させようとすると、
ページ全体がエラーのようになってしまいます。

これは何がいけないのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/05/15 16:51:30
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

楽天APIの連続利用は許されておらず、1秒間に1回までとなっていますので、

下記のように次の検索は1秒待った後に行うように工夫しておかなければ、

2回目のほうでエラーとなってしまいます

<?php
$keyword = "はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
sleep(1);
$keyword = "ダイアリー";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>
id:love-peanut

回答ありがとうございます!



1秒待ったあとの処理ということは、例えば同じ記事内で10つ違うコードを使いたいときだと、

最終的にsleep(1)がたくさんになってしまって、記事を表示するのにとても時間が掛かりますよね。

つまり、何度も記事の中で使うような手法は、本来向いていないということなのでしょうか?



下記が使用の一例です。



---------------------------------



<?php
$keyword = "はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



文章が100字ほど



<?php
sleep(1);
$keyword = "ダイアリー";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



文章が100字ほど



<?php
sleep(1);
$keyword = "人力検索はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



・・・中略・・・



<?php
sleep(1);
$keyword = "はいく";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>


---------------------------------------------

2011/05/15 16:27:24

その他の回答2件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント100pt

楽天APIの連続利用は許されておらず、1秒間に1回までとなっていますので、

下記のように次の検索は1秒待った後に行うように工夫しておかなければ、

2回目のほうでエラーとなってしまいます

<?php
$keyword = "はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
sleep(1);
$keyword = "ダイアリー";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>
id:love-peanut

回答ありがとうございます!



1秒待ったあとの処理ということは、例えば同じ記事内で10つ違うコードを使いたいときだと、

最終的にsleep(1)がたくさんになってしまって、記事を表示するのにとても時間が掛かりますよね。

つまり、何度も記事の中で使うような手法は、本来向いていないということなのでしょうか?



下記が使用の一例です。



---------------------------------



<?php
$keyword = "はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



文章が100字ほど



<?php
sleep(1);
$keyword = "ダイアリー";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



文章が100字ほど



<?php
sleep(1);
$keyword = "人力検索はてな";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>



・・・中略・・・



<?php
sleep(1);
$keyword = "はいく";
$limit = 3;
echo search_rakuten($keyword,$limit);
?>


---------------------------------------------

2011/05/15 16:27:24
id:asuka645 No.2

回答回数856ベストアンサー獲得回数97

ポイント18pt

コメントにて追加情報をいただきありがとうございます。


APIバージョンが古いのではないでしょうか?

$version = '2010-09-15';

でお試しください。


また、APIエラーなら、出力中の「共通パラメーター」のStatusにエラーが帰ってきますので、この値を表示・確認をお願いします。

id:love-peanut

アドバイスありがとうございます!


早速バージョンを変えてみました。


とりあえず、エラーの件は最初の回答の方のが原因だったようで、改善しました!

2011/05/15 16:42:29
id:taroe No.3

回答回数1099ベストアンサー獲得回数132

ポイント18pt

search_rakutenというのは自作の関数なのでしょうか?

楽天のAPIは1秒に1回ですが、今回はこれでエラーになってるとは考えられないです。

PEARの Services_Rakutenを改造して同様のことを行ってますが問題なく表示されます。

search_rakutenが自作の関数なら、その中身の検証をした方が良いでしょう。

また、エラーになるということですが、なんのエラーかどうかを地道に調べるべきだと思います。


php.iniで、エラーレベルを変更し、またエラーログを出力するように設定すれば

現状でも何かのエラーが出てくると思います。

http://pc.casey.jp/archives/2174

また、楽天APIから返されるリターンコードも見ることをお勧めします。

上記のように1秒のSLEEPを入れて動作するのでしたら、1リクエスト1秒の制限です。

http://webservice.rakuten.co.jp/faq/

ここの後半にも書かれているように、通常このようなことを行う場合はデータをキャッシュして対応します。

Amazonでも同じようなことができます。やっているところはデータキャッシュを持つようにしてリクエスト数を

減らしてます。

id:love-peanut

アドバイスありがとうございます!


エラーの件は、最初の方のコメントで無事解決しました。


…とは言え、今後の勉強の参考になる助言感謝です!

2011/05/15 16:45:30
  • id:love-peanut
    あ、ちなみに、記事内でPHPが使えるようになるプラグインは使用しております。
  • id:asuka645
    どんなエラーが出るのでしょうか?
    また、実際のコードは質問にあるような単純なものではありませんよね?
    より具体的なコードを示していただけると答えやすくなります。
  • id:love-peanut
    コメントありがとうございます。

    (回答くれた方がいたので、それを今から試してみますね)

    そのページを表示させようとすると、
    画面全体が黒ずんだようになってスクロールができなくなるようになるんです。

    コード自体は、基本的には楽天ウェブサービスのサンプルをそのまま使っています。

    <?php

    //楽天から商品を検索してHTMLタグを返す関数
    function search_rakuten($keyword,$limit){

    //developerIdを設定する
    $developerId = '取得したデベロッパーID';

    //affiliateIdを設定する
    $affiliateId = '取得したアフィリエイトID';

    //使用するAPIの操作名を設定する
    $operation = 'ItemSearch';

    //バージョンを設定する
    $version = '2009-04-15';

    //取得件数を設定する
    $hits = $limit;

    //検索キーワードをURLエンコードして設定する
    $text = urlencode($keyword);

    //人気の高い順に検索する
    $sort = urlencode("standard");

    //URLを生成する
    $url = 'http://api.rakuten.co.jp/rws/3.0/rest?'.
    'developerId='.$developerId.
    '&affiliateId='.$affiliateId.
    '&operation='.$operation.
    '&version='.$version.
    '&keyword='.$text.
    '&hits='.$hits.
    '&sort='.$sort;

    //RESTで返されるXMLファイルを取得する
    $str = file_get_contents($url);

    //XMLを解析してオブジェクトにセットする
    $xml = simplexml_load_string($str);

    //xpathによって、Item要素だけを取り出す
    $Items = $xml->xpath('//Items/Item');

    //divタグでくくる
    $ret = '<div id="rakuten_item">';

    //Item数だけ繰り返す
    foreach($Items as $Item){
    $ret .= '<a href="'.$Item->affiliateUrl.'">';
    $ret .= '<img src="'.$Item->mediumImageUrl.'" alt="'.$Item->itemName.'">';
    $ret .= "</a>\n";
    }

    //divタグを閉じる
    $ret .= '</div>';

    //作成したHTMLを返す
    return $ret;
    }

    ?>
  • id:windofjuly
    うぃんど 2011/05/15 16:41:37
    >例えば同じ記事内で10つ違うコードを使いたいときだと、
    >最終的にsleep(1)がたくさんになってしまって、記事を表示するのにとても時間が掛かりますよね
    そのとおりです
     
    >何度も記事の中で使うような手法は、本来向いていない
    そのとおりです。向いてません
     
    ブログなどが重くなる原因の1つでもあります
    アフィリエイトなどでやたらめったらと貼り付けているページもありますが、
    表示が遅く重いページは客を逃す結果となり、誰も得しないということになります
  • id:love-peanut
    再び、ありがとうございます。


    なるほど…、必要最低限の使用が良さそうですね。


    今回、sleep(1)という関数の存在を初めて知り、エラーの解消になったので
    とても助かりました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません