質問編集履歴

1

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

2015/12/25 02:27

投稿

phphone
phphone

スコア28

test CHANGED
@@ -1 +1 @@
1
- twitter APIで、他人につぶやいてもらう方法
1
+ twitter APIで、oauth認証を通ったユーザにつぶやいてもらうために
test CHANGED
@@ -1,4 +1,16 @@
1
- twitter api をやっています。以下のプログラムで、oauth認証はできました。
1
+ twitter api をやっています。
2
+
3
+ 以下のAPIを許可してくれた第三者に「test」とつぶやかせたい場合、どのようにすればよいでしょうか。
4
+
5
+ 参考にしたのはhttp://speit.blog78.fc2.com/blog-entry-50.html
6
+
7
+ です。
8
+
9
+
10
+
11
+ oauth認証を経て、その後、その認証を通ったユーザに「test」とつぶやいてもらいたいという意味です。oauth認証自体は、apiオーナ以外のアカウントでも通すことができましたが、その時に、つぶやいてもらうための方法が、全く分からないのです。よろしくお願いいたします。
12
+
13
+
2
14
 
3
15
  ```php
4
16
 
@@ -166,7 +178,11 @@
166
178
 
167
179
  $_SESSION['username'] = $tok["xxxx"];
168
180
 
169
-
181
+ /*
182
+
183
+ put here
184
+
185
+ */
170
186
 
171
187
  //Topページへ戻る
172
188
 
@@ -182,4 +198,284 @@
182
198
 
183
199
  ```
184
200
 
201
+ このソースの、
202
+
203
+ /*
204
+
205
+ put here
206
+
207
+ */
208
+
209
+ を以下のようにしても、つぶやけませんでした。
210
+
211
+ (参考:https://syncer.jp/twitter-api-matome)
212
+
213
+
214
+
215
+
216
+
217
+ ```php
218
+
219
+ $request_url = 'https://api.twitter.com/1.1/statuses/update.json' ; // エンドポイント
220
+
221
+ $request_method = 'POST' ;
222
+
223
+
224
+
225
+ // パラメータA (リクエストのオプション)
226
+
227
+ $params_a = array(
228
+
229
+ 'status' => 'APIを通して投稿してみました。 投稿時間: ' . date( 'Y/m/d H:i' ) . '投稿元: https://syncer.jp/twitter-api-matome' ,
230
+
231
+ ) ;
232
+
233
+
234
+
235
+ // キーを作成する (URLエンコードする)
236
+
237
+ $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;
238
+
239
+
240
+
241
+ // パラメータB (署名の材料用)
242
+
243
+ $params_b = array(
244
+
245
+ 'oauth_token' => $access_token ,
246
+
247
+ 'oauth_consumer_key' => $api_key ,
248
+
249
+ 'oauth_signature_method' => 'HMAC-SHA1' ,
250
+
251
+ 'oauth_timestamp' => time() ,
252
+
253
+ 'oauth_nonce' => microtime() ,
254
+
255
+ 'oauth_version' => '1.0' ,
256
+
257
+ ) ;
258
+
259
+
260
+
261
+ // パラメータAとパラメータBを合成してパラメータCを作る
262
+
185
- このAPIを許可してくれた第三者に「test」とつぶやかせたい場合、どのようにすればよいでしょうか。
263
+ $params_c = array_merge( $params_a , $params_b ) ;
264
+
265
+
266
+
267
+ // 連想配列をアルファベット順に並び替える
268
+
269
+ ksort( $params_c ) ;
270
+
271
+
272
+
273
+ // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する
274
+
275
+ $request_params = http_build_query( $params_c , '' , '&' ) ;
276
+
277
+
278
+
279
+ // 一部の文字列をフォロー
280
+
281
+ $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ;
282
+
283
+
284
+
285
+ // 変換した文字列をURLエンコードする
286
+
287
+ $request_params = rawurlencode( $request_params ) ;
288
+
289
+
290
+
291
+ // リクエストメソッドをURLエンコードする
292
+
293
+ // ここでは、URL末尾の[?]以下は付けないこと
294
+
295
+ $encoded_request_method = rawurlencode( $request_method ) ;
296
+
297
+
298
+
299
+ // リクエストURLをURLエンコードする
300
+
301
+ $encoded_request_url = rawurlencode( $request_url ) ;
302
+
303
+
304
+
305
+ // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ
306
+
307
+ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;
308
+
309
+
310
+
311
+ // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
312
+
313
+ $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;
314
+
315
+
316
+
317
+ // base64エンコードして、署名[$signature]が完成する
318
+
319
+ $signature = base64_encode( $hash ) ;
320
+
321
+
322
+
323
+ // パラメータの連想配列、[$params]に、作成した署名を加える
324
+
325
+ $params_c['oauth_signature'] = $signature ;
326
+
327
+
328
+
329
+ // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する
330
+
331
+ $header_params = http_build_query( $params_c , '' , ',' ) ;
332
+
333
+
334
+
335
+ // リクエスト用のコンテキスト
336
+
337
+ $context = array(
338
+
339
+ 'http' => array(
340
+
341
+ 'method' => $request_method , // リクエストメソッド
342
+
343
+ 'header' => array( // ヘッダー
344
+
345
+ 'Authorization: OAuth ' . $header_params ,
346
+
347
+ ) ,
348
+
349
+ ) ,
350
+
351
+ ) ;
352
+
353
+
354
+
355
+ // パラメータがある場合、URLの末尾に追加 (POSTの場合は不要)
356
+
357
+ // if( $params_a )
358
+
359
+ // {
360
+
361
+ // $request_url .= '?' . http_build_query( $params_a ) ;
362
+
363
+ // }
364
+
365
+
366
+
367
+ // オプションがある場合、コンテキストにPOSTフィールドを作成する
368
+
369
+ if( $params_a )
370
+
371
+ {
372
+
373
+ $context['http']['content'] = http_build_query( $params_a ) ;
374
+
375
+ }
376
+
377
+
378
+
379
+ // cURLを使ってリクエスト
380
+
381
+ $curl = curl_init() ;
382
+
383
+ curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
384
+
385
+ curl_setopt( $curl , CURLOPT_HEADER, 1 ) ;
386
+
387
+ curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド
388
+
389
+ curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
390
+
391
+ curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
392
+
393
+ curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー
394
+
395
+ if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) )
396
+
397
+ {
398
+
399
+ curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ
400
+
401
+ }
402
+
403
+ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
404
+
405
+ $res1 = curl_exec( $curl ) ;
406
+
407
+ $res2 = curl_getinfo( $curl ) ;
408
+
409
+ curl_close( $curl ) ;
410
+
411
+
412
+
413
+ // 取得したデータ
414
+
415
+ $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
416
+
417
+ $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)
418
+
419
+
420
+
421
+ // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです…
422
+
423
+ // $json = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ;
424
+
425
+
426
+
427
+ // JSONをオブジェクトに変換
428
+
429
+ $obj = json_decode( $json ) ;
430
+
431
+
432
+
433
+ // HTML用
434
+
435
+ $html = '' ;
436
+
437
+
438
+
439
+ // エラー判定
440
+
441
+ if( !$json || !$obj )
442
+
443
+ {
444
+
445
+ $html .= '<h2>エラー内容</h2>' ;
446
+
447
+ $html .= '<p>データを更新することができませんでした…。設定を見直して下さい。</p>' ;
448
+
449
+ }
450
+
451
+
452
+
453
+ // 検証用にレスポンスヘッダーを出力 [本番環境では不要]
454
+
455
+ $html .= '<h2>取得したデータ</h2>' ;
456
+
457
+ $html .= '<p>下記のデータを取得できました。実際に更新されているかを、Twitterのアカウントで確認して下さい。</p>' ;
458
+
459
+ $html .= '<h3>ボディ(JSON)</h3>' ;
460
+
461
+ $html .= '<p><textarea rows="8">' . $json . '</textarea></p>' ;
462
+
463
+ $html .= '<h3>レスポンスヘッダー</h3>' ;
464
+
465
+ $html .= '<p><textarea rows="8">' . $header . '</textarea></p>' ;
466
+
467
+
468
+
469
+ // アプリケーション連携の解除
470
+
471
+ $html .= '<h2 style="color:red">アプリケーション連携の解除</h2>' ;
472
+
473
+ $html .= '<p>このアプリケーションとの連携を解除するには、下記ページより、行なって下さい。</p>' ;
474
+
475
+ $html .= '<p><a href="https://twitter.com/settings/applications" target="_blank">https://twitter.com/settings/applications</a></p>' ;
476
+
477
+ ```
478
+
479
+
480
+
481
+ よろしくお願いいたします。