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

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

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

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

Twitter

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

PHP

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

Q&A

解決済

1回答

3457閲覧

【Twitter】OAuthでログインしたユーザの代わりに投稿する方法はないでしょうか?

hasshy

総合スコア102

OAuth

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

Twitter

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

PHP

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

0グッド

0クリップ

投稿2018/10/12 01:51

編集2018/10/12 14:16

WebサイトにOAuthでログインしたユーザーに、変わって自動投稿をする機能を実装したいと考えています。

サーバーサイドでログイン、および投稿を行う想定です。
言語はPHPを使用し、
Twitter周りの処理はTwitterOAuthというライブラリを使用します。

手順

ログイン処理と、投稿は一連の流れではありません。
ログイン処理完了後、任意のタイミングで投稿処理を行います。

ログイン処理

  1. OAuth認証遷移ページ(login.php)にアクセスしリクエストトークンを取得
    その際に、oauth_tokenと、oauth_token_secretをセッションに退避する
  2. OAuth認証遷移ページからTwitterのOAuthログイン画面に遷移
  3. ログインに成功したらコールバック用ページ(callback.php)に戻って、oauth_verifierとoauth_tokenからアクセストークンを取得

投稿処理

ここがまだ解決できていません。
想定している手順は、下記です。

  1. ログイン時に取得した情報からアクセストークンを取得
    oauth_tokenとoauth_token_secretで個人の情報を取得、
    コールバック時に取得したoauth_verifierと組み合わせて、

  2. アクセストークンからユーザーの接続情報を取得

  3. ユーザー情報を元にTweetを投稿

困っていること

前項でふれましたが、ログインした後に任意のタイミングで投稿することができません。
アクセストークンを取得する時に必要な、oauth_verifierとoauth_tokenは、セッションで管理しているので、取り出して使うことができるのですが、
その情報で実行すると次のようなエラーが表示されます。

atal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: 現在この機能は一時的にご利用いただけません

ソース

下記の構成にしています。
まず、login.phpにアクセス、OAuth認証が終わったら、post.htmlに遷移します。

  • login.php:OAuth認証に必要な情報を取得して、認証画面に遷移させる
  • callback.php:OAuth認証で接続した時の情報を元に、接続したユーザーの情報を取得、セッションに保持する
  • post.html: 自動投稿用のボタン(リンク)を設置したページ
  • autopost.php: post.htmlでボタンが押されたら、決められた内容をPostする。

login.php

php

1<?php 2 3 // セッションを作る 4 session_start(); 5 6 // ライブラリ読み込み 7 require "vendor/autoload.php"; 8 use Abraham\TwitterOAuth\TwitterOAuth; 9 10 $consumerKey = "***"; 11 $consumerSecrect = "***"; 12 $callback = "http://localhost:8000/callback.php"; 13 14 $twitterConnect = new TwitterOAuth( 15 $consumerKey, 16 $consumerSecrect 17 ); 18 19 $requestToken = $twitterConnect->oauth( 20 'oauth/request_token', 21 array('oauth_callback' => $callback) 22 ); 23 24 // 取得した情報をセッションに保存 25 $_SESSION['oauth_token'] = $requestToken['oauth_token']; 26 $_SESSION['oauth_token_secret'] = $requestToken['oauth_token_secret']; 27 28 // twitterの認証画面へリダイレクトURLを取得 29 $url = $twitterConnect->url( 30 'oauth/authorize', 31 array( 32 'oauth_token' => $requestToken['oauth_token'] 33 ) 34 ); 35 36 // twitter認証画面へリダイレクト 37 header('Location:' . $url); 38 exit; 39 40?>

callback.php

php

1<?php 2 3 // セッションを作る 4 session_start(); 5 6 // 読み込み 7 require "vendor/autoload.php"; 8 use Abraham\TwitterOAuth\TwitterOAuth; 9 10 $consumerKey = "***"; 11 $consumerSecrect = "***"; 12 13 // セッション退避 14 $oauthToken = $_SESSION['oauth_token']; 15 $oauthTokenSecret = $_SESSION['oauth_token_secret']; 16 17 // ログインしたユーザで自動投稿を行う 18 $twitterConnect = new TwitterOAuth( 19 $consumerKey, 20 $consumerSecrect, 21 $oauthToken, 22 $oauthTokenSecret 23 ); 24 25 // アクセストークンを取得 26 $accessToken = $twitterConnect->oauth( 27 'oauth/access_token', 28 array( 29 'oauth_verifier' => $_GET['oauth_verifier'], 30 'oauth_token'=> $_GET['oauth_token'] 31 ) 32 ); 33 34 // 任意のタイミングでポストしたいので、アクセストークの取得に必要な値を退避 35 $_SESSION['oauth_verifier'] = $_GET['oauth_verifier']; 36 37 // アクセストークンからユーザー情報を取得 38 $userConnect = new TwitterOAuth( 39 $consumerKey, 40 $consumerSecrect, 41 $accessToken['oauth_token'], 42 $accessToken['oauth_token_secret'] 43 ); 44 45 //アカウントの有効性を確認するためのエンドポイントを取得 46 $userInfo = $userConnect->get('account/verify_credentials'); 47 48 if(isset($userInfo->id_str)){ 49 50 // tweetの内容設定 51     // 検証のために、ログインしたユーザーで投稿 52 // こちらは問題なく投降できました。 53 $params = [ 54 'status' => 'ログイン成功', 55 ]; 56 57 // ツイートする 58 $result = $userConnect->post( 59 'statuses/update', 60 $params 61 ); 62 63 64 $_SESSION['user_info'] = $userInfo; 65 header("Location:index.php"); 66 exit; 67 } 68 else 69 { 70 header("Location:error.html"); 71 exit; 72 } 73?> 74

post.html

<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title>投降ページ</title> </head> <body> <h1>投降ページ</h1> <a href="autopost.php">メッセージ投稿</p> </body> </html>

autopost.php

ここが解決できていません。

php

1<?php 2 session_start(); 3 4 require "vendor/autoload.php"; 5 use Abraham\TwitterOAuth\TwitterOAuth; 6 7 $consumerKey = "***"; 8 $consumerSecrect = "***"; 9 10 $twitterConnect = new TwitterOAuth( 11 $consumerKey, 12 $consumerSecrect, 13 $_SESSION['oauth_token'], 14 $_SESSION['oauth_token_secret'] 15 ); 16 17 // アクセストークン取得 18 $accessToken = $twitterConnect->oauth( 19 'oauth/access_token', 20 [ 21 'oauth_verifier' => $_SESSION['oauth_verifier'], 22 'oauth_token' => $_SESSION['oauth_token'] 23 ] 24 ); 25 26 // アクセストークンを元にユーザー情報を取得 27 $userConnect = new TwitterOAuth( 28 $consumerKey, 29 $consumerSecrect, 30 $accessToken['oauth_token'], 31 $accessToken['oauth_token_secret'] 32 ); 33 34 35 // tweetの内容設定 36 $params = [ 37 'status' => 'テスト', 38 ]; 39 40 // ツイートする 41 $result = $userConnect->post('statuses/update', $params); 42 header('Location: index.html'); 43 exit(); 44 45 46 ?>

出来る事

  • OAuthでログインして、OAuthトークンを取得、セッションに管理することが出来る
  • ログイン処理完了後ではなく、投稿時に一緒にログインして投稿する場合は成功します。
    $_GET['oauth_verifier']で取得したoauth_verifierを使えるので投稿できます。

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

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

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

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

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

guest

回答1

0

自己解決

アクセストークンはそもそも、使い回しできました。

投稿2018/10/15 13:53

hasshy

総合スコア102

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問