Help us understand the problem. What is going on with this article?

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

はじめに

僕はそこそこの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

(1/16追記)一部の環境で(Googleピクセル…?)紐付けの際に500エラーが発生する場合があるっぽいです。別のブラウザを使用するもしくは紐付けのリンクだけ別の端末を使用することで解決するかと思います。🙇‍♂️

実装内容

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

・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/:user_id/following_tags

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

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

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

S__70942735.jpg
S__70942737.jpg
S__70942738.jpg

終わりに

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

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away