Qiita非公式LINEBot「Qiitaちゃん」作ってみた

January 13, 2020

僕はそこそこの Qiita ヘビーユーザーで、電車の中とかでトレンドを読んだりなどしてます。 この記事にたどり着いたあなたもひょっとして似たように Qiita ヘビーユーザーだったりするかもしれません。

Qiita って意外と開くまでに体力を使うというか、Qiita の記事を見るために Qiita を開くのがめんどくさいなと。(おい)

(まあ、トレンドなどはトップページから見れますが、フォロー中のタグなどはマイページいちいち飛ぶの少しだけめんどくさいですよね。。)

また、Qiita の通知などはヘッダー右から確認できるわけですが、いちいち通知が来ているかどうか Qiita を開いて確認するのめんどくさいなと思ってました。

今回この記事では Qiita の公式 LINEBot を作成します。

使用するのは Django です。

Django 初心者なので(開始時歴 5 日)、これこうした方がええんちゃうって部分があればコメントでそっと教えてください。

この記事の情報量が多くなりすぎることを防ぐために記事を所々分けているためその辺はご了承ください。 また、各部分でコードを紹介していると、これまた記事がかなり長くなるのでこれも省略している部分が多いです。

コード全体を見たい方はGitHubで公開しているのでそちらから確認してください。

友達登録

Qiita ちゃんを試して見たい方は以下から Qiita ちゃんを LINE 友達追加してください。

https://lin.ee/vJgES3p

QR コードでの登録は ↓ スクリーンショット 2020-01-13 10.18.17.png

実装内容

・直近の自分の記事に対する直近の「いいね」「コメント」が確認できる。

・Qiita 全体の現在のトレンドを確認できる。

・ユーザーがフォローしているタグのトレンド記事を確認する。

・ユーザーがフォローしているタグの最新記事一覧を確認する。

ユーザー登録

全ての機能を利用する前にユーザー登録をさせる必要があります。

QiitaAPI を使って認証します。認証の方法に関しては以下の記事でまとめました。 QiitaAPI の Oauth を Django でやる

これを行うことでフォロー中のタグの確認や通知の確認を行います。

各実装について

そもそも Django でどうやって LINE Messaging API を作るかについては以下の記事で紹介しています。

Django で LINEBot を作成する

各機能はメニューから選択して実行します。 何かを話しかけることによってリプライで以下のようなメニューが送信されてきます。

S__70934545.jpg

メニューの送信

以下が、メニューを作成する関数です。 LINE Messageing API には flexメッセージ なるものがあり上のような普通のメッセージでは送れないようなボタンなどを送信できます。 LINE Flex message

def create_index_message():
    login = {
              "type": "button",
              "style": "primary",
              'height': 'sm',
              'margin': 'xl',
              "action": {
                "type": "postback",
                "label": "Qiita紐付け",
                "displayText": "Qiitaと紐付ける",
                "data": "login"
              }
            }
    trend = {
              "type": "button",
              "style": "primary",
              'height': 'sm',
              'margin': 'xl',
              "action": {
                "type": "postback",
                "label": "トレンド",
                "displayText": "現在のトレンドを見る",
                "data": "alltrend"
              }
            }
    notification = {
              "type": "button",
              "style": "primary",
              'height': 'sm',
              'margin': 'xl',
              "action": {
                "type": "postback",
                "label": "通知",
                "displayText": "通知を確認する",
                "data": "notification"
              }
            }
    follow_tag = {
              "type": "button",
              "style": "primary",
              'height': 'sm',
              'margin': 'xl',
              "action": {
                "type": "postback",
                "label": "フォロー中タグ",
                "displayText": "フォロー中のタグを確認する",
                "data": "allfollow_tag"
              }
            }
    contents = []
    contents.append(login)
    contents.append(trend)
    contents.append(follow_tag)
    contents.append(notification)
    index_message = [{
                "type": "flex",
                "altText": "選択してくださいっ!",
                "contents": {
                "type": "bubble",
                "body": {
                  "type": "box",
                  "layout": "vertical",
                  "spacing": "md",
                  "contents": contents
                }
                }
            }]
    return index_message

こちらで作成した内容を以下の messages に挿入し、リプライします。

body = {
            'replyToken': reply_token,
            'messages': messages
        }

actiontype を見てみると postback が指定されています。 これはボタンを押すことで action 内の data を再度サーバーに送信する action です。 動きとしては以下のようなものになります。

3vsah-ydk10.gif

この動画で「Qiita 紐付け」を押すことでそれに指定されている data である login が送信されます。

この送信される data の内容で各機能に分岐させています。

直近の自分の記事に対する直近の「いいね」「コメント」の確認

ここでは直近 5 記事の直近の「いいね」「コメント」を取得します。

QiitaApi のGET /api/v2/authenticated_user/itemsを使用して認証中のユーザーの記事を取得します。

そしてそれぞれの記事に対して「いいね」「コメント」を取得し、1 日以内につけられたものの数を数えます。

S__70942753.jpg

Qiita 全体の現在のトレンドの確認

これに関しては現在のトレンドを確認する方法が QiitaAPI にありませんでした。 そのため、Qiita のトップページをスクレイピングして、記事を取得します。 詳しく以下の記事で紹介しています。

Python のスクレイピングで Qiita のトレンドを取得してみる

S__70942723.jpg S__70942725.jpg

ユーザーがフォローしているタグのトレンド記事/最新記事一覧の確認

QiitaAPI からユーザーのフォローしているタグ/タグのついた記事を取得します。 GET /api/v2/users/:userid/followingtags

フォロー中タグに関しては LINE のメッセージで送信できる上限により、フォロー日時の上位 15 個までのタグを表示する仕様となっています。

タグのトレンド記事に関しては Qiita の API で取得できないので同様にスクレイピングを利用して取得します。

タグの最新記事一覧に関しては QiitaAPI のGET /api/v2/tags/:tag_id/itemsを利用して取得します。

S__70942735.jpg S__70942737.jpg S__70942738.jpg

終わりに

これで僕の Qiita ライフは少しだけ手軽なものになりました。

いいなっと思った方はこちらから Qiita ちゃんを友達追加して試してみてください!

バグや改善の希望などがありましたら気が向いたら修正するのでTwitterまでお願いします!

個人的にはいいねした記事などからユーザーごとにおすすめの記事を機械学習で算出して返すなどをやってみたいです(圧倒的に経験値が足りない)

このエントリーをはてなブックマークに追加