ヒカキンシンメトリーbotを勝手に復活させた話

追記
2022年1月にPythonへ移行しました。

https://github.com/ichii731/symmetry_bot
# はじめに
こんにちは。かつて稼働していたTwitterアカウント**[ヒカキンシンメトリbot](https://twitter.com/HIKAKIN_SYM?s=20)**をご存知でしょうか。

全自動でヒカキンさんのサムネイルなどをシンメトリー（左右対称）にしてTwitterにアップロードするアカウントです。
こんなやつ↓
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/eeb1ba6f-1439-2146-5e29-e71bc8045423.jpeg)

本人に取り上げられて一時期有名になりました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/5wnfkIfw0jE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ですがそのアカウントは2019年末より稼働しなくなってしまいました。
なので今回緊急事態宣言発令中でほぼニート状態の暇人がヒカキンシンメトリーbotを勝手に復活させました。

**[Twitter @SYMHIKA_SEI](https://twitter.com/SYM_HIKA_SEI)**

# 本家との変更点
## 大きな変更
###投稿時刻
まず大きな変更として**毎日00:10に前日分の画像のシンメトリーを一括して投稿**します。
本家シンメトリーbotでは本人様がアップロードされた直後の1時間以内くらいに投稿されてましたが、新しいやつではサーバーの都合上00:10に投稿します。（00:00分じゃ駄目なのかという話もあるかも知れませんが別のbot **[@randomhikakin](https://twitter.com/randomhikakin)** の定期実効タイミングだったりMySQLのキャッシュリフレッシュをしてたりと処理が重くなりがちなので10分遅らせています。
### 取得対象
【旧】HikakinさんのYouTubeサムネイル・Twitter画像
【新】HikakinさんのTwitter画像 **+SeikinさんのTwitter画像**
新版ではSeikinさんを勝手に追加しました。（ごめんなさい）
※YouTubeのサムネイルの取得を廃止しました。
背景としては2019年頃よりYouTube動画をTwitterで告知する際にOPG(カード画像)が表示されなくなったため動画投稿者は直接Twitter上で動画サムネイル画像をアップロードするようになったからです。YouTube API v3等を使わずにTwitter APIのみで完結するようになったのでありがたいです。
### 追加取得
後述する問題点に対処するため**過去のHikakinTVのサムネイルのシンメトリーを毎日18:00に投稿します。**
独自に取得したHikakinTVチャンネル動画データベースから取得する感じです。
全動画のjsonファイルは配布してあります。

https://github.com/tomox0115/randomhikakin/blob/main/database/hikakin.json

※PHPで特定チャンネル内のすべての動画情報を一括して取得する方法(自筆/下は英語版)

https://qiita.com/tomox0115/items/e9be3e3bf42113825d45

https://dev.to/tomox0115/get-all-video-information-about-specific-youtube-channel-3c6k

## システムの変更
### 顔認識
顔認識を行う仕組みを変更しました。
【旧】Google Cloud Vision API
**【新】OpenCV**（Python）
退化してんじゃね？って思われそうですが**仕方ないんです。お金払うのが嫌なんです…**
AzureのComputer Vision APIなら制限内で無料でやれるかも知れないんでそれでやるかもしれないです。（情報処理学会のジュニア会員なのでAzure Studentの1万円クーポンがあるから使おうか使うまいか…）

# システム設計
bot内のシステムは**本家botのソースコードは利用せず一から組み直しました。**
※本家Botのソースコードは↓

https://github.com/HIKAKIN-SYM/Bot

使用言語・ライブラリは以下のとおりです。tweepyとかを使うとオールPythonで行けたかも知れませんが動けばヨシ！とにかく暇なうちに…と考えた結果死ぬほど使い倒したPHPのtwitteroauthでツイート関連処理は組みました。
ソースコードは頒布しません。汚いので。

| 処理 | 言語(ライブラリ) |
|:-:|:-:|
| ツイート画像取得処理 | PHP(abraham/twitteroauth) |
| 顔認識＆反転処理 | Python(OpenCV/numpy) |
| 画像投稿処理 | PHP(abraham/twitteroauth) |
| 定期実行処理 | Linuxのsystemd.timer |
※動作環境:Ubuntu 20.04 LTS / PHP7.4(Composer使用) / Python3.8(pip使用)

データフローダイアグラムはこんな感じです。
![画像_2021-05-04_153638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/2c752edd-e594-67b9-9646-544f6b892bbb.png)


# 問題点
今回新しく作った上で生じた問題として**ヒカキンさん達が顔加工しまくっててうまく認識されない問題**があります。
例えば若干の変顔であればOpenCVの笑顔プリセットで認識してくれます。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/60b08cca-f924-3199-50c0-947bb7c7352b.jpeg)![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/21c78cfe-c054-548e-3706-2e71a9f5342d.jpeg)
ですが↓のようにめちゃくちゃ加工してしまうと認識できないor誤認識してしまうんです。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/beb11a8d-8625-773f-eb04-0169d54b6b39.jpeg)
このことから**認識できない場合が多いことが予想される**ので比較的補正のかかってない**過去のサムネイル画像を投稿する仕組みを導入しました。**

皆さんも是非見てみてください。そしてヒカキンさんセイキンさんすみませんm(_ _)m

**https://twitter.com/SYM_HIKA_SEI**
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/3ccd651a-d1e5-28e0-91ad-1ee5f7b1f345.jpeg)
##諸連絡
動作に関する不具合やご要望がありましたら@tomox0115までメンション飛ばして教えて下さい。すぐ対応します。

【ブログ】https://0115765.com/
【Twitter】**[@tomox0115](https://twitter.com/tomox0115)*