ラン仲間のグループチャットでLINEボット活用！

# はじめに
本記事では、LINEボットをグループチャットで活用する事例として、これまで書いてきた記事を引きつつ総括してみるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3381/fd34ff60-85e2-2d38-841d-9ced6f041fde.png)

2024年11月23日に行われたLINEDCでLTを行ったときの内容をもとに、いただいた質問やフィードバックについても少し解説していきます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/U8dmUX0a74k?si=p82CqNZ7GCh_krf8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

発表内容は、切り出し動画をアップしてくださっているのと、スライドを公開していますので、よろしかったらご覧ください。

https://linedevelopercommunity.connpass.com/event/333879/

# グループチャットでBotを使う

ボット開発の発端となった課題は、ラン仲間で記録を手間なく集計することでした。当初FBメッセンジャーにメンバーがラン画像（ランニングアプリのスクショやフィットネスウォッチの表示写真）を投稿することで行っていましたが、画像からテキストが抽出できる Google Vision APIを知り、試してみたところ、いけそうな感触を得ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3381/de4aa950-0ec4-45b7-8b88-0894d1afcd9f.png)

一方、グループチャットに機能を組み込むことができるかというと、FBメッセンジャーではできず、LINE Bot（公式アカウント）ならできるということがわかり、Bot開発を始めました。

https://qiita.com/quwaji/items/172369dd03d045a81e87

https://qiita.com/quwaji/items/c0d3e82564734ee17379


## Q: どのくらいの期間で作られたんですか？

LT大会でいただいた質問ですが、少しづつ必要な機能から作って行って、だんだん足して行った形です。

最初に試した Vison AIは、APIのDocumentサイトでテストもできたので、やってみようと始めました。

ちょうどLINEボットの作り方をオンラインのワークショップで学んだところでしたので、必要なロジックに集中することができ、１日で「ナイスラン！」といって記録を投稿するボットができました。

その後、集計機能を作って、一月ほどで幹事のメンバーに見てもらうプロトタイプができました。

https://qiita.com/quwaji/items/a9ee4ea4375d84323ccb

メンバーにも展開してからは、認識精度の向上と機能追加を並行して行っていました。

## FB:モチベーションアップにもよさそう

そうなんです。周りで走っていると、自分もやろうという気になったり、月間ランキングなどのアイデアもメンバーから出てきました。

Qiitaの記事にはしていないのですが、こういったフィードバックにも対応してきました。データがスプレッドシートで溜まっているので目的が明確になればいかようにも集計できるのでいいですよね。

https://github.com/run-dreams/linebot-gas/issues/61

https://github.com/run-dreams/linebot-gas/issues/82

グループチャットに表示すると全員に表示されるため、公式アカウントとのチャットの方で「集計」をした時には個人集計が表示され、チーム内の順位も表示される機能を追加しました。

要望を出してくれたメンバーはもちろん、月末が近づくと「集計」してみているメンバーがちらほらいます。

ひとつ困っていることは、グループチャットと公式アカウントとの１対１チャットの区別が説明しづらいこと。呼び方や友だち登録していないグループメンバーの場合など、スッキリ説明することが難しいです。

## FB:いろいろな種類のウォッチやアプリをまたがって共有できる

いくつかのランニングアプリは、それ自体にソーシャル機能があって、同じユーザ同士でチームを作ったり、記録を共有することでモチベーションアップにも役立てられるようになっています。

一方、違うアプリを使っていると、そういった共有は難しいのですが、このようなローカルのコミュニティで共有するには、ラン画像をチャットに集めて利用することができました。

LT大会では、「今週何km走ってる」などチーム内の目標達成度を出せてもいいかもといった話もでて、活用方法は無限にあるなと思いました。なにせずっと「毎日フルマラソン」という尺度に固定されていましたから、新鮮でした。

そういえば、「イベント機能」なるものも実装していました。

https://github.com/run-dreams/linebot-gas/issues/116

https://github.com/run-dreams/linebot-gas/issues/122



# 実装の裏側

LT大会の発表を準備していて、やってきたことを整理してみると、変わったことはそんなに多くないとあらためて感じました。そんな中から、あまり記事などをみなかったQuick ReplyとquotedMessageIDを紹介しました。

## Quick ReplyとquotedMessageID

ボット開発の目標の一つに、「LINEが使える人なら記録を修正したりもできる」ということがありました。言ってみれば、チャットUIのデザインですね。

ユーザの発言を認識して、応答するのが基本ですが、選んでもらった方がいい場合もあります。そうした時に役に立つのがクイックリプライ。選択肢を提示して、選んだアクションに応じてボットが処理を実行できます。

クイックリプライの実装については、こちらの記事で細かく解説しています。

https://qiita.com/quwaji/items/b3356ea833b3d739e942

また、当時（2022年）は手段がなかった返信の活用については、2024年に入って引用返信についてのAPI拡張が行われていましたので、それも活用してみました。

具体的には、修正したいボットの「ナイスラン！」記録発言に、返信で「修正」を指示したり、他のユーザの発言に返信で「追加」することで、記録追加のフォーマットテキストにあらかじめ依頼者の名前を表示しておいたりする省力化が実現できました。

https://qiita.com/quwaji/items/1817d029dfef9b710659

## GAS開発とGitHub

GASは手軽に開発ができ、WebhookをデプロイできることからLINEボットに使われていることも多いです。開発・運用が長期化してきたり規模が大きくなってくると、ソースコード管理もしたくなってくるのですが、そこで便利に利用しているのが GithubAssistantというChromeのプラグインです。

詳細は、こちらの記事で解説しています。

https://qiita.com/quwaji/items/ff70ae9f0f018eae278d

GitHubを使うもう一つのメリットは、メンバーから上がってくるフィードバックや要望をissueとしてストックしておけることです。

- issueはできる限りコンパクトに実装できる単位にし、複数のことを一つのissueでやらないこと。
- 何か別のアイデアが浮かんだとしても、それは別のissueとして起こしておき、目の前の最小の修正なり実装に集中すること。
- いまのところ、ひとりプロジェクトではあるものの、PRを作成し、マージする時に必要なテストを意識しデグレを起こさないようにすること。

これらのことは前職の開発チームで体験してきたことですが、スキマ時間でボット保守する上でもとても役に立っています。やらかすときは、つい何かおろそかにしてしまったとき。

過去に対応したissueのリストがこちら。

https://github.com/run-dreams/linebot-gas/issues?q=is%3Aissue+is%3Aclosed

## Q:いろんなパターンがあって大変そう

アプリはTATTAがよく使われていますが、GARMINやNIKEなどウォッチと連携するアプリもあったり、フィットネスウォッチの表示を撮影して共有するメンバーには、EPSONやGARMINなどが使われています。

最初は心配しましたが、メンバーでよく使われているものから対応していると、未知のアプリや画面でもそこそこ認識されるようになりました。とはいえ、読み取れないものは出てくるので、都度パターンを追加していました。

### パターンの追加でリグレッションテスト

距離とタイムの認識は、泥臭く正規表現のパターンを順に当てていって、ヒットしたら採用というロジックになっています。

修正でパターンを調整するたびに、過去に通したパターンに影響が出ていないかをテストするため、毎回テストパターンも追加しています。

テキスト認識調整の例：

https://github.com/run-dreams/linebot-gas/pull/163/files

そのissue（修正）で対応するパターンと、過去に追加した全てのパターンが通ることをテストする関数を実行して、PRをマージするようにしています。

### 生成AIの活用

ちょうどChatGPTが出てくる前の時期で、それでも少し画像認識の機械学習でラン画像モデルを作るというアプローチも考えましたが、安易にOCRをテキスト解析する方法のまま今に至っています。

生成AIに画像から直接「距離」と「タイム」を読み取ってもらう実験もしてみました。

https://qiita.com/quwaji/items/c00ce6d001f8e35f6380

プロンプトを書きながら、これってこれまで正規表現のパターンを並べていたのを日本語にしたものだなと思いながら、結果はまずまず。

Geminiでも試してみました。なかなか良好でしたが、組み込むところまでの実装はそれなりに工数がかかりそうなため、手がついていません。

https://github.com/run-dreams/linebot-gas/issues/60

# さいごに

ボット＋グループチャットが、ちょっとした課題解決のアプローチになることもあると思います。ぜひ、そんなことを頭の片隅においてもらって、楽しいアイデアの実装につながるといいなと思います。

ひきつづき細々と、以下のリポジトリで改善と運用を続けていきます。

https://github.com/run-dreams/linebot-gas

またネタができたら記事にしたいと思います。