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

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

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

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Twitter

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

TwitterOAuthで認証キャンセル時のエラー解決法

Yknd
Yknd

総合スコア0

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Twitter

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1回答

0評価

1クリップ

5004閲覧

投稿2016/11/10 11:28

###前提・実現したいこと
TwitterApiを使ったphpでの簡易ツイッター投稿フォームを作成しています。
ユーザーに既定のツイートをしてもらうキャンペーンでの利用を想定しています。

サイト閲覧者が投稿ボタンを押す
→OAuthでアプリ認証
→閲覧者のアカウントから既定のメッセージをツイート

という流れになります。

実装に当たっては、TwitterOAuth(Abraham)というライブラリを使っています。
[https://github\.com/abraham/twitteroauth\]\(https://github\.com/abraham/twitteroauth\)

投稿自体は問題なく行えるのですが、2点ほどエラーが発生しており困っています。。
今回TwitterApiの利用がはじめてで知見に乏しく、お力添え頂けないでしょうか?

以下に該当のソースファイルも記載しておりますので、
長文となりますが、改善点などコメント頂けますと幸いです。

###実装環境

  • php5.4
  • OpenSSL support
  • TwitterOAuth ver.0.7.0

###Twitterアプリケーション設定

  • Access: Read and Write
  • Callback URL: http://***.com/test/twitter/src/callback.php
  • Callback URL Locked: No

###発生している問題・エラーメッセージ
1点目のエラーは以下の内容です。

投稿ボタンを押してOAuth認証ページ
https://api\.twitter\.com/oauth/authorize\?oauth_token=***)
にリダイレクトさせる時点で発生します。

Fatal error: Can't use function return value in write context in /home/sites/heteml/users/\*\*\*/test/twitter/src/TwitterOAuth\.php on line 366

上記のエラーは以下該当箇所のコード削除で消えましたが、
根本的な解決にはならないため、修正したいと考えています。

php

//↓TwitterOAuth\.phpエラー該当箇所 /\* Remove CACert file when in a PHAR file\. \*/ if \(!empty\(\\Phar::running\(false\)\)\) { unset\(\$options\[CURLOPT_CAINFO\]\); }

2点目のエラーは以下の内容です。

投稿ボタンを押してOAuth認証ページ
https://api\.twitter\.com/oauth/authorize\?oauth_token=***)
にリダイレクト後、「連携アプリを認証」ではなく「キャンセル」し、
「(アプリ名)に戻る」ボタンをクリックすると発生します。

Notice: Undefined index: oauth_verifier in /home/sites/heteml/users/\*\*\*/test/twitter/src/callback\.php on line 24 Fatal error: Uncaught exception 'Abraham\\TwitterOAuth\\TwitterOAuthException' with message 'Error processing your OAuth request: Invalid oauth_verifier parameter' in /home/sites/heteml/users/\*\*\*/test/twitter/src/TwitterOAuth\.php:138 Stack trace: #0 /home/sites/heteml/users/\*\*\*/test/twitter/src/callback\.php\(24\): Abraham\\TwitterOAuth\\TwitterOAuth->oauth\('oauth/access_to\.\.\.', Array\) #1 {main} thrown in /home/sites/heteml/users/\*\*\*/test/twitter/src/TwitterOAuth\.php on line 138

こちらはエラー解消の目処が立っていません。

###今回のプログラムのソースコード
※twitterディレクトリは、TwitterOAuthの「twitteroauth-master」からリネームしたものです。

**post.php**

投稿ボタンの設置ページ。redirect.phpに飛ばす。

php

<a href="twitter/src/redirect\.php"><img src="img/tweet/post_btn\.png" alt="投稿"></a>

**twitter/src/redirect.php**

Request Token、Request Secretを生成。Twitter認証ページのURLを作成し、リダイレクトする。

php

<\?php session_start\(\); require '\.\./autoload\.php'; require 'env\.php'; use Abraham\\TwitterOAuth\\TwitterOAuth; /\* TwitterOAuthを生成 \*/ \$connection = new TwitterOAuth\(CONSUMER_KEY, CONSUMER_SECRET\); /\* Request Token、Request Secretを生成 \*/ \$request_token = \$connection->oauth\('oauth/request_token', array\('oauth_callback' => OAUTH_CALLBACK\)\); /\* Request Token、Request Secretをsessionに保存 \*/ \$_SESSION\['oauth_token'\] = \$request_token\['oauth_token'\]; \$_SESSION\['oauth_token_secret'\] = \$request_token\['oauth_token_secret'\]; /\* Twitterと連携を行うURLを生成 \*/ \$url = \$connection->url\('oauth/authorize', array\('oauth_token' => \$request_token\['oauth_token'\]\)\); /\* Twitterと連携を行うURLにリダイレクト \*/ header\('Location: ' \. \$url\);

**twitter/src/callback.php**

Twitter認証画面から戻って来た時にアクセスする。oauth_verifierからRequest Token、Request Secretの照合を行い、ユーザーの確認を行う。その後Access Token、Access Secretを生成。thanks.phpへリダイレクト。

php

<\?php session_start\(\); require '\.\./autoload\.php'; require 'env\.php'; use Abraham\\TwitterOAuth\\TwitterOAuth; /\* Request Token、Request Secretをsessionから取得 \*/ \$request_token = array\(\); \$request_token\['oauth_token'\] = \$_SESSION\['oauth_token'\]; \$request_token\['oauth_token_secret'\] = \$_SESSION\['oauth_token_secret'\]; /\* Request Tokenが間違っている場合はclearsessions\.phpへリダイレクト \*/ if \(isset\(\$_REQUEST\['oauth_token'\]\) && \$request_token\['oauth_token'\] !== \$_REQUEST\['oauth_token'\]\) { // 中断する。何かが違っている。 \$_SESSION\['oauth_status'\] = 'oldtoken'; header\('Location: \./clearsessions\.php'\); } /\* TwitterOAuthを生成 \*/ \$connection = new TwitterOAuth\(CONSUMER_KEY, CONSUMER_SECRET, \$request_token\['oauth_token'\], \$request_token\['oauth_token_secret'\]\); /\* Access Token、Access Secretを生成 \*/ \$access_token = \$connection->oauth\("oauth/access_token", array\("oauth_verifier" => \$_REQUEST\['oauth_verifier'\]\)\); /\* Access Token、Access Secretをsessionに保存 \*/ \$_SESSION\['access_token'\] = \$access_token; /\* 以降ではRequest Token、Request Secretは使用しないのでsessionから削除 \*/ unset\(\$_SESSION\['oauth_token'\]\); unset\(\$_SESSION\['oauth_token_secret'\]\); /\* thanks\.phpへリダイレクト \*/ header\('Location: \.\./\.\./thanks\.php'\);

**thanks.php**

Twitter認証が完了した後にstatuses/updateでツイート投稿する。連携の前にアクセスされた場合はclearsessions.phpへリダイレクト。

php

<\?php session_start\(\); require 'twitter/autoload\.php'; require 'twitter/src/env\.php'; use Abraham\\TwitterOAuth\\TwitterOAuth; /\* Access Token、Access Secretがsessionにない場合はclearsessions,phpへリダイレクト \*/ if \(empty\(\$_SESSION\['access_token'\]\) || empty\(\$_SESSION\['access_token'\]\['oauth_token'\]\) || empty\(\$_SESSION\['access_token'\]\['oauth_token_secret'\]\)\) { header\('Location: \./twitter/src/clearsessions\.php'\); } /\* Access Token、Access Secretを取得 \*/ \$access_token = \$_SESSION\['access_token'\]; /\* TwitterOAuthを生成(パラメータによって使用できる関数を制御) \*/ \$connection = new TwitterOAuth\(CONSUMER_KEY, CONSUMER_SECRET, \$access_token\['oauth_token'\], \$access_token\['oauth_token_secret'\]\); /\* 認証済みアカウントから投稿 \*/ \$status = \$connection->post\('statuses/update', \['status' => '投稿内容 投稿日: ' \. date\( 'Y/m/d H:i' \) \. ' http://\*\*\*\*\*\.com/test/'\]\); \?> /// /// <p>投稿が完了しました。ご応募ありがとうございます。</p>

**twitter/src/clearsessions.php**

セッションをクリアする処理。ログアウトや、エラーの時に使用。その後post.phpへリダイレクトする。

php

<\?php /\* sessionsをクリア \*/ session_start\(\); session_destroy\(\); /\* post\.phpへリダイレクト \*/ header\('Location: \.\./\.\./post\.php'\);

**twitter/src/env.php**

Consumer KeyとConsumer Secret、Twitter公式サイトからのリダイレクト先であるcallback.phpのURLを定義。

php

<\?php define\('CONSUMER_KEY', '---'\); define\('CONSUMER_SECRET', '---'\); define\('OAUTH_CALLBACK', 'http://\*\*\*\*\*\.com/test/twitter/src/callback\.php'\);

###補足
同一ユーザーによる再投稿も想定していますが、
TwitterApiの仕様で同一ユーザーからの同一文言のツイートができないため、
statusにタイムスタンプを入れて対応しています。

少し不格好なツイートになるため他の回避策があればいいのですが・・

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Twitter

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。