質問するログイン新規登録

質問編集履歴

6

見出し追加と最初の動かないコードは削除

2018/06/27 09:07

投稿

setouchi
setouchi

スコア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
- ```php
3
+ ## 参考サイト
4
- define("AccessKeyId", "アクセスキー");
5
- define("AssociateTag", "アソシエイトタグ");
6
- define("SecretKey", "シークレットキー");
7
4
 
8
- function ItemSearch($SearchIndex, $Keywords) {
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
- $Version = "2013-08-01";
7
+ ## 実際のコード
12
- $ResponseGroup = "ItemAttributes,Offers";
13
8
 
14
- $signatureKey = rawurlencode(AccessKeyId) . "&" . rawurlencode(SecretKey);
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をそのまま使えばいいのにおかしなことをしていたのを修正

2018/06/27 09:07

投稿

setouchi
setouchi

スコア6

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("AccessKeyId", "hoge");
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" => AccessKeyId,
78
+ "AWSAccessKeyId" => AccessKey,
85
- "Operation" => $Operation,
79
+ "Operation" => "ItemSearch",
86
- "Version" => $Version,
80
+ "Version" => "2013-08-01",
87
81
  "SearchIndex" => $SearchIndex,
88
82
  "Keywords" => $Keywords,
89
- "ResponseGroup" => $ResponseGroup,
83
+ "ResponseGroup" => "ItemAttributes,Offers",
84
+ "Timestamp" => gmdate('Y-m-d\TH:i:s\Z'),
90
- "Timestamp" => $timeStamp
85
+ "SignatureVersion" => 2,
86
+ "SignatureMethod" => "HmacSHA256"
91
87
  ] as $key => $value) {
92
- $params[$key] = rawurlencode($value);
88
+ $params[urlEncodeRfc3986($key)] = urlEncodeRfc3986($value);
93
89
  }
94
90
 
95
91
  ksort($params);
96
92
 
93
+ $parsed = parse_url($base);
97
- $signature_data = "GET " . rawurlencode($base) . " " . rawurlencode(http_build_query($params, '', '&'));
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($hash);
96
+ $signature = base64_encode(hash_hmac('sha256', $sign, SecretKey , true));
101
97
 
102
- $params2 = [];
98
+ $queries = [];
103
99
  foreach ($params as $key => $value) {
104
- $params2[] = $key . "=" . $value;
100
+ $queries[] = $key . "=" . $value;
105
101
  }
106
102
 
107
- $request = $base . "?" . join("&", $params2) . "&Signature=" . $signature;
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に変化

2018/06/27 07:23

投稿

setouchi
setouchi

スコア6

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

目的の追加

2018/06/27 05:17

投稿

setouchi
setouchi

スコア6

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

上部文章の修正

2018/06/27 04:26

投稿

setouchi
setouchi

スコア6

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

参考サイトの追加

2018/06/27 04:14

投稿

setouchi
setouchi

スコア6

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/)を参考にしました。