LINE Bot 開発チュートリアル

LINE Developers の MessagingAPIのドキュメントを参考にして、Botを開発したいと思います。

Messaging API | LINE Developers

1. MessagingAPIドキュメント概要

f:id:massox:20200617222509p:plain
LINE-dev-MessagingAPI-doc

内容はざっくりとこんな感じです。

  • 開発ガイドライン
    • Bot開発における禁止事項が記されている(大量リクエストしないでね、とか)
  • クイックスタート
    • Botを作る為に最低限知っておくべき情報が記述されている
  • ガイド
    • Botを作る為に必要なさらに詳細な情報が記述されている
  • Flex Message
    • メッセージの見た目をCSSを使って変更させるFlex Message 機能について書かれている
  • 概念
    • 用語説明
  • リファレンス
    • APIリファレンス

クイックスタートを読めば、サンプルのBotが作れそう。 まずはそこからやります。

2. クイックスタートを読む

■概要, メッセージタイプ

  • MessagingAPIでどのようなことを実現できるかが分かった
  • メッセージタイプにはいろいろあり、Botが発信する情報を豊かに表現できることが分かった
  • 【感想】だが、まずはテキストメッセージタイプによる情報の発信とユーザーからの情報の取得のみを行うこととする

■はじめに

  • チャンネルとは何なのかが分かった
  • 開発者コンソールで、任意のプロバイダについて、チャンネルを作成する手順が分かった
  • 【作業】とりあえず、チャンネルを作った

■権限を管理する

  • プロバイダに追加されたユーザーの権限として、AdminとMemberの二種類があることが分かった
  • チャンネルに追加されたユーザーの権限として、Admin, Member, Testerの三種類があることが分かった
  • 【感想】今回開発に関わるのは私一人なので、プロバイダとチャンネルに自分をAdminとして追加する(デフォルトがそれ)で良いと思う

■チャンネルアクセストーク

  • チャンネルへのアクセストークンには短期、長期、v2.1の三種類があることが分かった
  • サンプルでは長期を、本番用ではv2.1を使うことが推奨されていることが分かった

調査:JWTって何?

JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用 - Yahoo! JAPAN Tech Blog

■JWTを生成する

  • アサーション署名キーを発行する必要がある(公開鍵をLINEが、秘密鍵を開発者が保持する)ことが分かった
  • アサーション署名キーとJWT用ライブラリを組み合わせてJWTによるチャンネルへのアクセスを実現するみたいということが分かった(この理解で合っているのかな…)
  • JWTライブラリがやることは、設定されたアサーション署名キー(開発者が保持する秘密鍵)を入力として、署名する(暗号化する?)ことで、JWTと言う名のコードが出力される。まだ理解はできてない。

3. サンプルEchoBotを作る

ここでは、以下のチュートリアルにしたがってEchoBot(おうむ返しBot)を作る。 LINEBot開発用のSDKがサポートしている言語は以下の通り。

参考:LINE Messaging API SDK | LINE Developers

本番開発では、Pythonを使うつもりだが、ここではチュートリアルに忠実に従うためJava用のSDKを使う。

■サンプルボットを作成する

手順は、ドキュメントに書いている通りでOK。綺麗に書かれていてわかりやすい。

developers.line.biz

Bot開発に慣れていない人で、初見の場合、困るかもしれないところを以下にメモしている。

  • チャンネルシークレットってどこにあるの?
    • LINEコンソール > プロバイダ > チャンネル > Basic Settings
  • チャンネルアクセストークンってどこにあるの?
    • LINEコンソール > プロバイダ > チャンネル > Messaging API Settings
  • HerokuのDeploy画面に表示されているLINE_BOT_CHANNEL_TOKENには何を設定するの?
    • LINEコンソールでコピーしたチャンネルアクセストーク
  • HerokuのDeploy画面に表示されているLINE_BOT_CHANNEL_SECRETには何を設定するの?
    • LINEコンソールでコピーしたチャンネルシークレット
  • Herokuで出てくるdynosって何?
  • デプロイ完了後BotサーバーのURLをLINEコンソールのWebhookURLに貼った後、Verifyボタンを押してもエラーになるんですが
    • ちょっと待った方が良い。自分の場合はデプロイ完了後2分ぐらい待ったらURLのVerifyが成功した。

■サンプルボットを使ってみる

LINEコンソール > プロバイダ > チャンネル > Messaging API Settings


Bot InformationにQRコードがあるので、お手持ちのスマホ(LINEアプリインストール済み)で読み取ればBotを友達に追加できる。 もし、スマホを持っていない場合やLINEアプリをインストールしたくない場合は、ごめん。どうしようもない。


では、適当にメッセージを打ってみよう。

f:id:massox:20200617231110j:plain


いや、なんか変なメッセージも一緒についてくるんですけど。
なんかデフォルトで設定されてるメッセージかな?
LINEコンソールを見に行くと、怪しいやつがいました。


f:id:massox:20200617231253p:plain


Auto-reply messages をDisabled にすれば良さそう。(実際そう)
付け加えると、Greeting messages は友達追加した時に最初に送られるメッセージのこと。
私は挨拶大事だと思うので、こっちはEnabledのままにしときます。


f:id:massox:20200617231741p:plain


ここまで終わったら普通におうむ返しをしてくれるようになった。


f:id:massox:20200617230631j:plain


という感じです。 次回は、テキスト以外のメッセージタイプも取り扱えるKitchensinkサンプルBotを作ります。

Slack分析奮闘記#1 SlackAPIから情報取得して発言内容をWordcloudにする

前回の記事

thinker-masso.hatenablog.com

はじめに

データ分析の素人である私が、とあるコミュニティのSlackデータ分析にチャレンジさせてもらえることになりました。 せっかくなので、「Slack分析奮闘記」として、そこから得た学びをアウトプットしていこうと思います。

本記事では、前回の記事で説明した砂場遊びについて簡単に説明します。 具体的な処理については、Qiitaにまとめています。 qiita.com

砂場遊びの概要

  • SlackAPI経由でSlackの情報(チャンネル、ユーザー、メッセージ)を取得する
  • ユーザーごとにメッセージをまとめてWordcloudを出力して、各ユーザーの特徴を見てみる

学んだこと

  1. 形態素解析分かち書き
  2. 文書のノイズ除去方法(クリーニング、ストップワード除去、正規化)
  3. SlackAPIの使い方
  4. Pandasを用いたテーブルデータの取り扱い
  5. TFIDFによる単語の重要度スコアリング
  6. Wordcloudの生成(スコアとしてTFIDFを用いた)

Slack分析奮闘記#0 はじまり

はじめに

データ分析の素人である私が、とあるコミュニティのSlackデータ分析にチャレンジさせてもらえることになりました。 せっかくなので、「Slack分析奮闘記」として、そこから得た学びをアウトプットしていこうと思います。

Slack分析プロジェクトのモチベーション

  • 実践に近いデータ分析プロジェクトに取り組む経験を初学者に提供する
  • コミュニティの発展に役立つインテリジェンスが得られたらいいな

プロジェクトの概要

  • 有識者レコメンドシステム構築
    • ある技術に関するワード(例:自然言語処理)を入力すると、
    • それに明るい人(自然言語処理の達人とか)をレコメンドしてくれるシステムの構築
    • 「各ユーザーがどんな分野に明るいか?という情報の蓄積」と
    • 「入力したワードにマッチするユーザーの検索」が必要
  • Slackコミュニティ活性度を把握する為のダッシュボード構築
    • Slackコミュニティでのユーザーの動きを可視化する
    • コミュニティのグロースハックを行う上で重要な判断指標となるKPI設計も含む

【参考】 scrapbox.io

プロジェクトの開始

人が集まらない。ので、自分で出来ることからやろうと思った。 ちなみに、私はSlackAPIも触ったことないし、Webサービスも作ったことないし、自然言語処理もしたことない。

まず、自然言語処理やSlackAPIの使い方を学ぼうということになった。(自分の中で)

そして、いろいろ調べながら、知識のある方に参考情報を聞きながら、 一人で一生懸命砂場遊びをしました。

github.com

次回以降の記事では、私の砂場遊びでの学びを記述していこうと思う。

無駄ではあっても無意味なものにはしない

人生では失敗することがある。
多々ある。

本日はプログラミングの勉強してて、エラーが解消できずに3時間程調査や思考に費やした。 結果として、エラーは解消できていない。(明日に持ち越し)

おそらく、もっと効率的な解決方法があったはず。 お金をかけて、メンター雇ったりスクールに通ったり

そうした方が、時間を無駄にしなくて済んだだろう。

正直結構反省している。 だが、自分を否定してはいない。正直ラッキーかなと思っている。 失敗という経験を得た。(某ジャンプ漫画より引用)

で、今回の行動については、無駄ではあったが無意味ではないなと思った。

無駄と無意味の違いとは

kotobank.jp

kotobank.jp

今回、勉強中にハマった箇所の解決は3時間もかけず(しかも解決できず笑)に達成する手段はあるはず。 非効率な時間の使い方をしたと言える。つまり無駄である。

しかし、この失敗から学び、次の行動をあるいは自分の思考をアップデートすることができれば、 この失敗は無意味にはならない。 そして、私はそうするつもりだ。だから無意味ではない。


失敗した自分を責めなくていい。ていうか、そんな暇ない

だから、失敗した時は落ち込む必要はない。 その失敗を糧にして、次の行動を変えて、意味のある失敗にすればいい。 同じ失敗をしてもいい。 同じ失敗をしたら、さらに強く自分の記憶に刻み付けられる。 1回で完璧に直せた人より、深く刻み付けられる。 それは十分に価値があると思う。

世の中には、1回やれば次からは二度と同じ失敗をしない人もいるだろう。 でも、自分とその人(実在するか知らないけど)を比較して、自分を卑下する必要はない。

違うのだから。


結論

結論何が言いたいかというと、タイトル通りなんだけどね。

このブログをどういう場所にしたいか

結論

  1. データサイエンス関連
  2. ITエンジニアリング関連
  3. 趣味(筋トレが主)

について

  • インプットした情報を共有する場所
  • アウトプットの場所
  • ポエムを吐く場所

のように考えています。