質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

0回答

2295閲覧

twitter APIで、oauth認証を通ったユーザにつぶやいてもらうために

phphone

総合スコア28

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2015/12/25 02:03

編集2022/01/12 10:55

twitter api をやっています。
以下のAPIを許可してくれた第三者に「test」とつぶやかせたい場合、どのようにすればよいでしょうか。
参考にしたのはhttp://speit.blog78.fc2.com/blog-entry-50.html
です。

oauth認証を経て、その後、その認証を通ったユーザに「test」とつぶやいてもらいたいという意味です。oauth認証自体は、apiオーナ以外のアカウントでも通すことができましたが、その時に、つぶやいてもらうための方法が、全く分からないのです。よろしくお願いいたします。

php

1<?php 2//セッションを有効にする 3session_start(); 4 5//////////Twitter OAUTH///////////////////////// 6//////////////////////////////////////////////// 7// twitterOAuth を読み込む 8require_once('twitter/twitteroauth.php'); 9 10/* Twitterアプリケーション申請で取得したコンシューマ key */ 11$consumer_key = 'xxxxxxxxxxxxxxxxxxxx'; 12 13/* Twitterアプリケーション申請で取得したコンシューマ secret */ 14$consumer_secret = 'xxxxxxxxxxxxxxxxxxxx'; 15 16/* 状態 */ 17$state = $_SESSION['oauth_state']; 18 19/* oauth_token がセットされているかをチェック */ 20$session_token = $_SESSION['oauth_request_token']; 21 22/* oauth_token がセットされているかをチェック */ 23$oauth_token = $_REQUEST['oauth_token']; 24 25 26/* Set section var */ 27$section = $_REQUEST['section']; 28 29/* PHP セッションをクリア */ 30if ($_REQUEST['test'] === 'clear') { 31 session_destroy(); 32 session_start(); 33} 34 35if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') { 36 $_SESSION['oauth_state'] = $state = 'returned'; 37} 38 39/* 40 * どのプロセスにいるかによって処理を変える 41 * 42 * 'default': 新しいユーザにたいしてRequest Tokenをとりに行く 43 * 'returned': Twitterから認証されたユーザ 44 */ 45 46switch ($state) { 47 default: 48 49 $to = new TwitterOAuth($consumer_key, $consumer_secret); 50 51 $tok = $to->getRequestToken(); 52 53 /* Tokenをセッションに格納 */ 54 $_SESSION['oauth_request_token'] = $token = $tok['oauth_token']; 55 $_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret']; 56 $_SESSION['oauth_state'] = "start"; 57 58 /* authorization URL を生成*/ 59 $request_link = $to->getAuthorizeURL($token); 60 61 $content = 'Click on the link to go to twitter to authorize your account.'; 62 $content .= '<br /><a href="'.$request_link.'">'.$request_link.'</a>'; 63 64 header("Location: $request_link"); 65 break; 66 67 case 'returned': 68 69 ///* もし access tokens がすでにセットされている場合は、 API call にいく 70 if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) { 71 72 $to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']); 73 74 $tok = $to->getAccessToken(); 75 76 ///* Tokenをセッションに格納 77 $_SESSION['oauth_access_token'] = $tok['oauth_token']; 78 $_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret']; 79 } 80 81 // Twitter名をセッションに格納 82 $_SESSION['username'] = $tok["xxxx"]; 83/* 84put here 85*/ 86 //Topページへ戻る 87 header("Location: aaa.php"); 88 89} 90 91?>

このソースの、
/*
put here
*/
を以下のようにしても、つぶやけませんでした。
(参考:https://syncer.jp/twitter-api-matome)

php

1 $request_url = 'https://api.twitter.com/1.1/statuses/update.json' ; // エンドポイント 2 $request_method = 'POST' ; 3 4 // パラメータA (リクエストのオプション) 5 $params_a = array( 6 'status' => 'APIを通して投稿してみました。 投稿時間: ' . date( 'Y/m/d H:i' ) . '投稿元: https://syncer.jp/twitter-api-matome' , 7 ) ; 8 9 // キーを作成する (URLエンコードする) 10 $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ; 11 12 // パラメータB (署名の材料用) 13 $params_b = array( 14 'oauth_token' => $access_token , 15 'oauth_consumer_key' => $api_key , 16 'oauth_signature_method' => 'HMAC-SHA1' , 17 'oauth_timestamp' => time() , 18 'oauth_nonce' => microtime() , 19 'oauth_version' => '1.0' , 20 ) ; 21 22 // パラメータAとパラメータBを合成してパラメータCを作る 23 $params_c = array_merge( $params_a , $params_b ) ; 24 25 // 連想配列をアルファベット順に並び替える 26 ksort( $params_c ) ; 27 28 // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する 29 $request_params = http_build_query( $params_c , '' , '&' ) ; 30 31 // 一部の文字列をフォロー 32 $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ; 33 34 // 変換した文字列をURLエンコードする 35 $request_params = rawurlencode( $request_params ) ; 36 37 // リクエストメソッドをURLエンコードする 38 // ここでは、URL末尾の[?]以下は付けないこと 39 $encoded_request_method = rawurlencode( $request_method ) ; 40 41 // リクエストURLをURLエンコードする 42 $encoded_request_url = rawurlencode( $request_url ) ; 43 44 // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ 45 $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ; 46 47 // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する 48 $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ; 49 50 // base64エンコードして、署名[$signature]が完成する 51 $signature = base64_encode( $hash ) ; 52 53 // パラメータの連想配列、[$params]に、作成した署名を加える 54 $params_c['oauth_signature'] = $signature ; 55 56 // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する 57 $header_params = http_build_query( $params_c , '' , ',' ) ; 58 59 // リクエスト用のコンテキスト 60 $context = array( 61 'http' => array( 62 'method' => $request_method , // リクエストメソッド 63 'header' => array( // ヘッダー 64 'Authorization: OAuth ' . $header_params , 65 ) , 66 ) , 67 ) ; 68 69 // パラメータがある場合、URLの末尾に追加 (POSTの場合は不要) 70// if( $params_a ) 71// { 72// $request_url .= '?' . http_build_query( $params_a ) ; 73// } 74 75 // オプションがある場合、コンテキストにPOSTフィールドを作成する 76 if( $params_a ) 77 { 78 $context['http']['content'] = http_build_query( $params_a ) ; 79 } 80 81 // cURLを使ってリクエスト 82 $curl = curl_init() ; 83 curl_setopt( $curl , CURLOPT_URL , $request_url ) ; 84 curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 85 curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド 86 curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない 87 curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す 88 curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー 89 if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) ) 90 { 91 curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ 92 } 93 curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 94 $res1 = curl_exec( $curl ) ; 95 $res2 = curl_getinfo( $curl ) ; 96 curl_close( $curl ) ; 97 98 // 取得したデータ 99 $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) 100 $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) 101 102 // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです… 103 // $json = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ; 104 105 // JSONをオブジェクトに変換 106 $obj = json_decode( $json ) ; 107 108 // HTML用 109 $html = '' ; 110 111 // エラー判定 112 if( !$json || !$obj ) 113 { 114 $html .= '<h2>エラー内容</h2>' ; 115 $html .= '<p>データを更新することができませんでした…。設定を見直して下さい。</p>' ; 116 } 117 118 // 検証用にレスポンスヘッダーを出力 [本番環境では不要] 119 $html .= '<h2>取得したデータ</h2>' ; 120 $html .= '<p>下記のデータを取得できました。実際に更新されているかを、Twitterのアカウントで確認して下さい。</p>' ; 121 $html .= '<h3>ボディ(JSON)</h3>' ; 122 $html .= '<p><textarea rows="8">' . $json . '</textarea></p>' ; 123 $html .= '<h3>レスポンスヘッダー</h3>' ; 124 $html .= '<p><textarea rows="8">' . $header . '</textarea></p>' ; 125 126 // アプリケーション連携の解除 127 $html .= '<h2 style="color:red">アプリケーション連携の解除</h2>' ; 128 $html .= '<p>このアプリケーションとの連携を解除するには、下記ページより、行なって下さい。</p>' ; 129 $html .= '<p><a href="https://twitter.com/settings/applications" target="_blank">https://twitter.com/settings/applications</a></p>' ;

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問