TwitterAPIのキーワード検索を制限いっぱい利用する方法

# まずはじめに
・ Twitterの開発者登録とアプリ作成についての説明は割愛します。
・ 無料の範囲でsearch/tweets APIを利用します。
・ 通常15分で180回ですが、アプリケーション認証を使うことで、15分で450回まで許可されます。

# Twitteroauthのインストール
こちらが公式サイト
https://twitteroauth.com/

GitHubはこちらです。
https://github.com/abraham/twitteroauth


Composerでインストールする方法はこちら

```
php composer.phar require abraham/twitteroauth
```

##  アプリケーション認証を使ったキーワード検索
search/tweetsを通常のユーザー認証で利用した場合、15分で180回ですが、アプリケーション認証を利用することにより、15分で450回取得する方法になります。

15分で450回 = 1分で30回　= 2秒で1回、の間隔で収集できます。

### ディレクトリ構成は以下になります。
twitteroauth
└ src
└ autoload.php
└ index.php

``` php:index.php
<?php
require_once 'autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;
​
class IndexController
{
	var $API_KEY = 'xxxxx';
	var $API_SECRET_KEY = 'xxxxx';
	var $ACCESS_TOKEN = 'xxxxx';
	var $ACCESS_TOKEN_SECRET = 'xxxxx';
	
	function init()
	{
		$connection = new TwitterOAuth($this->API_KEY, $this->API_SECRET_KEY, $this->ACCESS_TOKEN, $this->ACCESS_TOKEN_SECRET);
		
		// アプリ認証用のベラトークンを取得
		$_bearer_token = $connection->oauth2("oauth2/token", array("grant_type" => "client_credentials"));
		
		// ベラトークンをセット
		if(isset($_bearer_token->access_token)){
			$connection->setBearer($_bearer_token->access_token);
		}
		
		// アプリ認証でキーワード検索を実行 450 / 15min
		$params = array(
			'count' => '100',
			'include_entities' => true,
			'result_type' => 'recent',
			'tweet_mode' => 'extended', // フルテキスト取得
			'q' => 'ホモデウス' // 検索ワード
		);
		$response = $connection->get("search/tweets", $params);
	}
}
$controller = new IndexController();
$controller->init();
?>
```

## 制限（リミット）回数の確認方法
「application/rate_limit_status」を使うことにより、各APIの残り使用回数、現在の速度制限時間枠がリセットされる時間をUNIXエポック秒で表した値で返してくれます。

こちらがベラトークンを使用した「application/rate_limit_status」のレスポンスです。limitの値が450になっていることが確認できます。

```
stdClass Object
(
    [rate_limit_context] => stdClass Object
        (
            [application] => xxxxxxxxxxxxxxxxx
        )

    [resources] => stdClass Object
        (
            [search] => stdClass Object
                (
                    [/search/tweets] => stdClass Object
                        (
                            [limit] => 450
                            [remaining] => 450
                            [reset] => 1570417738
                        )

                )

        )

)
```
※上記は無料版の「Standard search API」のため、「Premium search APIs」や「Enterprise search APIs」を利用すれば、1度に収集できる件数が100件から500件に変わります。


# ベラトークンを解除して、通常のユーザー認証に戻す方法
「direct_messages/events/new」は、通常のユーザー認証でAPIを呼び出す必要があるため、setOauthTokenを呼び出して、ベラトークンをリセットします。

```php:index.php
<?php
require_once 'autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;
​
class IndexController
{
	var $API_KEY = 'xxxxx';
	var $API_SECRET_KEY = 'xxxxx';
	var $ACCESS_TOKEN = 'xxxxx';
	var $ACCESS_TOKEN_SECRET = 'xxxxx';
	
	function init()
	{
		$connection = new TwitterOAuth($this->API_KEY, $this->API_SECRET_KEY, $this->ACCESS_TOKEN, $this->ACCESS_TOKEN_SECRET);
		
		// アプリ認証用のベラトークンを取得
		$_bearer_token = $connection->oauth2("oauth2/token", array("grant_type" => "client_credentials"));
		
		// ベラトークンをセット
		if(isset($_bearer_token->access_token)){
			$connection->setBearer($_bearer_token->access_token);
		}
		
		// アプリ認証でキーワード検索を実行 450 / 15min
		$params = array(
			'count' => '100',
			'include_entities' => true,
			'result_type' => 'recent',
			'tweet_mode' => 'extended', // フルテキスト取得
			'q' => 'ホモデウス' // 検索ワード
		);
		$response = $connection->get("search/tweets", $params);
		
		// ベラトークンをリセットして、アプリ認証からユーザー認証に変更
		$connection->setOauthToken($this->ACCESS_TOKEN, $this->ACCESS_TOKEN_SECRET);
		
		// DM送信
		$user_id = 'xxxxxxx'; // 送信対象のユーザid
		$body = '小鳥のさえずり';
		$params = array(
			'event' => array(
				'type' => "message_create",
				'message_create' => array(
					'target' => array("recipient_id" => $user_id),
					"message_data" => array("text" => $body)
				)
			)
		);
		$response_dm = $connection->post('direct_messages/events/new', $params,true);
		
	}
}
$controller = new IndexController();
$controller->init();
?>
```