ページ: 1
こんにちは。
どうも、NP_Amazonの生成している画像のURLが古いことが原因のようです。
NP_Amazonは、Amazonのネットサービスから受け取った画像URLではなく、プラグイン内のgetImagesルーチンで、
http://images.amazon.com/images/P/
からのURLを作っています。
これを、AmazonのネットサービスからのURLを使用するように書き換える必要があります。
NP_Amazonの商品画像が出ない【農場主の日常】
http://sakurafarm.happy.nu/Nucleus/item_2967.html
Blogではサラリと書いてますが、まず、プラグイン内のgetAmazonDataルーチンに画像URLを取得する処理を追加、その後getImagesルーチンの画像URLを生成する処理を改造という流れになります。
私の手元のNP_Amazonはこれ以外にもいろいろ手を入れていますのでコードを公開はしませんが、この内容でわかりますでしょうか?
農場主の日常(管理人blog)
http://nojomaster.com/
オフライン
サクラキャンドルさんへ
返答ありがとうございます。
せっかく教えていただいているのに大変恐縮ですが、わからないのでもう少し教えてください。
str_replace("ecx","ec2", $img)
上記コードをNP_Amazon.php内のgetAmazonDataルーチンに追加すればいいということですが、それはどのあたりに追加すればいいのでしょうか?
その後に、
http://images.amazon.com/images/P/
の箇所を
http://ec2.images-amazon.com/images/I/
に書き換えればいいんですよね?
・Nucleus CMS v3.41RC
・PHP 5.2.17
・MySQL 4.1.25
・Apache/1.3.41 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
オフライン
こんにちは。
単純にコードを追加というわけではなくて、AmazonのネットサービスからのURLを使用するように書き換える必要があります。
3年ほど前にやった作業なので、現在のAmazon ECSの仕様は変わっているかもしれませんが、オリジナルのNP_AmzonとDIFFをとってみたのでそれを記載します。
まず、75行目、サブルーチンinstallの
$sql .= " imgsize varchar(60) default NULL,";
の部分を
$sql .= " imgsize varchar(60) default NULL,";
$sql .= " imgs text default NULL,";
$sql .= " imgm text default NULL,";
$sql .= " imgl text default NULL,";
のように、3行追加。
121行目、
$sql = "ALTER TABLE ".sql_table('plugin_amazon');
の前に
$sql="SHOW COLUMNS FROM ".sql_table('plugin_amazon')." like imgs";
if(mysql_query($sql) == "") {
$sql = "ALTER TABLE ".sql_table('plugin_amazon');
$sql .= " ADD imgs text default NULL";
$sql .= " AFTER img";
mysql_query($sql);
}
$sql="SHOW COLUMNS FROM ".sql_table('plugin_amazon')." like imgm";
if(mysql_query($sql) == "") {
$sql = "ALTER TABLE ".sql_table('plugin_amazon');
$sql .= " ADD imgm text default NULL";
$sql .= " AFTER img";
mysql_query($sql);
}
$sql="SHOW COLUMNS FROM ".sql_table('plugin_amazon')." like imgl";
if(mysql_query($sql) == "") {
$sql = "ALTER TABLE ".sql_table('plugin_amazon');
$sql .= " ADD imgl text default NULL";
$sql .= " AFTER img";
mysql_query($sql);
}
$sql = "ALTER TABLE ".sql_table('plugin_amazon');
を追加。
これで、NP_AmzonのテーブルにAmazon ECSから得られた画像のURLが保存されます。
あわせて、288,289行目、function newDataのAmazon ECSから得られた情報をテーブルに保存する部分
$sql = 'INSERT INTO ' . sql_table('plugin_amazon')
. " (blogid, asbncode, title, catalog, media, author, manufacturer, listprice, ourprice, point, releasedate, availability, amazonrate, myrate, similar, imgsize, date, adddate)"
を、
$sql = 'INSERT INTO ' . sql_table('plugin_amazon')
. " (blogid, asbncode, title, catalog, media, author, manufacturer, listprice, ourprice, point, releasedate, availability, amazonrate, myrate, similar, imgsize, imgs , imgm , imgl , date, adddate)"
に変更。(imgs,imgm,imglを追加)
305行目、
'".addslashes($product[imgsize])."',
のあとに、
'".addslashes($product[imgsize])."',
'".addslashes($product[imgs])."',
'".addslashes($product[imgm])."',
'".addslashes($product[imgl])."',
のように、3行追加。
これで、データ追加時にテーブルに画像URLが保存されます。
あわせて324行目、function updateDataの
. " imgsize='". addslashes($product[imgsize]) . "',"
のあとに
. " imgsize='". addslashes($product[imgsize]) . "',"
. " imgs='". addslashes($product[imgs]) . "',"
. " imgm='". addslashes($product[imgm]) . "',"
. " imgl='". addslashes($product[imgl]) . "',"
のように3行追加。
こっちは、データ更新時に保存される部分です。
保存ルーチンの修正後は、本題のECSのデータを受ける部分、425行目、function getAmazonDataの
$product[imgsize] .= $ews_item[$imgsize][Width] . "," . $ews_item[$imgsize][Height];
の前に、
if($tmp == "Small") {
$product[imgs] = $ews_item[$imgsize][URL];
}
if($tmp == "Medium") {
$product[imgm] = $ews_item[$imgsize][URL];
}
if($tmp == "Large") {
$product[imgl] = $ews_item[$imgsize][URL];
}
$product[imgsize] .= $ews_item[$imgsize][Width] . "," . $ews_item[$imgsize][Height];
のように、各サイズの画像を受け取るように改造。
最後に、447行目、function getImagesを、
function getImages($product, $size) {
global $CONF, $DIR_MEDIA;
$amazonurl = 'http://images.amazon.com/images/P/';
$result = "no";
$tmpsize = explode(",", $product[imgsize]);
switch($size) {
case 's':
// $img = "_SCTHUMBZZZ_.jpg";
$img = $product[imgs];
$width = $tmpsize[0];
$height = $tmpsize[1];
$noimgsize = 60;
break;
case 'm':
// $img = "_SCMZZZZZZZ_.jpg";
$img = $product[imgm];
$width = $tmpsize[2];
$height = $tmpsize[3];
$noimgsize = 120;
break;
case 'l':
// $img = "_SCLZZZZZZZ_.jpg";
$img = $product[imgl];
$width = $tmpsize[4];
$height = $tmpsize[5];
$noimgsize = 180;
break;
default:
// $img = "_SCMZZZZZZZ_.jpg";
$img = $product[imgm];
$width = $tmpsize[2];
$height = $tmpsize[3];
$noimgsize = 120;
break;
}
// $noimg = "http://images-jp.amazon.com/images/G/09/x-locale/detail/thumb-no-image.gif";
$noimg = 'http://images-jp.amazon.com/images/G/09/nav2/dp/no-image-no-ciu._AA'. $noimgsize .'_.gif';
// $imgfile = $product[asbncode] .'.09.'.$img;
if($width != "") {
// $product[imgfile] = $amazonurl. $imgfile;
// $product[imgfile] = $img;
$product[imgfile] = str_replace("ecx","ec2", $img);
$product[attr] = 'width="'.$width.'" height="'.$height.'"';
$result = "yes";
} else {
// $product[attr] = 'width="50" height="60"';
$product[imgfile] = $noimg;
}
}
のように改造。
この改造は、NP_Amzonのテーブルの変更をおこなっているので、一旦NP_Amazonをアンインストールしてテーブルを削除後、再インストールする必要があります。
テーブルや情報が壊れる可能性がありますので、慎重にバックアップ後に作業することをおすすめします。
また、これまでに登録したAmazonのデータは記事を再表示すると再登録されます。
ちなみに、
str_replace("ecx","ec2", $img)
については現在はやらなくて良い処理かもしれません。
農場主の日常(管理人blog)
http://nojomaster.com/
オフライン
サクラキャンドルさんへ
ご丁寧に教えていただいてありがとうございました。
お陰さまでできました。
本当にありがとうございました!
・Nucleus CMS v3.41RC
・PHP 5.2.17
・MySQL 4.1.25
・Apache/1.3.41 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
オフライン
いつもお世話になっています。
NP_Amazonについて、以前、こちらでサクラキャンドルさんに教えていただいた改造を施して無事画像が表示されるようになったのですが、
近頃、以下のようなエラメッセージが頻繁に表示されるようになり困っています。
Warning: file_get_contents(http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=AKIAJIHVVGXJ6PX43E2Q&AssociateTag=marble_lab-22&ItemId=B00ATM3C22&ItemPage=1&Operation=ItemLookup&ResponseGroup=Small%2CItemAttributes%2COfferFull%2CImages%2CSimilarities%2CReviews&Service=AWSECommerceService&Timestamp=2013-02-10T15%3A21%3A12Z&Version=2009-03-31&Signature=IAwG93RfHbtpoJKOy%2FIOPa0rkKVn%2FKHvIOCH6fbUY6E%3D) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Unavailable in /home/marble-lab/www/nucleus/plugins/NP_Amazon.php on line 397
NP_Amazon.phpの397行目がエラーの原因っぽいのですがそれ以上のことがよくわかりません。
ちなみにNP_Amazonの397行目前後は以下のようになっています。
$string2sign = "GET\necs.amazonaws.jp\n/onca/xml\n".$query;
if (function_exists("hash_hmac")) {
$signature = base64_encode(hash_hmac("sha256", $string2sign, $this->secret_key, true));
} else {
require_once('amazon/hmac_sha256.php');
$hmac_sha256 = new HMAC_SHA256($this->secret_key);
$signature = base64_encode($hmac_sha256->hmac($string2sign));
}
$signature = str_replace("%7E", "~", rawurlencode($signature));
$request = $baseurl.$query."&Signature=".$signature;
$xml = file_get_contents($request); //397行目
$ews = XML_unserialize($xml);
$ews_item = &$ews[ItemLookupResponse][Items][Item];
$ews = "";
リロードすると何事もなかったようにエラーメッセージが消えたりするのですが、
しかし、またリロードすると同じエラーメッセージが表示されるの繰り返しです。
解決策がありましたら教えてください。
よろしくお願いします。
・Nucleus CMS v3.41RC
・PHP 5.2.17
・MySQL 4.1.25
・Apache/1.3.41 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
オフライン
ご無沙汰しています。
本質的な解決にはなってないのですが
自分的に困ってたことが解決したので、記載させていただきます。
自分も下記の部分で503エラーが頻出しています。
$ews = XML_unserialize($xml);
Amazonサーバーがそこまで頑強ではないのか、アクセスが多すぎだからなのか
503エラーはどうしても出てしまうもののようです。
(一秒間に千リクエストしか処理できないといった記載を見たような……)
PGソースで、503エラーの場合は再度XML取得するように改修したかったのですが
PHP4環境で未だに使っており、Try Catchがなくて断念しました。
(無限ループになったら怖かったのと、規約上やっていいのか判断つかなかったこともあり)
ここから下が、自分が困ってた点と、改善策になります。
(その1は検証済、その2は最終的に未検証)
**************************
その1
503エラーになった場合、XMLデータは取得できていないのに、
nucleus_plugin_amazonテーブルにデータが空でINSERTされてしまうのが面倒でした。
(この場合、Editリンクで別窓を呼び出し、Deleteしてリロードする必要があります)
503エラーを検知する方法は分からなかったのですが、
単純にXMLで取得するタイトル名が空だったら失敗したと見なして
INSERTを防ぐようにしました。
function newData($product) {
$this->getAmazonData(&$product, $mode = "new");
//2018.05.11-takehana-add-s
if($product[title] == ""){
return;
}
//2018.05.11-takehana-add-e
**************************
その2
暫くすると、いつの間にか画像がありません(No-image)状態になってしまっていて
てっきりAmazonが画像URLを変えたのかと勘違いしていたのですが、間違ってました。
どうも情報キャッシュ期間を過ぎてUPDATEしにいく際に
503エラーが起こったのか、nucleus_plugin_amazonテーブルの「similar」が文字化けして??が入ってたりして
そのせいで正常に画面URLの取得が出来ない状態になっていました。
不正なデータ件数を調べたら数千件あったので、手動でやるのは諦めて下記SQLで物理削除しました。
DELETE FROM `nucleus_plugin_amazon`
WHERE `similar` LIKE '%?%'
そのあと、画像表示に問題があった記事を再表示すれば、503エラーになるか正常になるか
といった状況になり、画像がありません状態からは脱せれました。
??と変なデータがUPDATEされるのが問題と思ったので、
下記のようにプラグインを改修してみました。
function updateData($product) {
$this->getAmazonData(&$product, $mode = "update");
//2018.05.11-takehana-add-s
if($product[title] == ""){
return;
}
//2018.05.11-takehana-add-e
さきほどと同様に、XML取得が失敗してたらタイトルが空と思われるので
UPDATEしないようにしています。
※なお、その2だけは未検証です。
編集者 嶽花 (2018-05-17 09:16:46)
オフライン
Amazonサーバーがそこまで頑強ではないのか、アクセスが多すぎだからなのか
503エラーはどうしても出てしまうもののようです。
(一秒間に千リクエストしか処理できないといった記載を見たような……)
1秒間に1リクエストです(1 request per second )売り上げに応じて最大10
Troubleshooting Applications -> Efficiency Guidelines
https://docs.aws.amazon.com/AWSECommerc … tions.html
503エラーの件については
他にアマゾンのapiを使っていない場合は、
適当なファイルを1個用意して
次の3個の関数の組み合わせで最終アクセス時刻を記録できるので
is_file関数、filemtime関数、touch関数、
filemtimeがtime()から1秒経過していなかったら
sleep(1)で待機してアクセスすれば、503になる確率は減ると思います
ただ、コンテンツ表示待ちの人からすると1、2秒待つのは苦痛なのでどうかという問題があります。
NP_Amazonでは
1商品に1リクエストという非常に効率の悪いことをしているので
根本的な解決策として
内部処理を itemlookupレスポンスで10個まとめて取得するなどしたほうがいいかと思います
Batch request を利用すると1リクエストで最大20個取得できますね。
表示数の多い人気ものだけ周期的にバッチリクエストするとかですね。
テンプレートをパースする性格上ちょっと無理がありますが
記事内に限定するならバッチリクエスト可能だと思いますよ
編集者 ピヨピヨbird (2018-05-14 23:11:16)
オフライン
ご丁寧にありがとうございます。
リクエストの件は完全に勘違いしていました、すみません。
自サイトの使い方だと、ご提案していただいた
1秒スリープ案が現実的かな、と思ったので
そちらの方で頑張ってみようかと思います。
(本当は複数リクエストを一度に処理したほうがいいとは思うんですが……)
編集者 嶽花 (2018-05-16 15:53:01)
オフライン
ご提案していただいた内容を実装してみました。
下記の内容でcheckTime.phpを作って、プラグインのamazonフォルダに格納しました。
<?php
// 対象ファイル名
$filename = '/var/www/home/*****/nucleus/plugins/amazon/checkTime.php';
// 最終更新日の取得
$mod = filemtime($filename);
// 現在日時を取得
$timestamp = time();
// 最終更新日から現在時刻の差を算出
$interval = $timestamp - $mod;
if( $interval < '1' ) {
// 1秒経っていないなら待機
sleep(1);
}
// 最終更新日を更新
touch($filename);
?>
その上で、NP_Amazonを下記のように改修しました。
//NP_AmazonのgetAmazonDataメソッド冒頭あたり
function getAmazonData($product, $mode) {
//2018.05.16-takehana-add-s
require_once('amazon/checkTime.php');
//2018.05.16-takehana-add-e
アクセス数が少ないサイトなので実感はないのですが、これで少しは503エラーが減るかな、と期待しています。
編集者 嶽花 (2018-05-17 09:15:37)
オフライン
ページ: 1