Twitterプロフィール画像が自動更新される「うたた寝bot」をつくる

今回PHPでTwitterプロフィール画像が自動更新されるbotを作りました。
たまにプロフィール画像がうたた寝する「うたた寝bot」です。制作過程や参考記事などをまとめておきたいと思います。

##構想
TwitterAPIの勉強としてbotを作ってみることにしました。Twitterでプロフィール画像を切り替えしている方を見かけ、自動で切り替えができたら面白いなと思ったのがきっかけです。

(実際に切り替えができるサービスもあります)
[Twitterアイコンを自動で変更する連携アプリ ](https://startupsns.com/2wittericon-autochanger-2743)

今回はプロフィール画像を通常用とうたた寝用の2パターンの画像を用意し、「1時間に10分間だけうたた寝バージョンの画像が表示される」プログラムを作ることにしました。


##条件（動作環境・ライブラリ等）
- macOS High Sierra
- PHP7.1
 - TwitterOAuth https://github.com/abraham/twitteroauth
- MAMP
- Visual Studio Code

##過程
###Twitter APIの登録
英文を入力するところはGoogle翻訳を使いました。



参考URL
[【2019年1月最新版】新しくなったTwitterのAPIの登録方法と使い方。](https://www.torikun.com/entry/twitter-developer-api/)

###TwitterOAuthの読み込み
OAuth認証用ライブラリのTwitterOAuthを使って、簡単にAPIが使えるようにします。Composerを使用して使う方法とダウンロードして使う方法があります。今回は最終的にダウンロードして使うことにしました。

TwitterOAuthマニュアルに沿って読み込みます。

```php:profile_sleep.php
<?php
  require_once('twitteroauth/autoload.php');
  require_once('twitteroauth/src/TwitterOAuth.php');

  use Abraham\TwitterOAuth\TwitterOAuth;
```

参考URL(OAuth認証とは？)
[一番分かりやすい OAuth の説明
](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)

###APIを利用するための情報を記述、インスタンス生成
Twitterデベロッパーサイトにある自身のKey and Tokens情報を入力し、インスタンスを生成します。

```php:profile_sleep.php
  $consumerKey = "XXXXXXXX";
  $consumerSecret = "XXXXXXXX";
  $accessToken = "XXXXXXXX";
  $accessTokenSecret = "XXXXXXXX";

  $twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
```

###エラーチェックを書いておく
正常に動作するか確認するためチェック文をいれておきます。

```php:profile_sleep.php
  if ($twitter->getLastHttpCode() == 200) {
    echo "update success";
  } else {
    echo "update failed";
  }
```



###テストツイートしてみる

hello world!とツイートしてみます。


```php:profile_sleep.php
$result = $twitter->post("statuses/update", array("status" => "hello world"));
```

プロフィール画像を変更してみます。プロフィール画像はbase64に変換されたデータを使います。



```php:profile_sleep.php
 //画像をbase64データに変換する
 $testblob = file_get_contents("test.png");
 $testblob_b64 = base64_encode($testblob);

 //プロフィール画像を変更する
 $update_img = $twitter->post('account/update_profile_image', array('image' => $testblob_b64));

```

無事ツイート&プロフィール画像が変更できました。他にもデータ取得をしてみたり、いろいろやってみると楽しいです。
[API reference index
]
(https://developer.twitter.com/en/docs/api-reference-index)

参考URL
[Manage account settings and profile](https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_image)
[PHPからTwitterを操作できる "TwitterOAuth" を使ってみよう](https://weblabo.oscasierra.net/php-twitteroauth/)
[PHPからTwitterを操作する、いろいろなパターン(TwitterOAuth編)](https://qiita.com/kumasun/items/70f035a7d214d69d62c1)




###ランダムに表示するコードを書く
「1時間に10分だけ違う画像に切り替える（ただし、どの10分間になるかはランダム）」という条件は、**「（１）5/6の確率で通常画像、1/6の確率でうたたね画像が設定されるようにし、（２）このプログラムを10分ごとに実行する」**方法で再現することにしました。

ここでは、（１）の条件を記述します。まず使用する画像をエンコードします。

```php:profile_sleep.php
  //通常画像
  $normalblob = file_get_contents("normal.png");
  $normalblob_b64 = base64_encode($normalblob);

  //うたた寝画像
  $sleepblob = file_get_contents("sleep.png");
  $sleepblob_b64 = base64_encode($sleepblob);
```

パーセンテージを指定し、ランダムで取り出してプロフィール画像を変更します。

```php:profile_sleep.php
  $normal = array("image" => $normalblob_b64, "per" => ( 5 / 6 ) * 100);
  $sleep = array("image" => $sleepblob_b64, "per" => ( 1 / 6 ) * 100);

  $array = array($normal, $sleep);
  $target = rand(1, 100);

  foreach ($array as $val) {
    if ($target <= $val['per']) {
      $update_img = $twitter->post('account/update_profile_image', array('image' => $val['image']));
      break;
    } else {
      $target -= $val['per'];
    }
  }

```

何度か実行テストをしてみて、1/6の確率でうたた寝画像になっていれば完成です。(たくさん実行するとAPI制限かかるので注意)

これでprofile_sleep.phpは完成です。

参考URL
[確率に準じてランダムに抽出する方法（PHP）
](https://qiita.com/mochizukikotaro/items/f93be343664a70c97c68)


###cronで自動化
cronを使って自動でphpを実行するようにします。レンタルサーバーのcron設定や、ターミナルのコマンドでも実行できます。

今回はエックスサーバーのcronを使用しました。先ほど作ったものをFTPでサーバにアップしておきます。

####cronの設定（エックスサーバー）
今回は10分ごとにプログラムを実行するので、以下のように設定しました。
``分：*/10
時：*
日：*
月：*
曜日：*
コマンド：/usr/bin/php7.1 /home/エックスサーバーID/ドメイン名/public_html/profile_sleep.php 
``

これで10分ごとに実行されるようになりました。エックスサーバーではcronの実行結果がメールで届くのでエラーがでていなければ成功です。


参考URL
[エックスサーバーのcronでPHPを動かす方法＆間違いやすい部分まとめ](https://singoro.net/note/xserver-cron/#toc2)
[【エックスサーバー】cronの設定方法
](https://ysklog.net/server/1206.html)

##終わりに
####画像パスについて
今回画像を相対パスで指定していましたが、cronのエラーが発生しました。画像の絶対パスに変更すると動作することができました。
####うたた寝画像が出現する間隔を変更した
完成したbotを使ってみて、10分間隔でTwitterプロフィール画像を変更するとTwitterを開くたびにプロフィール画像の読み込みに少し時間がかかるようになりました（コンマ秒くらいですが）。
わずらわしかったので、cronで設定を変更し、 6時間に1時間だけうたた寝画像になるよう変更しました。このへんはcronで自由に変更できるので楽ちんです。
####ひとこと
今回はじめてTwitter botを作ってみて、はじめてQiitaに投稿してみました。ここをこうしたほうがいい等、指摘箇所やアドバイスがありましたらコメントいただけると幸いです。
ありがとうございました。