質問編集履歴

1

コードの追加

2018/11/30 04:38

投稿

snowman
snowman

スコア25

test CHANGED
File without changes
test CHANGED
@@ -5,3 +5,309 @@
5
5
  しかし、headerを使ってからじゃないとcookieに保存したいユーザーの情報が手元に来ません。
6
6
 
7
7
  どうしたら解決できますか?
8
+
9
+ ```PHP
10
+
11
+ $api_key = "" ; // API Key
12
+
13
+ $api_secret = "" ;
14
+
15
+ $access_token = "" ; // アクセストークン
16
+
17
+ $access_token_secret = "" ; // アクセストークンシークレット
18
+
19
+
20
+
21
+ //情報の取得
22
+
23
+ $request_url = 'https://api.twitter.com/1.1/account/settings.json' ; // エンドポイント
24
+
25
+ $request_method = 'GET' ;
26
+
27
+
28
+
29
+ // パラメータA (オプション)
30
+
31
+ $params_a = array(
32
+
33
+ ) ;
34
+
35
+
36
+
37
+ // キーを作成する (URLエンコードする)
38
+
39
+ $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;
40
+
41
+
42
+
43
+ // パラメータB (署名の材料用)
44
+
45
+ $params_b = array(
46
+
47
+ 'oauth_token' => $access_token ,
48
+
49
+ 'oauth_consumer_key' => $api_key ,
50
+
51
+ 'oauth_signature_method' => 'HMAC-SHA1' ,
52
+
53
+ 'oauth_timestamp' => time() ,
54
+
55
+ 'oauth_nonce' => microtime() ,
56
+
57
+ 'oauth_version' => '1.0' ,
58
+
59
+ ) ;
60
+
61
+
62
+
63
+ // パラメータAとパラメータBを合成してパラメータCを作る
64
+
65
+ $params_c = array_merge( $params_a , $params_b ) ;
66
+
67
+
68
+
69
+ // 連想配列をアルファベット順に並び替える
70
+
71
+ ksort( $params_c ) ;
72
+
73
+
74
+
75
+ // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する
76
+
77
+ $request_params = http_build_query( $params_c , '' , '&' ) ;
78
+
79
+
80
+
81
+ // 一部の文字列をフォロー
82
+
83
+ $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ;
84
+
85
+
86
+
87
+ // 変換した文字列をURLエンコードする
88
+
89
+ $request_params = rawurlencode( $request_params ) ;
90
+
91
+
92
+
93
+ // リクエストメソッドをURLエンコードする
94
+
95
+ // ここでは、URL末尾の[?]以下は付けないこと
96
+
97
+ $encoded_request_method = rawurlencode( $request_method ) ;
98
+
99
+
100
+
101
+ // リクエストURLをURLエンコードする
102
+
103
+ $encoded_request_url = rawurlencode( $request_url ) ;
104
+
105
+
106
+
107
+ // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ
108
+
109
+ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;
110
+
111
+
112
+
113
+ // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
114
+
115
+ $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;
116
+
117
+
118
+
119
+ // base64エンコードして、署名[$signature]が完成する
120
+
121
+ $signature = base64_encode( $hash ) ;
122
+
123
+
124
+
125
+ // パラメータの連想配列、[$params]に、作成した署名を加える
126
+
127
+ $params_c['oauth_signature'] = $signature ;
128
+
129
+
130
+
131
+ // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する
132
+
133
+ $header_params = http_build_query( $params_c , '' , ',' ) ;
134
+
135
+
136
+
137
+ // リクエスト用のコンテキスト
138
+
139
+ $context = array(
140
+
141
+ 'http' => array(
142
+
143
+ 'method' => $request_method , // リクエストメソッド
144
+
145
+ 'header' => array( // ヘッダー
146
+
147
+ 'Authorization: OAuth ' . $header_params ,
148
+
149
+ ) ,
150
+
151
+ ) ,
152
+
153
+ ) ;
154
+
155
+
156
+
157
+ // パラメータがある場合、URLの末尾に追加
158
+
159
+ if( $params_a ) {
160
+
161
+ $request_url .= '?' . http_build_query( $params_a ) ;
162
+
163
+ }
164
+
165
+
166
+
167
+ // オプションがある場合、コンテキストにPOSTフィールドを作成する (GETの場合は不要)
168
+
169
+ // if( $params_a ) {
170
+
171
+ // $context['http']['content'] = http_build_query( $params_a ) ;
172
+
173
+ // }
174
+
175
+
176
+
177
+ // cURLを使ってリクエスト
178
+
179
+ $curl = curl_init() ;
180
+
181
+ curl_setopt( $curl, CURLOPT_URL , $request_url ) ;
182
+
183
+ curl_setopt( $curl, CURLOPT_HEADER, 1 ) ;
184
+
185
+ curl_setopt( $curl, CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド
186
+
187
+ curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
188
+
189
+ curl_setopt( $curl, CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
190
+
191
+ curl_setopt( $curl, CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー
192
+
193
+ // if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) ) { // GETの場合は不要
194
+
195
+ // curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ
196
+
197
+ // }
198
+
199
+ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
200
+
201
+ $res1 = curl_exec( $curl ) ;
202
+
203
+ $res2 = curl_getinfo( $curl ) ;
204
+
205
+ curl_close( $curl ) ;
206
+
207
+
208
+
209
+ // 取得したデータ
210
+
211
+ $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
212
+
213
+ $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)
214
+
215
+
216
+
217
+ // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです…
218
+
219
+ // $json = file_get_contents( $request_url , false , stream_context_create( $context ) ) ;
220
+
221
+
222
+
223
+ // JSONをオブジェクトに変換
224
+
225
+ $obj = json_decode( $json ) ;
226
+
227
+
228
+
229
+ $arr = json_decode($json,true);
230
+
231
+
232
+
233
+ echo $arr[screen_name] ;
234
+
235
+
236
+
237
+ //cookie
238
+
239
+ setcookie("name",$arr[screen_name],time()+60*5);
240
+
241
+
242
+
243
+ echo $_COOKIE['name']."さんがログインしました。";
244
+
245
+
246
+
247
+ // HTML用
248
+
249
+ $html = '' ;
250
+
251
+
252
+
253
+ // タイトル
254
+
255
+ $html .= '<h1 style="text-align:center; border-bottom:1px solid #555; padding-bottom:12px; margin-bottom:48px; color:#D36015;">GET account/settings</h1>' ;
256
+
257
+
258
+
259
+ // エラー判定
260
+
261
+ if( !$json || !$obj ) {
262
+
263
+ $html .= '<h2>エラー内容</h2>' ;
264
+
265
+ $html .= '<p>データを取得することができませんでした…。設定を見直して下さい。</p>' ;
266
+
267
+ }
268
+
269
+
270
+
271
+ // 検証用
272
+
273
+ $html .= '<h2>取得したデータ</h2>' ;
274
+
275
+ $html .= '<p>下記のデータを取得できました。</p>' ;
276
+
277
+ $html .= '<h3>ボディ(JSON)</h3>' ;
278
+
279
+ $html .= '<p><textarea style="width:80%" rows="8">' . $json . '</textarea></p>' ;
280
+
281
+ $html .= '<h3>レスポンスヘッダー</h3>' ;
282
+
283
+ $html .= '<p><textarea style="width:80%" rows="8">' . $header . '</textarea></p>' ;
284
+
285
+
286
+
287
+ // 検証用
288
+
289
+ $html .= '<h2>リクエストしたデータ</h2>' ;
290
+
291
+ $html .= '<p>下記内容でリクエストをしました。</p>' ;
292
+
293
+ $html .= '<h3>URL</h3>' ;
294
+
295
+ $html .= '<p><textarea style="width:80%" rows="8">' . $context['http']['method'] . ' ' . $request_url . '</textarea></p>' ;
296
+
297
+ $html .= '<h3>ヘッダー</h3>' ;
298
+
299
+ $html .= '<p><textarea style="width:80%" rows="8">' . implode( "\r\n" , $context['http']['header'] ) . '</textarea></p>' ;
300
+
301
+
302
+
303
+ // フッター
304
+
305
+ $html .= '<small style="display:block; border-top:1px solid #555; padding-top:12px; margin-top:72px; text-align:center; font-weight:700;">プログラムの説明: <a href="https://syncer.jp/Web/API/Twitter/REST_API/GET/account/settings/" target="_blank">SYNCER</a></small>' ;
306
+
307
+
308
+
309
+ // 出力 (本稼働時はHTMLのヘッダー、フッターを付けよう)
310
+
311
+ echo $html ;
312
+
313
+ ```