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

質問編集履歴

1

具体化、試行したソースの追記

2015/12/25 02:27

投稿

phphone
phphone

スコア28

title CHANGED
@@ -1,1 +1,1 @@
1
- twitter APIで、他人につぶやいてもらう方法
1
+ twitter APIで、oauth認証を通ったユーザにつぶやいてもらうために
body CHANGED
@@ -1,4 +1,10 @@
1
- twitter api をやっています。以下のプログラムで、oauth認証はできました。
1
+ twitter api をやっています。
2
+ 以下のAPIを許可してくれた第三者に「test」とつぶやかせたい場合、どのようにすればよいでしょうか。
3
+ 参考にしたのはhttp://speit.blog78.fc2.com/blog-entry-50.html
4
+ です。
5
+
6
+ oauth認証を経て、その後、その認証を通ったユーザに「test」とつぶやいてもらいたいという意味です。oauth認証自体は、apiオーナ以外のアカウントでも通すことができましたが、その時に、つぶやいてもらうための方法が、全く分からないのです。よろしくお願いいたします。
7
+
2
8
  ```php
3
9
  <?php
4
10
  //セッションを有効にする
@@ -82,7 +88,9 @@
82
88
 
83
89
  // Twitter名をセッションに格納
84
90
  $_SESSION['username'] = $tok["xxxx"];
85
-
91
+ /*
92
+ put here
93
+ */
86
94
  //Topページへ戻る
87
95
  header("Location: aaa.php");
88
96
 
@@ -90,4 +98,144 @@
90
98
 
91
99
  ?>
92
100
  ```
101
+ このソースの、
102
+ /*
103
+ put here
104
+ */
105
+ を以下のようにしても、つぶやけませんでした。
106
+ (参考:https://syncer.jp/twitter-api-matome)
107
+
108
+
109
+ ```php
110
+ $request_url = 'https://api.twitter.com/1.1/statuses/update.json' ; // エンドポイント
111
+ $request_method = 'POST' ;
112
+
113
+ // パラメータA (リクエストのオプション)
114
+ $params_a = array(
115
+ 'status' => 'APIを通して投稿してみました。 投稿時間: ' . date( 'Y/m/d H:i' ) . '投稿元: https://syncer.jp/twitter-api-matome' ,
116
+ ) ;
117
+
118
+ // キーを作成する (URLエンコードする)
119
+ $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;
120
+
121
+ // パラメータB (署名の材料用)
122
+ $params_b = array(
123
+ 'oauth_token' => $access_token ,
124
+ 'oauth_consumer_key' => $api_key ,
125
+ 'oauth_signature_method' => 'HMAC-SHA1' ,
126
+ 'oauth_timestamp' => time() ,
127
+ 'oauth_nonce' => microtime() ,
128
+ 'oauth_version' => '1.0' ,
129
+ ) ;
130
+
131
+ // パラメータAとパラメータBを合成してパラメータCを作る
93
- このAPIを許可してくれた第三者に「test」とつぶやかせたい場合、どのようにすればよいでしょうか。
132
+ $params_c = array_merge( $params_a , $params_b ) ;
133
+
134
+ // 連想配列をアルファベット順に並び替える
135
+ ksort( $params_c ) ;
136
+
137
+ // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する
138
+ $request_params = http_build_query( $params_c , '' , '&' ) ;
139
+
140
+ // 一部の文字列をフォロー
141
+ $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ;
142
+
143
+ // 変換した文字列をURLエンコードする
144
+ $request_params = rawurlencode( $request_params ) ;
145
+
146
+ // リクエストメソッドをURLエンコードする
147
+ // ここでは、URL末尾の[?]以下は付けないこと
148
+ $encoded_request_method = rawurlencode( $request_method ) ;
149
+
150
+ // リクエストURLをURLエンコードする
151
+ $encoded_request_url = rawurlencode( $request_url ) ;
152
+
153
+ // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ
154
+ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;
155
+
156
+ // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
157
+ $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;
158
+
159
+ // base64エンコードして、署名[$signature]が完成する
160
+ $signature = base64_encode( $hash ) ;
161
+
162
+ // パラメータの連想配列、[$params]に、作成した署名を加える
163
+ $params_c['oauth_signature'] = $signature ;
164
+
165
+ // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する
166
+ $header_params = http_build_query( $params_c , '' , ',' ) ;
167
+
168
+ // リクエスト用のコンテキスト
169
+ $context = array(
170
+ 'http' => array(
171
+ 'method' => $request_method , // リクエストメソッド
172
+ 'header' => array( // ヘッダー
173
+ 'Authorization: OAuth ' . $header_params ,
174
+ ) ,
175
+ ) ,
176
+ ) ;
177
+
178
+ // パラメータがある場合、URLの末尾に追加 (POSTの場合は不要)
179
+ // if( $params_a )
180
+ // {
181
+ // $request_url .= '?' . http_build_query( $params_a ) ;
182
+ // }
183
+
184
+ // オプションがある場合、コンテキストにPOSTフィールドを作成する
185
+ if( $params_a )
186
+ {
187
+ $context['http']['content'] = http_build_query( $params_a ) ;
188
+ }
189
+
190
+ // cURLを使ってリクエスト
191
+ $curl = curl_init() ;
192
+ curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
193
+ curl_setopt( $curl , CURLOPT_HEADER, 1 ) ;
194
+ curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド
195
+ curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
196
+ curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
197
+ curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー
198
+ if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) )
199
+ {
200
+ curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ
201
+ }
202
+ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
203
+ $res1 = curl_exec( $curl ) ;
204
+ $res2 = curl_getinfo( $curl ) ;
205
+ curl_close( $curl ) ;
206
+
207
+ // 取得したデータ
208
+ $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
209
+ $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)
210
+
211
+ // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです…
212
+ // $json = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ;
213
+
214
+ // JSONをオブジェクトに変換
215
+ $obj = json_decode( $json ) ;
216
+
217
+ // HTML用
218
+ $html = '' ;
219
+
220
+ // エラー判定
221
+ if( !$json || !$obj )
222
+ {
223
+ $html .= '<h2>エラー内容</h2>' ;
224
+ $html .= '<p>データを更新することができませんでした…。設定を見直して下さい。</p>' ;
225
+ }
226
+
227
+ // 検証用にレスポンスヘッダーを出力 [本番環境では不要]
228
+ $html .= '<h2>取得したデータ</h2>' ;
229
+ $html .= '<p>下記のデータを取得できました。実際に更新されているかを、Twitterのアカウントで確認して下さい。</p>' ;
230
+ $html .= '<h3>ボディ(JSON)</h3>' ;
231
+ $html .= '<p><textarea rows="8">' . $json . '</textarea></p>' ;
232
+ $html .= '<h3>レスポンスヘッダー</h3>' ;
233
+ $html .= '<p><textarea rows="8">' . $header . '</textarea></p>' ;
234
+
235
+ // アプリケーション連携の解除
236
+ $html .= '<h2 style="color:red">アプリケーション連携の解除</h2>' ;
237
+ $html .= '<p>このアプリケーションとの連携を解除するには、下記ページより、行なって下さい。</p>' ;
238
+ $html .= '<p><a href="https://twitter.com/settings/applications" target="_blank">https://twitter.com/settings/applications</a></p>' ;
239
+ ```
240
+
241
+ よろしくお願いいたします。