MAMPでTwitterボットをつくる

Twitterボットを製作しました。
その作業メモになります。
私も新米ですが、これから勉強を始める方にも読んでもらえるよう作成したため、
多くの不合理な箇所があります。
もし、こうしたら良いよ、というご指摘ございましたら頂戴できれば嬉しく思います。
## 開発着手の前に
Twitterボットを製作するためには、まずTwitterアカウントが必要です。
製作する気があってお持ちでない方は、アカウントの登録をしておいてください。
また、アカウントはあらかじめ電話番号認証しておく必要もあります。
こちらも、特に差し支えなければ済ませておいてください。
（認証したかどうかは、設定→モバイルで確認できます。）

開発環境はMAMPです。
（XAMPPでもほぼ同じような手順になると思います。）

まずはMAMPの設定を確認します。
以下のファイルをMAMPのルートディレクトリ内に用意し、ブラウザで実行してみてください。
（多くの人は`/Applications/MAMP/htdocs/`以下になると思います。）

```php:test.php
<?php // 現在時刻の取得 ?>
<?php echo date("Y/m/d H:i:s",strtotime("now")); ?>
<br />
<?php // MAMPのPHPバージョン確認 ?>
<?php echo phpversion(); ?>
```
これは、MAMPの設定時刻が正しいか確認しています。
ブラウザに時間とPHPのバージョンが表示されたと思います。
この時刻が現在時刻と異なる場合、設定を変更しなければなりません。
（実際、私も表示させた時刻は現在時刻と異なりました。）
## MAMPの時刻設定
MAMPのPHP設定ファイルは`php.ini`と呼ばれ、`/Applications/MAMP/bin/php/php5.*.*/conf/`以下にあります。
`php5.*.*`の箇所はPHPのバージョンによって変わります。
そのため、先程PHPのバージョンも確認しました。

`php.ini`が見つかったら、それを開き、550目付近にある`[Date]`を以下のように変えましょう。
恐らく、日付があってなかった人はタイムゾーンが別の国になっていたと思います。

```php:php.ini(550行目付近)
[Date]
; Defines the default timezone used by the date functions
; Will be changed by MAMP to system timezone
date.timezone = "Asia/Tokyo"
```
`php.ini`を変更した場合、MAMPを再起動する必要があります。
一度、MAMPのサーバーを落とし、再び起動させてください。

その後、もう1度`test.php`をブラウザで開くと、現在時刻に変わっているはずです。
これでMAMPの設定は終了です。
# Twitterのデベロッパーサイトに登録
TwitterのAPIを利用するためには、デベロッパーサイトに登録する必要があります。
> API（Application Programming Interface）とは、あるコンピュータプログラム（ソフトウェア）の機能や管理するデータなどを、外部の他のプログラムから呼び出して利用するための手順やデータ形式などを定めた規約のこと。

> 個々のソフトウェアの開発者が毎回すべての機能をゼロから開発するのは困難で無駄が多いため、多くのソフトウェアが共通して利用する機能は、OSやミドルウェアなどの形でまとめて提供されている。そのような汎用的な機能を呼び出して利用するための手続きを定めたものがAPIで、個々の開発者はAPIに従って機能を呼び出す短いプログラムを記述するだけで、自分でプログラミングすることなくその機能を利用したソフトウェアを作成することができる。

> 近年ではネットワークを通じて外部から呼び出すことができるAPIを定めたソフトウェアも増えており、遠隔地にあるコンピュータの提供する機能やデータを取り込んで利用するソフトウェアを開発することができる。

> <a href="http://e-words.jp/w/API.html" target="_blank">API - e-Wordsより</a>

今やTwitterやfacebookによって認証をしているWebサイト、アプリは数多く存在します。
それらは、Twitterやfacebookが用意したプログラムを使用して実装しています。
それらのことをAPIと呼びます。

今回製作するようなTwitterボットの場合、自分でゼロから（それこそ、Twitterに認証させるところから）作成するとなれば、かなり大変です。
今回は、厳密に言うとTwitterのAPIではないものを使用しますが、コマンドはほぼ同一であるため、参考になると思います。
（なぜTwitterのAPIを使用しないかは後述します。）

脱線しましたが、まずは以下のデベロッパーサイトにアクセスしてください。
https://apps.twitter.com/

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/a4ee83dd-839d-f608-0dc6-c7b4a8d8bf0d.png">

中央の「Create New App」をクリックしてください。
そうすると、アプリの登録画面になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/9bf26def-b74c-fa01-44d1-bacdfb334353.png">

登録が完了すると、以下の画面になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/314363e3-3f41-aab8-7557-2e67b082ec68.png">

今回欲しい情報は以下の4つです。

- Consumer Key
- Consumer Secret
- Access Token
- Access Token Secret

これらは、TwitterのAPIを利用するために使います。
（開発者コードのようなものです。）

まずは、「Keys and Access Tokens」タブをクリックします。
以下の画面にて、*Consumer Key*と*Consumer Secret*の値が手に入ります。
これらをテキストエディタにでもコピーしてきましょう。
（後で使います。）

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/f402cd5d-c3d7-ad81-bd34-d6c23fd4345b.png" width=500px>

次に、*Access Token*と*Access Token Secret*を入手します。
同じ「Keys and Access Tokens」内で下の方にスクロールすると、以下のようなボタンがあるため、クリックして*Access Token*と*Access Token Secret*を生成します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/ea6f4307-4772-6952-a3d5-78145405247d.png" width=500px>

「Create my access Token」をクリックするとページが更新されます。
もう1度「Your Access Token」の位置にいくと、生成されているはずです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/dd65ebc5-9d8d-36b3-117d-be564d62f68c.png" width=500px>

以上で、必要な情報は取得できました。
これら4つの値は「Regenerate」ボタンで再生成することも可能です。
他の人に知られてしまい、不都合が生じる際や本格的にアプリを製作するときには再生成しましょう。

余談ですが、よく耳にするトークン、証明書に例えられることがあります。
> *トークンのイメージ*
> トークン（token）とは、運転免許証に例えることができる。トークンには、そのトークンの持ち主が誰であるかや（免許証でいえば氏名など）、どのような権利を持っているか（免許証でいえば普通自動車や自動二輪の運転が可能である、など）が記載されている。なお、ここではトークンをIDカードやパスポートではなく（これらには、通常は名前情報だけが記入されている）、免許証に例えている理由は、トークンには名前だけではなく、「～する権利」も含まれているからである。

> <a href="http://www.atmarkit.co.jp/fwin2k/tutor/winsecurity01/winsecurity01_02.html" target="_blank">プロセスとトークンとACL - @ITより</a>

## APIのファイルを準備
それでは今回の核となるファイルを準備しましょう。
通常であれば、「*TwitterOAuth*」というAPIを利用するのですが、バージョンアップに伴い、PHPのパッケージ管理ツールであるComposerでのインストールになってしまいました。
<a href="http://qiita.com/kino0104/items/9f9e6f75d58b40663673" target="_blank">abraham/twitteroauthを使う</a>
Composerは非常に便利ですが、ターミナル（Windowsではコマンドプロンプト）を利用する必要があるため、それらに慣れていないとここで時間をとられてしまいます。

そのため、ファイルを直接ダウンロードできる*TwistOAuth*を採用します。
これは、*TwitterOAuth*をベースに改良を加えたAPIです。

ますはダウンロードをしましょう。
<a href="https://github.com/mpyw/TwistOAuth" target="_blank">TwistOAuth（Github）</a>（英語です）
下にいくと、「*Preparation（準備）*」の項目があるので、そちらの「*Direct Download*」→「*青くなっているhere*」の部分からダウンロードできます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/118817/9e8f9c3e-fda8-3420-14e2-30f6ba621958.png">

`TwistOAuth.phar`というファイルがダウンロードされます。
こちらをMAMPのルートディレクトリに配置しましょう。

こちらのAPIは基本的に*TwitterOAuth*のコマンドと同じです。
そのため、ドキュメントを見たいときはそちらも照らし合せてみてください。
<a href="https://dev.twitter.com/overview/documentation" target="_blank">Twitter Developers</a>

また、有志の方が日本語化などをしてくれています。
<a href="http://qiita.com/bonyochan/items/8ae288f61a6f5b8a2637" target="_blank">TwistOAuthれどめ勝手に日本語化(Jul 02, 2014)</a>
<a href="http://qiita.com/yokoh9/items/760e432ebd39040d5a0f#twitteroauth" target="_blank">Twitter APIでつぶやきを取得する</a>
# ソースコード準備、テスト
それでは、ソースコードを用意します。
下記コードで`bot.php`というファイルを作成してください。


```php:bot.php
<?php
// TwistOAuthの読み込み
require 'TwistOAuth.phar';

// 定数の値を設定
define('CONSUMER_KEY', 'CK');           // CKはConsumer Keyの値で置き換え
define('CONSUMER_SECRET', 'CS');        // CSはConsumer Secretの値で置き換え
define('ACCESS_TOKEN', 'AT');           // ATはAccess Tokenの値で置き換え
define('ACCESS_TOKEN_SECRET', 'AS');    // ASはAccess Token Secretの値で置き換え

// 変数を設定
$header = 'Content-Type: text/plain; charset=utf-8';

try {
    // TwistOAuthの新しい接続を生成
    $connection = new TwistOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
    // ツイートする
    $res = $connection->post('statuses/update', [
        'status' => 'こんにちは'
    ]);
    // おまじない
    header($header, true, 200);
    // 返却値。成功したら、「ツイートしました。」とブラウザに表示
    echo "ツイートしました";
} catch (Exception $e) {
    // おまじない
    header($header, true, $e->getCode() ?: 500);
    // ツイートに失敗したら、「ツイート失敗」と表示
    echo "ツイート失敗: {$e->getMessage()}\n";
}
```
作成したら、ブラウザで確認してみましょう。
「ツイートしました」と出力されていれば、成功です。
自分のTwitterアカウントに行き、ツイートされているか確認しましょう。

APIを利用すれば、簡単なソースコードでTwitterボットを実装できることが分かります。
ツイートするメソッドである`post('statuses/update')`については、以下のドキュメントに書いてあります。
Twitterのデベロッパーサイトは全て英語ですが、日本語で解説してくれているサイトもたくさんあります。
そのため、気になるメソッドがあったら、検索してみましょう。
<a href="https://dev.twitter.com/rest/reference/post/statuses/update" target="_blank">POST statuses/update</a>

余談ですが、私はこのあたりでつまづきました。
<a href="https://teratail.com/" target="_blank">teratail</a>様に質問を投稿してしまったほどです。
（ご回答いただいたCertainN様、tomohiro_obara様、ありがとうございました。）
作業ログとして掲載しておきます。
<a href="https://teratail.com/questions/31008" target="_blank">TwistOAuthの読み込みでエラーになります</a>

## 定時にツイートさせる
さて、ツイートする機能ができました。
Twitterボットといえば、やはり定期的につぶやいてこそだと思います。
そのため、定刻になったら作動するように`cron`を設定します。
（ここからはコマンドラインを利用します。）

私はMACでターミナルを利用しているため、以降ターミナルと呼びます。

> cronとは、決められた時刻にコマンドを定期的に実行させるためのデーモンプロセスです。
> cronではコマンドだけにとどまらず、シェルスクリプトや、PerlやPHPなどのインタープリタ言語で書かれたプログラムも動作させることができます。
>
> <a href="http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A" target="_blank">cronの設定・実行 - WEBサービス創造記より</a>

この機能を利用して、PHPファイルを定刻に作動させます。

**Windowsの場合、crontabをインストールするケースがあるようです。**
<a href="http://sfi.hamazo.tv/e1350639.html" target="_blank">http://sfi.hamazo.tv/e1350639.html</a>

ターミナルで作業ディレクトリに移動します。

```sh
$ cd /Applications/MAMP/htdocs/twitter_bot/
```

そこにて作成した`bot.php`があることを確認し、下記コマンドを入力します。

```sh
$ crontab -e
```

そうすると、viコマンドでたちあがります。
viコマンドは、ターミナル上のテキストエディタのようなものです。
`i`を押すと、`INSERT`という文字が、画面左下に表れますので、以下のように入力しましょう。

```sh
// 左から、「分」、「時」、「曜日」、「日」、「月」を表します。
// openで対象のアドレスを開きます。
0 20 * * * open http://localhost/twitter.bot/bot.php
```
これは毎日20時にbot.phpが立ち上がり、ツイートするという設定です。
20の場所を10に変えれば毎日10時になります。

完了したら、「esc（エスケープキー）」を押した後、`w`、`q`と押してください。
これで上書き保存完了です。

最後にちゃんと登録できているか確認します。

```sh
$ crontab -l
```
自分が入力したものがちゃんと表示されれば成功です。
あとは、設定した時間にちゃんとつぶやかれるか、ドキドキしながら待っていてください。
## さいごに
非常に簡単、かつ煩雑ではありましたが、以上になります。
今後、別記事にてさらに機能をつめていきたいとも思います。
下に、主に利用した参考サイトを掲載します。

## 参考サイト
- <a href="http://pc-karuma.net/mamp-settings-mac/" target="_blank">PCのカルマ　MAMPの初期設定</a>
- <a href="http://php.net/manual/ja/index.php" target="_blank">PHP マニュアル</a>
- <a href="http://dotinstall.com/lessons/twitter_bot_php_v2" target="_blank">ドットインストール　PHPでツイッターボットを作ろう</a>（視聴するためには有料会員になる必要があります）
- <a href="http://e-words.jp/w/API.html" target="_blank">e-Words　API</a>
- <a href="http://qiita.com/gabu/items/4a63e6b56dd50da1f528" target="_blank">Android再入門 - Twitterクライアントを作ってみよう - Twitter APIを使うアプリを登録</a>
- <a href="http://www.atmarkit.co.jp/fwin2k/tutor/winsecurity01/winsecurity01_02.html" target="_blank">@IT　プロセスとトークンとACL</a>
- <a href="http://qiita.com/kino0104/items/9f9e6f75d58b40663673" target="_blank">abraham/twitteroauthを使う</a>
- <a href="https://github.com/mpyw/TwistOAuth" target="_blank">TwistOAuth（Github）</a>
- <a href="https://dev.twitter.com/overview/documentation" target="_blank">Twitter Developers</a>
- <a href="http://qiita.com/bonyochan/items/8ae288f61a6f5b8a2637" target="_blank">TwistOAuthれどめ勝手に日本語化(Jul 02, 2014)</a>
- <a href="http://qiita.com/yokoh9/items/760e432ebd39040d5a0f#twitteroauth" target="_blank">Twitter APIでつぶやきを取得する</a>
- <a href="https://teratail.com/" target="_blank">teratail</a>
- <a href="http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A" target="_blank">WEBサービス創造記 - cronの設定・実行</a>