『シバコロ』アカウントが強化されました！Node-REDでTwitterへ自動投稿

# どうもこんにちは。『シバコロ』の者です。
芝生が好きすぎるので、誰もが簡単に良質な芝生に出会うためのアプリを運営しています。
Glideを使ってアプリのモックを作成した記事はこちらです。

https://qiita.com/atoms50/items/f91b9a8b53875a7c82f6

# Twitterアカウントもやっています
『シバコロ』はアプリの提供と同時に、Twitterアカウントでの活動を行っています。
こちらのアカウントでは、僕が訪れた芝生のレポートや、シバコロに登録された芝生情報を発信しています。

https://twitter.com/shibacoro111/status/1592136895211147264?s=20&t=kjFIT2ZTScbEwZIHT-4OVg

# シバコロのアカウントを強化したい
アプリに登録された芝生情報は、なるはやでみなさんに共有したいものです。
とはいえ、これが結構大変です。現状のシバコロには新規登録された際に通知を出す機能がないので、アナログにデータベースを覗きにいくしかないのです。 
なので、僕はいつも定期的にアプリのデータベースを覗いては、新規登録があった場合は自身のTwitterで手動で入力し投稿しています。
 （新規登録がないと少し悲しい気持ちになります）

https://twitter.com/atoms50/status/1590272181908697089?s=20&t=cAmdIHErNziJZURf6lSDog

なので、今回は、シバコロアプリに新規芝生が登録されたタイミングで、登録内容を自動でTwitterアカウントに投稿する仕組みを作ります。

# 制作環境

**つかったもの**
・Node-RED
・railway
・Twitterアカウント
・Google Spred Sheet

**使用API**
・Twitter API
・Stein API
・Gyazo API

# 完成したもの

◯Node-RED
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/bd27a19f-75e9-546f-7d9e-b9e2c6f28edb.png">

◯実際にTwitterに投稿されたもの

https://twitter.com/yohsida1/status/1594724780824875008?s=20&t=YfIlaE4-24mW0eck0SGq9g

# 投稿までの流れ

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/2e3fad28-4654-06a2-4939-c214d20c8e17.png">



◯ユーザ投稿
・ユーザがGlideで作成した『シバコロ』に芝生を登録する
・投稿された芝生はGlideと連携されたSheetの新規行に追加される

◯Node-RED処置
・Node-REDで１時間おきにSheetに追加があったかを確認する
・Stein APIを使ってシートの情報を取得
・Gyazo APIを使って写真をGyazoに登録する
・投稿文章を整形する
・Twitter APIでTwitterに投稿する
・Stein APIで投稿された芝生はSheetのステータスを投稿済みに更新する

# くわしく解説
### ◯Sheetの情報取得から格納まで

◯トリガー
トリガーはinjectノードの繰り返しを指定して設定
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/8710e2b8-d945-f007-7af1-60f13f7f5bc1.png">



◯Stein get
[こちらから](https://steinhq.com/)、使用するSheetを登録し、API URLを生成する
ノード編集からAPI URLを挿入する
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/6ae9c573-73db-da94-295d-27416e6cb1f1.png">


◯Fnction
・SheetのstatusがFALSEのもの（まだ投稿していないもの）があれば格列の値を取得する。
・Coverに入っているURLを個別に取得して別の場所に格納する 
＊のちにGayzoに登録する個別処理が発生するため
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/a10073b0-5f8e-085d-a9b2-2356107c686a.png">

Sheetに入っている情報はこんな感じ
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/439e014c-c6c7-7b4f-5589-8c42306bc450.jpeg">

### ◯Gyazoへの登録処理
基本的なノードの構成はこちらの記事を参考にした

https://qiita.com/ukkz/items/66fe09e7ae93ec91292d

◯image
編集からOutputをbufferに設定する
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/98dafdd8-0172-9579-a579-867a3b56e1d9.png">

◯change
こちらにGyazo APIのアクセストークンを挿入する
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/de1e3b3a-370a-4d98-56f2-6da4fb789ff1.png">

### ◯投稿内容生成からTwitter投稿まで
◯Function
先ほどGyazo URLに変換した情報もあわせて、投稿内容を整形します。
投稿内容はmsgにプッシュ
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/ce3356d9-5af0-c2c1-778a-9d55ac9a7c0f.png">

◯Split
このままTwitterノードに流すと、複数の芝生情報が格納されている場合はうまく投稿されません。分割を指定して芝生単位にSplitします。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/748bb6d7-61f2-75ac-cb51-38f252d330d4.png">

◯twitter out
TwitterのAPI keyとAccess tokenを挿入します。
＊私の場合、権限周りでエラーが出ました。[こちら](https://www.sassy-blog.com/entry/2022/02/21/223016)の記事を参考にDeveloperサイトの設定を変更すると解決しました
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/4553f857-1bf6-8c43-e6c0-9b4a39432605.png">


### ◯投稿したSheetのステータスを投稿済みにする
◯inject
こちらも１時間おきの定期実行を設定します。
stein updaterowsノードに渡すJSONを記述します。
今回はFALSEの行を検索してTRUEに変更するように記述しています。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/85ce0f93-a659-3b8c-6229-04a9af9b064c.png">

# ユーザからのFB
『シバコロ』に登録してもらったユーザに、自身・他人の芝生情報がTwitterに自動投稿されているのをみせて感想をもらった。

:::note info
**感想**
- 自動投稿されるのは「まあ、いいんじゃない」という気持ち（よしだがアナログに投稿するのと変わらないので）
- Gyazoの写真がリンク形式になっているので、クリックすると『シバコロ』の芝生ページに飛ぶのかと思った。芝生の詳細情報を見るために押したのに写真だけのページに遷移して違和感を感じた
- 特徴のある芝生ならいいが、ベーシックな芝生だと写真だけでは変わりばえしないので、簡潔な芝生の推しポイントが記載されていると興味をもてると思った。

:::


# ふりかえりと今後の更新
今回、Node-REDでシートの更新をトリガーにするノードがなかったため、定期実行するようなプログラムとしている。
そのせいで以下のような問題が発生し、実装が煩雑になった。
・複数情報をTwitter投稿するケースが生まれたため配列処理を実施
・投稿済み・未投稿を判別するためにシートにステータス行を追加
 
シート更新をトリガーにする機能がMakeにはあることが分かったので、Makeを使ってTwitter自動化を行った方がよりスマートかもしれない。