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

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

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

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

PHP

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

Q&A

解決済

1回答

2077閲覧

ブラウザからアクセスしたときにTwitterOAuthが動作しません

HALBY

総合スコア16

Twitter

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

PHP

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

0グッド

0クリップ

投稿2016/07/30 15:22

編集2016/07/30 16:12

###前提・実現したいこと
Twitter向けの簡易的な自動投稿サービスを作っていて、現在はライブラリ等使っていないのですが機能が増えてきたので簡略化のためにTwitterOAuthを導入することにしました。
以下のようなコードを書いたのですが、ターミナルから実行した場合は正常に動作するのにブラウザから開いた場合TwitterOAuthのインスタンス化のあたりで止まってしまいそこから先の処理が行われません。なぜでしょうか?

###該当のソースコード

PHP

1session_start(); 2require_once "twitteroauth/autoload.php"; 3use Abraham\TwitterOAuth\TwitterOAuth; 4define( 'C_KEY', 'コンシューマーキー' ); 5define( 'C_SEC', 'コンシューマーシークレット' ); 6 7class OAuth { 8 function tknrq() { 9 $cnct = new TwitterOAuth(C_KEY, C_SEC); 10 $rto = $cnct->oauth('oauth/request_token', array('oauth_callback' => 'コールバックURL')); 11 $_SESSION['ot'] = $rto['oauth_token']; 12 $_SESSION['otc'] = $rto['oauth_token_secret']; 13 $url = $cnct->url('oauth/authorize', array('oauth_token' => $rto['oauth_token'])); 14 return $url; 15 } 16 function tknrt() { 17 $rto['ot'] = $_SESSION['ot']; 18 $rto['otc'] = $_SESSION['otc']; 19 $cnct = new TwitterOAuth(C_KEY, C_SEC, $rto['ot'], $rto['otc']); 20 $ato = $cnct->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier'])); 21 return $ato; 22 } 23} 24 25$oauth = new OAuth; 26 27if( isset( $_GET['oauth_token'] ) && !empty( $_GET['oauth_token'] ) && isset( $_GET['oauth_verifier'] ) && !empty( $_GET['oauth_verifier'] ) ) { 28 $ato = $oauth->tknrt(); 29 print_r($ato); 30} else { 31 $url = $oauth->tknrq(); 32 print_r($url); 33 header('Location: ' . $url); 34}

###補足など
ソースは関連する部分だけを抜き出しています
ターミナルで実行した場合は$urlが正常に出力されます
ちなみにtknrq()内の1,2,5行目をコメントアウトして適当な文字列を返すようにした場合は表示されます

###実行環境
PHP5.6.4
さくらVPS CentOS 6.8

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちなみにtknrq()内の1,2,5行目をコメントアウトして適当な文字列を返すようにした場合は表示されます

$rtoが何になっているかvar_dump($rto);で確認しましたか?デバッグの基本ですよ.また,そのままLocationヘッダで遷移してしまうとマズいので,直後にexitを入れてください.


【蛇足】

ライブラリ側の実装も含め,認証に関する例外処理が甘いような気がします.一度 mpyw/TwistOAuth で試してもらえませんか?このライブラリは少しでもおかしいことがあると TwistException をスローするのですぐに間違いに気付けます.

サンプルコードを書いておきます.

php

1<?php 2 3require 'TwistOAuth.phar'; // Composerで入れた場合は vendor/autoload.php 4 5cosnt C_KEY = 'コンシューマーキー'; 6const C_SEC = 'コンシューマーシークレット'; 7const C_CALLBACK = 'コールバックURL'; 8 9session_start(); // session_startは必ずrequireより後ろに書く 10 11try { 12 13 // セッションが空のときはリクエストトークンを取得したクレデンシャルをセッションに格納して 14 // 認証用ページにリダイレクトさせ,以降の処理はカットする 15 if (!isset($_SESSION['to'])) { 16 $_SESSION['to'] = new TwistOAuth(C_KEY, C_SEC); 17 $_SESSION['to'] = $_SESSION['to']->renewWithRequestToken(C_CALLBACK); 18 header("Location: {$_SESSION['to']->getAuthorizeUrl()}"); 19 exit; 20 } 21 22 // セッションがアクセストークン未取得状態のときはoauth_verifierをパラメータとしてそれを取りに行く 23 // 成功したらログイン済みフラグをセットする 24 if (!isset($_SESSION['logined'])) { 25 $_SESSION['to'] = $_SESSION['to']->renewWithAccessToken(filter_input(INPUT_GET, 'oauth_verifier')); 26 $_SESSION['logined'] = true; 27 } 28 29 // クレデンシャルの中身を表示 30 var_dump($_SESSION['to']); 31 32} catch (TwistException $e) { 33 34 // 認証ステップでなにか異常があったらセッションを空にしてエラーメッセージを表示 35 // (ページを更新するとリクエストトークン取得から再試行になる) 36 $_SESSION = []; 37 header('Content-Type: text/plain; charset=UTF-8', true, $e->getCode() ?: 500); 38 exit($e->getMessage()); 39 40}

投稿2016/07/30 17:29

編集2016/07/30 17:31
mpyw

総合スコア5223

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

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

HALBY

2016/07/30 22:46

こちらのコードに置き換えて試してみたところ無事動作しました! 夜中にブラウザからPHPのバージョンを確認しにいったところアップデート前のPHP5.3が表示されていたのでそれが直接の原因だと思います(なぜか朝にはPHP5.6になっていましたが…) こちらのコードにしてから動作状況がよくわかるようになりましたので大変助かっています。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問