質問編集履歴

2 keyを誤って公開しておりましたので訂正いたしました。

YOSHI3

YOSHI3 score 8

2017/02/12 15:37  投稿

CakePHP3でTwitterのOAuth認証と呟きを取得すること
###前提・実現したいこと
下記にソースの一部などを貼りますので見ていただけますと助かります。ご対応できそうなものかどうか、ご検討いただけますと幸いです。
PHPは初心者です。現在、CakePHP3を使ってTwitterの認証をし、1年前のツイートを取得するアプリを作ろうとしています。
ですが、Twitter認証のところで詰まっています。ずっとググっていも解消できるサイトを見つけきることができませんでした。
サイトを参考にして認証できるところまでは行ったのですが、具体的にツイートを取得するためにどうすればいいのかどのサイトを見れば
リクエストトークンをもらって、リクエストトークンを使ってOAuthトークンを取得して、OAuthトークンを使ってツイートを取得するというTwitter認証の動きは理解しているつもりです。
ですが認証後にツイートを取得できません。初心者なのでどこでdumpして確認するのかなどもわかりません。
###使用したTwitterのライブラリ
abraham/twitteroauthを使用しました。composerを使用して導入いたしました。
###エラー内容
```
$tweets = $connection->get("statuses/home_timeline");
```
ここで、タイムラインを取得し
```
$this->set(compact('tweets'));
```
これで、値をブラウザの方に渡す?ことができているのかなと思っているのですが
index.ctpの方で
```
<ul>
   <?php foreach ($tweets as $tweet) : ?>
     <li><?= $tweet->text; ?></li>
   <?php endforeach; ?>
</ul>
```
こちらを挿入しても
Notice (8): Undefined variable: tweets [APP/Template/Users/index.ctp, line 14]
Warning (2): Invalid argument supplied for foreach() [APP/Template/Users/index.ctp, line 14]
上記のエラーが生じます。
###該当のソースコード
UsersController.php
```
<?php
// /posts/index
// /posts
// /(controller)/(action)/(options)
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;
use Cake\ORM\TableRegistry;
use App\Model\Entity\User;
use Cake\Auth\DefaultPasswordHasher;
use Abraham\TwitterOAuth\TwitterOAuth;
use Abraham\TwitterOAuth\TwitterOAuthException;
class UsersController extends AppController
{
    public function oauth()
   {
       // twitterのコネクション生成に必要な情報を設定
       $consumerKey = "RVQaAJSXSCk7RWIzvbnCTXPB4";
       $consumerSecret = "tQlg0fy8cnT61WruDqok9K88NfFbaI5snuyHqkLVFxnynBQVfD";
       $callback_url = "http://192.168.33.10:8000/users";
       $consumerKey = "*****************";
       $consumerSecret = "*****************";
       $callback_url = "http://hogehogehoge/users";
//TwitterOAuthのインスタンスを生成し、Twitterからリクエストトークンを取得する
       $connection = new TwitterOAuth($consumerKey,$consumerSecret);
       $request_token = $connection->oauth("oauth/request_token",
           ["oauth_callback" => $callback_url]
       );
       
//リクエストトークンはcallback.phpでも利用するのでセッションに保存する
       $this->request->session()->write("oauth_token",$request_token['oauth_token']);
       $this->request->session()->write("oauth_token_secret",$request_token['oauth_token_secret']);
// Twitterの認証画面へリダイレクト
       $url = $connection->url("oauth/authorize",
           ["oauth_token" => $request_token['oauth_token']]
       );
       header('Location: ' . $url);
       exit;
   }
   public function callback()
   {
       $consumerKey = "aaVu0Gi1AKPp1rFYoJy2wJvUsDcy";
       $consumerSecret = "aaPkJtXm9sp7zxCT5PhZzMmGloOJYzfXeJ6l0dhu2gXvBtrvpuXe";
       $consumerKey = "*****************";
       $consumerSecret = "*****************";
       $oauth_token = $this->request->session()->read("oauth_token");
       $oauth_token_secret = $this->request->session()->read("oauth_token_secret");
       //Twitterからアクセストークンを取得する
       $connection = new TwitterOAuth($consumerKey,$consumerSecret,$oauth_token,$oauth_token_secret);
       $access_token = $connection->oauth("oauth/access_token",["oauth_verifier" => $_REQUEST['oauth_verifier']]);
       pr($access_token);
       //※重要※ ここでもう一度アクセストークンを使って接続をし直す追田押忍
       //OAuthトークンとシークレットも使って TwitterOAuth をインスタンス化
       $connection = new TwitterOAuth($consumerKey,$consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']);
//ユーザー情報をGET
       $user = $connection->get("account/verify_credentials");
       $tweets = $connection->get("statuses/home_timeline");
//        $statuses = $connection->get('search/tweets', array (
//  'lang' => 'ja',
//  'q' => '検索キーワード',
//  'count' => '5'
// ) );
       $this->set(compact('users'));
       $this->set(compact('tweets'));
       pr($user);
       exit;
   }
     public function index()
 {
       $consumerKey = "aaVu0Gi1AKPp1rFYoJy2wJvUsDcy";
       $consumerSecret = "aaPkJtXm9sp7zxCT5PhZzMmGloOJYzfXeJ6l0dhu2gXvBtrvpuXe";
       $consumerKey = "*****************";
       $consumerSecret = "*****************";
       // $connection = new TwitterOAuth($consumerKey,$consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']);
     $this->viewBuilder()->layout('tw_mymemory_layout');
   $users = $this->Users->find('all');
   
   // $this->set('posts', $posts);
   
   
 }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
vagrantのローカルサーバーでMacOSを使用して作っております。
すみませんが、知恵も知識も勉強も足りずにずっと進んでおりません。どなたかお力添えしていただけますと非常に助かります。宜しくお願い致します
  • PHP

    38120 questions

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

  • Twitter

    1438 questions

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

  • CakePHP

    3177 questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

1 twitterライブラリについて編集致しました。

YOSHI3

YOSHI3 score 8

2017/02/12 15:06  投稿

CakePHP3でTwitterのOAuth認証と呟きを取得すること
###前提・実現したいこと
下記にソースの一部などを貼りますので見ていただけますと助かります。ご対応できそうなものかどうか、ご検討いただけますと幸いです。
PHPは初心者です。現在、CakePHP3を使ってTwitterの認証をし、1年前のツイートを取得するアプリを作ろうとしています。
ですが、Twitter認証のところで詰まっています。ずっとググっていも解消できるサイトを見つけきることができませんでした。
サイトを参考にして認証できるところまでは行ったのですが、具体的にツイートを取得するためにどうすればいいのかどのサイトを見れば
リクエストトークンをもらって、リクエストトークンを使ってOAuthトークンを取得して、OAuthトークンを使ってツイートを取得するというTwitter認証の動きは理解しているつもりです。
ですが認証後にツイートを取得できません。初心者なのでどこでdumpして確認するのかなどもわかりません。下記に具体的なコードを貼ります
ですが認証後にツイートを取得できません。初心者なのでどこでdumpして確認するのかなどもわかりません。
###使用したTwitterのライブラリ
abraham/twitteroauthを使用しました。composerを使用して導入いたしました。
###エラー内容
```
$tweets = $connection->get("statuses/home_timeline");
```
ここで、タイムラインを取得し
```
$this->set(compact('tweets'));
```
これで、値をブラウザの方に渡す?ことができているのかなと思っているのですが
index.ctpの方で
```
<ul>
   <?php foreach ($tweets as $tweet) : ?>
     <li><?= $tweet->text; ?></li>
   <?php endforeach; ?>
</ul>
```
こちらを挿入しても
Notice (8): Undefined variable: tweets [APP/Template/Users/index.ctp, line 14]
Warning (2): Invalid argument supplied for foreach() [APP/Template/Users/index.ctp, line 14]
上記のエラーが生じます。
###該当のソースコード
UsersController.php
```
<?php
// /posts/index
// /posts
// /(controller)/(action)/(options)
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;
use Cake\ORM\TableRegistry;
use App\Model\Entity\User;
use Cake\Auth\DefaultPasswordHasher;
use Abraham\TwitterOAuth\TwitterOAuth;
use Abraham\TwitterOAuth\TwitterOAuthException;
class UsersController extends AppController
{
    public function oauth()
   {
       // twitterのコネクション生成に必要な情報を設定
       $consumerKey = "RVQaAJSXSCk7RWIzvbnCTXPB4";
       $consumerSecret = "tQlg0fy8cnT61WruDqok9K88NfFbaI5snuyHqkLVFxnynBQVfD";
       $callback_url = "http://192.168.33.10:8000/users";
//TwitterOAuthのインスタンスを生成し、Twitterからリクエストトークンを取得する
       $connection = new TwitterOAuth($consumerKey,$consumerSecret);
       $request_token = $connection->oauth("oauth/request_token",
           ["oauth_callback" => $callback_url]
       );
       
//リクエストトークンはcallback.phpでも利用するのでセッションに保存する
       $this->request->session()->write("oauth_token",$request_token['oauth_token']);
       $this->request->session()->write("oauth_token_secret",$request_token['oauth_token_secret']);
// Twitterの認証画面へリダイレクト
       $url = $connection->url("oauth/authorize",
           ["oauth_token" => $request_token['oauth_token']]
       );
       header('Location: ' . $url);
       exit;
   }
   public function callback()
   {
       $consumerKey = "aaVu0Gi1AKPp1rFYoJy2wJvUsDcy";
       $consumerSecret = "aaPkJtXm9sp7zxCT5PhZzMmGloOJYzfXeJ6l0dhu2gXvBtrvpuXe";
       $oauth_token = $this->request->session()->read("oauth_token");
       $oauth_token_secret = $this->request->session()->read("oauth_token_secret");
       //Twitterからアクセストークンを取得する
       $connection = new TwitterOAuth($consumerKey,$consumerSecret,$oauth_token,$oauth_token_secret);
       $access_token = $connection->oauth("oauth/access_token",["oauth_verifier" => $_REQUEST['oauth_verifier']]);
       pr($access_token);
       //※重要※ ここでもう一度アクセストークンを使って接続をし直す追田押忍
       //OAuthトークンとシークレットも使って TwitterOAuth をインスタンス化
       $connection = new TwitterOAuth($consumerKey,$consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']);
//ユーザー情報をGET
       $user = $connection->get("account/verify_credentials");
       $tweets = $connection->get("statuses/home_timeline");
//        $statuses = $connection->get('search/tweets', array (
//  'lang' => 'ja',
//  'q' => '検索キーワード',
//  'count' => '5'
// ) );
       $this->set(compact('users'));
       $this->set(compact('tweets'));
       pr($user);
       exit;
   }
     public function index()
 {
       $consumerKey = "aaVu0Gi1AKPp1rFYoJy2wJvUsDcy";
       $consumerSecret = "aaPkJtXm9sp7zxCT5PhZzMmGloOJYzfXeJ6l0dhu2gXvBtrvpuXe";
       // $connection = new TwitterOAuth($consumerKey,$consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']);
     $this->viewBuilder()->layout('tw_mymemory_layout');
   $users = $this->Users->find('all');
   
   // $this->set('posts', $posts);
   
   
 }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
vagrantのローカルサーバーでMacOSを使用して作っております。
すみませんが、知恵も知識も勉強も足りずにずっと進んでおりません。どなたかお力添えしていただけますと非常に助かります。宜しくお願い致します
  • PHP

    38120 questions

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

  • Twitter

    1438 questions

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

  • CakePHP

    3177 questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る