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

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

ただいまの
回答率

90.51%

  • Twitter

    753questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 807

phphone

score 16

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

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

<?php
//セッションを有効にする
session_start();

//////////Twitter OAUTH/////////////////////////
////////////////////////////////////////////////
// twitterOAuth を読み込む
require_once('twitter/twitteroauth.php');

/* Twitterアプリケーション申請で取得したコンシューマ key */
$consumer_key = 'xxxxxxxxxxxxxxxxxxxx';

/* Twitterアプリケーション申請で取得したコンシューマ secret */
$consumer_secret = 'xxxxxxxxxxxxxxxxxxxx';

/* 状態 */
$state = $_SESSION['oauth_state'];

/* oauth_token がセットされているかをチェック */
$session_token = $_SESSION['oauth_request_token'];

/* oauth_token がセットされているかをチェック */
$oauth_token = $_REQUEST['oauth_token'];


/* Set section var */
$section = $_REQUEST['section'];

/* PHP セッションをクリア */
if ($_REQUEST['test'] === 'clear') {
  session_destroy();
  session_start();
}

if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') {
  $_SESSION['oauth_state'] = $state = 'returned';
}

/*
 * どのプロセスにいるかによって処理を変える
 *
 * 'default': 新しいユーザにたいしてRequest Tokenをとりに行く
 * 'returned': Twitterから認証されたユーザ
 */

switch ($state) {
  default:

    $to = new TwitterOAuth($consumer_key, $consumer_secret);

    $tok = $to->getRequestToken();

    /* Tokenをセッションに格納 */
    $_SESSION['oauth_request_token'] = $token = $tok['oauth_token'];
    $_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret'];
    $_SESSION['oauth_state'] = "start";

    /* authorization URL を生成*/
    $request_link = $to->getAuthorizeURL($token);

    $content = 'Click on the link to go to twitter to authorize your account.';
    $content .= '<br /><a href="'.$request_link.'">'.$request_link.'</a>';

    header("Location: $request_link");
    break;

  case 'returned':

    ///* もし access tokens がすでにセットされている場合は、 API call にいく
    if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) {

      $to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);

      $tok = $to->getAccessToken();

      ///* Tokenをセッションに格納 
      $_SESSION['oauth_access_token'] = $tok['oauth_token'];
      $_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret'];
    }

    // Twitter名をセッションに格納
    $_SESSION['username'] = $tok["xxxx"];
/*
put here
*/
    //Topページへ戻る
    header("Location: aaa.php");

}

?>


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

$request_url = 'https://api.twitter.com/1.1/statuses/update.json' ;        // エンドポイント
    $request_method = 'POST' ;

    // パラメータA (リクエストのオプション)
    $params_a = array(
        'status' => 'APIを通して投稿してみました。 投稿時間: ' . date( 'Y/m/d H:i' ) . '投稿元: https://syncer.jp/twitter-api-matome' ,
    ) ;

    // キーを作成する (URLエンコードする)
    $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;

    // パラメータB (署名の材料用)
    $params_b = array(
        'oauth_token' => $access_token ,
        'oauth_consumer_key' => $api_key ,
        'oauth_signature_method' => 'HMAC-SHA1' ,
        'oauth_timestamp' => time() ,
        'oauth_nonce' => microtime() ,
        'oauth_version' => '1.0' ,
    ) ;

    // パラメータAとパラメータBを合成してパラメータCを作る
    $params_c = array_merge( $params_a , $params_b ) ;

    // 連想配列をアルファベット順に並び替える
    ksort( $params_c ) ;

    // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する
    $request_params = http_build_query( $params_c , '' , '&' ) ;

    // 一部の文字列をフォロー
    $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ;

    // 変換した文字列をURLエンコードする
    $request_params = rawurlencode( $request_params ) ;

    // リクエストメソッドをURLエンコードする
    // ここでは、URL末尾の[?]以下は付けないこと
    $encoded_request_method = rawurlencode( $request_method ) ;

    // リクエストURLをURLエンコードする
    $encoded_request_url = rawurlencode( $request_url ) ;

    // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ
    $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;

    // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
    $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;

    // base64エンコードして、署名[$signature]が完成する
    $signature = base64_encode( $hash ) ;

    // パラメータの連想配列、[$params]に、作成した署名を加える
    $params_c['oauth_signature'] = $signature ;

    // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する
    $header_params = http_build_query( $params_c , '' , ',' ) ;

    // リクエスト用のコンテキスト
    $context = array(
        'http' => array(
            'method' => $request_method , // リクエストメソッド
            'header' => array(              // ヘッダー
                'Authorization: OAuth ' . $header_params ,
            ) ,
        ) ,
    ) ;

    // パラメータがある場合、URLの末尾に追加 (POSTの場合は不要)
//    if( $params_a )
//    {
//        $request_url .= '?' . http_build_query( $params_a ) ;
//    }

    // オプションがある場合、コンテキストにPOSTフィールドを作成する
    if( $params_a )
    {
        $context['http']['content'] = http_build_query( $params_a ) ;
    }

    // cURLを使ってリクエスト
    $curl = curl_init() ;
    curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
    curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
    curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ;            // メソッド
    curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;                                // 証明書の検証を行わない
    curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;                                // curl_execの結果を文字列で返す
    curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ;            // ヘッダー
    if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) )
    {
        curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ;            // リクエストボディ
    }
    curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ;                                        // タイムアウトの秒数
    $res1 = curl_exec( $curl ) ;
    $res2 = curl_getinfo( $curl ) ;
    curl_close( $curl ) ;

    // 取得したデータ
    $json = substr( $res1, $res2['header_size'] ) ;                // 取得したデータ(JSONなど)
    $header = substr( $res1, 0, $res2['header_size'] ) ;        // レスポンスヘッダー (検証に利用したい場合にどうぞ)

    // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです…
    // $json = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ;

    // JSONをオブジェクトに変換
    $obj = json_decode( $json ) ;

    // HTML用
    $html = '' ;

    // エラー判定
    if( !$json || !$obj )
    {
        $html .= '<h2>エラー内容</h2>' ;
        $html .= '<p>データを更新することができませんでした…。設定を見直して下さい。</p>' ;
    }

    // 検証用にレスポンスヘッダーを出力 [本番環境では不要]
    $html .= '<h2>取得したデータ</h2>' ;
    $html .= '<p>下記のデータを取得できました。実際に更新されているかを、Twitterのアカウントで確認して下さい。</p>' ;
    $html .=     '<h3>ボディ(JSON)</h3>' ;
    $html .=     '<p><textarea rows="8">' . $json . '</textarea></p>' ;
    $html .=     '<h3>レスポンスヘッダー</h3>' ;
    $html .=     '<p><textarea rows="8">' . $header . '</textarea></p>' ;

    // アプリケーション連携の解除
    $html .= '<h2 style="color:red">アプリケーション連携の解除</h2>' ;
    $html .= '<p>このアプリケーションとの連携を解除するには、下記ページより、行なって下さい。</p>' ;
    $html .= '<p><a href="https://twitter.com/settings/applications" target="_blank">https://twitter.com/settings/applications</a></p>' ;

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

同じタグがついた質問を見る

  • Twitter

    753questions

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