質問編集履歴
6
見出し追加と最初の動かないコードは削除
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,66 +1,13 @@
|
|
1
|
-
PHPでAmazonの商品を検索してみたいのですが、どうしても400エラーが帰ってきてしまいます。~~公式にもサンプルがないので~~なぜ遮断されているかわかりません。もしわかる方がいらっしゃいましたら教えてください。**問い合わせコード自体は公式のものを改造したものです。公式のページを末尾に追記。公式ではSignatureは自分で用意する感じ。Signatureの生成がおかしい
|
1
|
+
PHPでAmazonの商品を検索してみたいのですが、どうしても400エラーが帰ってきてしまいます。~~公式にもサンプルがないので~~なぜ遮断されているかわかりません。もしわかる方がいらっしゃいましたら教えてください。**問い合わせコード自体は公式のものを改造したものです。公式のページを末尾に追記。公式ではSignatureは自分で用意する感じ。Signatureの生成がおかしいのでしょうか。**
|
2
2
|
|
3
|
-
|
3
|
+
## 参考サイト
|
4
|
-
define("AccessKeyId", "アクセスキー");
|
5
|
-
define("AssociateTag", "アソシエイトタグ");
|
6
|
-
define("SecretKey", "シークレットキー");
|
7
4
|
|
8
|
-
|
5
|
+
当初[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
|
9
6
|
|
10
|
-
$Operation = "ItemSearch";
|
11
|
-
|
7
|
+
## 実際のコード
|
12
|
-
$ResponseGroup = "ItemAttributes,Offers";
|
13
8
|
|
14
|
-
|
9
|
+
その後、m6uさんに助けていただき、下記のコードまで成長し、Signatureの問題までこぎつけました。Amazon側のステータスコードは400から403へ変わりました。Signatureの生成に何らかの欠陥があり403は解決されません。
|
15
10
|
|
16
|
-
$base = "http://webservices.amazon.com/onca/xml";
|
17
|
-
$baseEncode = rawurlencode($base);
|
18
|
-
|
19
|
-
$params = [];
|
20
|
-
foreach ([
|
21
|
-
"Service" => 'AWSECommerceService',
|
22
|
-
"AssociateTag" => AssociateTag,
|
23
|
-
"AWSAccessKeyId" => AccessKeyId,
|
24
|
-
"Operation" => $Operation,
|
25
|
-
"Version" => $Version,
|
26
|
-
"SearchIndex" => $SearchIndex,
|
27
|
-
"Keywords" => $Keywords,
|
28
|
-
"ResponseGroup" => $ResponseGroup
|
29
|
-
] as $key => $value) {
|
30
|
-
$params[rawurlencode($key)] = rawurlencode($value);
|
31
|
-
}
|
32
|
-
|
33
|
-
ksort($params);
|
34
|
-
|
35
|
-
$request_params = http_build_query($params, '', '&');
|
36
|
-
$request_params = rawurlencode( $request_params );
|
37
|
-
$signature_data = "GET&$baseEncode&$request_params";
|
38
|
-
|
39
|
-
$hash = hash_hmac('sha1', $signature_data, $signatureKey, true);
|
40
|
-
$signature = base64_encode( $hash ) ;
|
41
|
-
|
42
|
-
$params2 = [];
|
43
|
-
foreach ($params as $key => $value) {
|
44
|
-
$params2[] = $key . "=" . $value;
|
45
|
-
}
|
46
|
-
|
47
|
-
$request = $base . "?" . join("&", $params2) . "&Signature=" . $signature;
|
48
|
-
|
49
|
-
$response = file_get_contents($request);
|
50
|
-
$parsed_xml = simplexml_load_string($response);
|
51
|
-
|
52
|
-
print_r($parsed_xml);
|
53
|
-
}
|
54
|
-
|
55
|
-
ItemSearch('トイレシート', 'PetSupplies');
|
56
|
-
```
|
57
|
-
|
58
|
-
[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。
|
59
|
-
|
60
|
-
あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
|
61
|
-
|
62
|
-
m6uさんに助けていただき、下記のコードまで修正し、Signatureの問題までこぎつけました。Amazon側のステータスコードは400から403へ変わりました、
|
63
|
-
|
64
11
|
```php
|
65
12
|
define("AccessKey", "hoge");
|
66
13
|
define("AssociateTag", "hoge");
|
5
HmacSHA256に変更しSecretKeyをそのまま使えばいいのにおかしなことをしていたのを修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -62,18 +62,12 @@
|
|
62
62
|
m6uさんに助けていただき、下記のコードまで修正し、Signatureの問題までこぎつけました。Amazon側のステータスコードは400から403へ変わりました、
|
63
63
|
|
64
64
|
```php
|
65
|
-
define("
|
65
|
+
define("AccessKey", "hoge");
|
66
66
|
define("AssociateTag", "hoge");
|
67
67
|
define("SecretKey", "hoge");
|
68
68
|
|
69
69
|
function ItemSearch($SearchIndex, $Keywords) {
|
70
70
|
|
71
|
-
$timeStamp = gmdate('Y-m-d\TH:i:s\Z');
|
72
|
-
$Operation = "ItemSearch";
|
73
|
-
$Version = "2013-08-01";
|
74
|
-
$ResponseGroup = "ItemAttributes,Offers";
|
75
|
-
$signatureKey = rawurlencode(AccessKeyId) . "&" . rawurlencode(SecretKey);
|
76
|
-
|
77
71
|
$base = "http://webservices.amazon.com/onca/xml";
|
78
72
|
// $base = "http://ecs.amazonaws.jp/onca/xml";
|
79
73
|
|
@@ -81,36 +75,44 @@
|
|
81
75
|
foreach ([
|
82
76
|
"Service" => 'AWSECommerceService',
|
83
77
|
"AssociateTag" => AssociateTag,
|
84
|
-
"AWSAccessKeyId" =>
|
78
|
+
"AWSAccessKeyId" => AccessKey,
|
85
|
-
"Operation" =>
|
79
|
+
"Operation" => "ItemSearch",
|
86
|
-
"Version" =>
|
80
|
+
"Version" => "2013-08-01",
|
87
81
|
"SearchIndex" => $SearchIndex,
|
88
82
|
"Keywords" => $Keywords,
|
89
|
-
"ResponseGroup" =>
|
83
|
+
"ResponseGroup" => "ItemAttributes,Offers",
|
84
|
+
"Timestamp" => gmdate('Y-m-d\TH:i:s\Z'),
|
90
|
-
"
|
85
|
+
"SignatureVersion" => 2,
|
86
|
+
"SignatureMethod" => "HmacSHA256"
|
91
87
|
] as $key => $value) {
|
92
|
-
$params[$key] =
|
88
|
+
$params[urlEncodeRfc3986($key)] = urlEncodeRfc3986($value);
|
93
89
|
}
|
94
90
|
|
95
91
|
ksort($params);
|
96
92
|
|
93
|
+
$parsed = parse_url($base);
|
97
|
-
$
|
94
|
+
$sign = join("\n", ['GET', $parsed['host'], $parsed['path'], http_build_query($params, '', '&')]);
|
98
|
-
$hash = hash_hmac('sha1', $signature_data , $signatureKey , true);
|
99
95
|
|
100
|
-
$signature = base64_encode($
|
96
|
+
$signature = base64_encode(hash_hmac('sha256', $sign, SecretKey , true));
|
101
97
|
|
102
|
-
$
|
98
|
+
$queries = [];
|
103
99
|
foreach ($params as $key => $value) {
|
104
|
-
$
|
100
|
+
$queries[] = $key . "=" . $value;
|
105
101
|
}
|
106
102
|
|
107
|
-
$request = $base . "?" . join("&", $
|
103
|
+
$request = $base . "?" . join("&", $queries) . "&Signature=" . urlEncodeRfc3986($signature);
|
108
104
|
|
105
|
+
var_dump($request);
|
106
|
+
|
109
107
|
$response = file_get_contents($request);
|
110
108
|
$parsed_xml = simplexml_load_string($response);
|
111
109
|
|
112
110
|
print_r($parsed_xml);
|
113
111
|
}
|
114
112
|
|
113
|
+
function urlEncodeRfc3986($str) {
|
114
|
+
return str_replace('%7E', '~', rawurlencode($str));
|
115
|
+
}
|
116
|
+
|
115
117
|
ItemSearch('シーツ', 'PetSupplies');
|
116
118
|
```
|
4
試行錯誤の上、403に変化
title
CHANGED
File without changes
|
body
CHANGED
@@ -57,4 +57,60 @@
|
|
57
57
|
|
58
58
|
[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。
|
59
59
|
|
60
|
-
あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
|
60
|
+
あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
|
61
|
+
|
62
|
+
m6uさんに助けていただき、下記のコードまで修正し、Signatureの問題までこぎつけました。Amazon側のステータスコードは400から403へ変わりました、
|
63
|
+
|
64
|
+
```php
|
65
|
+
define("AccessKeyId", "hoge");
|
66
|
+
define("AssociateTag", "hoge");
|
67
|
+
define("SecretKey", "hoge");
|
68
|
+
|
69
|
+
function ItemSearch($SearchIndex, $Keywords) {
|
70
|
+
|
71
|
+
$timeStamp = gmdate('Y-m-d\TH:i:s\Z');
|
72
|
+
$Operation = "ItemSearch";
|
73
|
+
$Version = "2013-08-01";
|
74
|
+
$ResponseGroup = "ItemAttributes,Offers";
|
75
|
+
$signatureKey = rawurlencode(AccessKeyId) . "&" . rawurlencode(SecretKey);
|
76
|
+
|
77
|
+
$base = "http://webservices.amazon.com/onca/xml";
|
78
|
+
// $base = "http://ecs.amazonaws.jp/onca/xml";
|
79
|
+
|
80
|
+
$params = [];
|
81
|
+
foreach ([
|
82
|
+
"Service" => 'AWSECommerceService',
|
83
|
+
"AssociateTag" => AssociateTag,
|
84
|
+
"AWSAccessKeyId" => AccessKeyId,
|
85
|
+
"Operation" => $Operation,
|
86
|
+
"Version" => $Version,
|
87
|
+
"SearchIndex" => $SearchIndex,
|
88
|
+
"Keywords" => $Keywords,
|
89
|
+
"ResponseGroup" => $ResponseGroup,
|
90
|
+
"Timestamp" => $timeStamp
|
91
|
+
] as $key => $value) {
|
92
|
+
$params[$key] = rawurlencode($value);
|
93
|
+
}
|
94
|
+
|
95
|
+
ksort($params);
|
96
|
+
|
97
|
+
$signature_data = "GET " . rawurlencode($base) . " " . rawurlencode(http_build_query($params, '', '&'));
|
98
|
+
$hash = hash_hmac('sha1', $signature_data , $signatureKey , true);
|
99
|
+
|
100
|
+
$signature = base64_encode($hash);
|
101
|
+
|
102
|
+
$params2 = [];
|
103
|
+
foreach ($params as $key => $value) {
|
104
|
+
$params2[] = $key . "=" . $value;
|
105
|
+
}
|
106
|
+
|
107
|
+
$request = $base . "?" . join("&", $params2) . "&Signature=" . $signature;
|
108
|
+
|
109
|
+
$response = file_get_contents($request);
|
110
|
+
$parsed_xml = simplexml_load_string($response);
|
111
|
+
|
112
|
+
print_r($parsed_xml);
|
113
|
+
}
|
114
|
+
|
115
|
+
ItemSearch('シーツ', 'PetSupplies');
|
116
|
+
```
|
3
目的の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -55,4 +55,6 @@
|
|
55
55
|
ItemSearch('トイレシート', 'PetSupplies');
|
56
56
|
```
|
57
57
|
|
58
|
-
[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。
|
58
|
+
[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。
|
59
|
+
|
60
|
+
あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
|
2
上部文章の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
PHPでAmazonの商品を検索してみたいのですが、どうしても400エラーが帰ってきてしまいます。公式にもサンプルがないのでなぜ遮断されているかわかりません。もしわかる方がいらっしゃいましたら教えてください。
|
1
|
+
PHPでAmazonの商品を検索してみたいのですが、どうしても400エラーが帰ってきてしまいます。~~公式にもサンプルがないので~~なぜ遮断されているかわかりません。もしわかる方がいらっしゃいましたら教えてください。**問い合わせコード自体は公式のものを改造したものです。公式のページを末尾に追記。公式ではSignatureは自分で用意する感じ。Signatureの生成がおかしいんですかね。**
|
2
2
|
|
3
3
|
```php
|
4
4
|
define("AccessKeyId", "アクセスキー");
|
1
参考サイトの追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -53,4 +53,6 @@
|
|
53
53
|
}
|
54
54
|
|
55
55
|
ItemSearch('トイレシート', 'PetSupplies');
|
56
|
-
```
|
56
|
+
```
|
57
|
+
|
58
|
+
[AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/ImplementinganA2SRequest.html#php-requests)を参考にし、Signatureは[OAuth1.0の署名(Signature)を作成する方法](https://syncer.jp/Web/API/OAuth/)を参考にしました。
|