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

質問編集履歴

1

コードの追加

2018/11/30 04:38

投稿

snowman
snowman

スコア25

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,157 @@
1
1
  ツイッターAPIを使ってユーザーの情報を持ってきてそれをcookieに保存したいのですがエラーになってしまいます。
2
2
  調べてみるとcookieはheaderの前に書かなきゃいけないとか・・・。
3
3
  しかし、headerを使ってからじゃないとcookieに保存したいユーザーの情報が手元に来ません。
4
- どうしたら解決できますか?
4
+ どうしたら解決できますか?
5
+ ```PHP
6
+ $api_key = "" ; // API Key
7
+ $api_secret = "" ;
8
+ $access_token = "" ; // アクセストークン
9
+ $access_token_secret = "" ; // アクセストークンシークレット
10
+
11
+ //情報の取得
12
+ $request_url = 'https://api.twitter.com/1.1/account/settings.json' ; // エンドポイント
13
+ $request_method = 'GET' ;
14
+
15
+ // パラメータA (オプション)
16
+ $params_a = array(
17
+ ) ;
18
+
19
+ // キーを作成する (URLエンコードする)
20
+ $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;
21
+
22
+ // パラメータB (署名の材料用)
23
+ $params_b = array(
24
+ 'oauth_token' => $access_token ,
25
+ 'oauth_consumer_key' => $api_key ,
26
+ 'oauth_signature_method' => 'HMAC-SHA1' ,
27
+ 'oauth_timestamp' => time() ,
28
+ 'oauth_nonce' => microtime() ,
29
+ 'oauth_version' => '1.0' ,
30
+ ) ;
31
+
32
+ // パラメータAとパラメータBを合成してパラメータCを作る
33
+ $params_c = array_merge( $params_a , $params_b ) ;
34
+
35
+ // 連想配列をアルファベット順に並び替える
36
+ ksort( $params_c ) ;
37
+
38
+ // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する
39
+ $request_params = http_build_query( $params_c , '' , '&' ) ;
40
+
41
+ // 一部の文字列をフォロー
42
+ $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ;
43
+
44
+ // 変換した文字列をURLエンコードする
45
+ $request_params = rawurlencode( $request_params ) ;
46
+
47
+ // リクエストメソッドをURLエンコードする
48
+ // ここでは、URL末尾の[?]以下は付けないこと
49
+ $encoded_request_method = rawurlencode( $request_method ) ;
50
+
51
+ // リクエストURLをURLエンコードする
52
+ $encoded_request_url = rawurlencode( $request_url ) ;
53
+
54
+ // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ
55
+ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;
56
+
57
+ // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
58
+ $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;
59
+
60
+ // base64エンコードして、署名[$signature]が完成する
61
+ $signature = base64_encode( $hash ) ;
62
+
63
+ // パラメータの連想配列、[$params]に、作成した署名を加える
64
+ $params_c['oauth_signature'] = $signature ;
65
+
66
+ // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する
67
+ $header_params = http_build_query( $params_c , '' , ',' ) ;
68
+
69
+ // リクエスト用のコンテキスト
70
+ $context = array(
71
+ 'http' => array(
72
+ 'method' => $request_method , // リクエストメソッド
73
+ 'header' => array( // ヘッダー
74
+ 'Authorization: OAuth ' . $header_params ,
75
+ ) ,
76
+ ) ,
77
+ ) ;
78
+
79
+ // パラメータがある場合、URLの末尾に追加
80
+ if( $params_a ) {
81
+ $request_url .= '?' . http_build_query( $params_a ) ;
82
+ }
83
+
84
+ // オプションがある場合、コンテキストにPOSTフィールドを作成する (GETの場合は不要)
85
+ // if( $params_a ) {
86
+ // $context['http']['content'] = http_build_query( $params_a ) ;
87
+ // }
88
+
89
+ // cURLを使ってリクエスト
90
+ $curl = curl_init() ;
91
+ curl_setopt( $curl, CURLOPT_URL , $request_url ) ;
92
+ curl_setopt( $curl, CURLOPT_HEADER, 1 ) ;
93
+ curl_setopt( $curl, CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド
94
+ curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
95
+ curl_setopt( $curl, CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
96
+ curl_setopt( $curl, CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー
97
+ // if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) ) { // GETの場合は不要
98
+ // curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ
99
+ // }
100
+ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
101
+ $res1 = curl_exec( $curl ) ;
102
+ $res2 = curl_getinfo( $curl ) ;
103
+ curl_close( $curl ) ;
104
+
105
+ // 取得したデータ
106
+ $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
107
+ $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)
108
+
109
+ // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです…
110
+ // $json = file_get_contents( $request_url , false , stream_context_create( $context ) ) ;
111
+
112
+ // JSONをオブジェクトに変換
113
+ $obj = json_decode( $json ) ;
114
+
115
+ $arr = json_decode($json,true);
116
+
117
+ echo $arr[screen_name] ;
118
+
119
+ //cookie
120
+ setcookie("name",$arr[screen_name],time()+60*5);
121
+
122
+ echo $_COOKIE['name']."さんがログインしました。";
123
+
124
+ // HTML用
125
+ $html = '' ;
126
+
127
+ // タイトル
128
+ $html .= '<h1 style="text-align:center; border-bottom:1px solid #555; padding-bottom:12px; margin-bottom:48px; color:#D36015;">GET account/settings</h1>' ;
129
+
130
+ // エラー判定
131
+ if( !$json || !$obj ) {
132
+ $html .= '<h2>エラー内容</h2>' ;
133
+ $html .= '<p>データを取得することができませんでした…。設定を見直して下さい。</p>' ;
134
+ }
135
+
136
+ // 検証用
137
+ $html .= '<h2>取得したデータ</h2>' ;
138
+ $html .= '<p>下記のデータを取得できました。</p>' ;
139
+ $html .= '<h3>ボディ(JSON)</h3>' ;
140
+ $html .= '<p><textarea style="width:80%" rows="8">' . $json . '</textarea></p>' ;
141
+ $html .= '<h3>レスポンスヘッダー</h3>' ;
142
+ $html .= '<p><textarea style="width:80%" rows="8">' . $header . '</textarea></p>' ;
143
+
144
+ // 検証用
145
+ $html .= '<h2>リクエストしたデータ</h2>' ;
146
+ $html .= '<p>下記内容でリクエストをしました。</p>' ;
147
+ $html .= '<h3>URL</h3>' ;
148
+ $html .= '<p><textarea style="width:80%" rows="8">' . $context['http']['method'] . ' ' . $request_url . '</textarea></p>' ;
149
+ $html .= '<h3>ヘッダー</h3>' ;
150
+ $html .= '<p><textarea style="width:80%" rows="8">' . implode( "\r\n" , $context['http']['header'] ) . '</textarea></p>' ;
151
+
152
+ // フッター
153
+ $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>' ;
154
+
155
+ // 出力 (本稼働時はHTMLのヘッダー、フッターを付けよう)
156
+ echo $html ;
157
+ ```