僕はそこそこの Qiita ヘビーユーザーで、電車の中とかでトレンドを読んだりなどしてます。 この記事にたどり着いたあなたもひょっとして似たように Qiita ヘビーユーザーだったりするかもしれません。
Qiita って意外と開くまでに体力を使うというか、Qiita の記事を見るために Qiita を開くのがめんどくさいなと。(おい)
(まあ、トレンドなどはトップページから見れますが、フォロー中のタグなどはマイページいちいち飛ぶの少しだけめんどくさいですよね。。)
また、Qiita の通知などはヘッダー右から確認できるわけですが、いちいち通知が来ているかどうか Qiita を開いて確認するのめんどくさいなと思ってました。
今回この記事では Qiita の非公式 LINEBot を作成します。
使用するのは Django です。
Django 初心者なので(開始時歴 5 日)、これこうした方がええんちゃうって部分があればコメントでそっと教えてください。
この記事の情報量が多くなりすぎることを防ぐために記事を所々分けているためその辺はご了承ください。 また、各部分でコードを紹介していると、これまた記事がかなり長くなるのでこれも省略している部分が多いです。
コード全体を見たい方はGitHubで公開しているのでそちらから確認してください。
友達登録
Qiita ちゃんを試して見たい方は以下から Qiita ちゃんを LINE 友達追加してください。
QR コードでの登録は ↓
実装内容
・直近の自分の記事に対する直近の「いいね」「コメント」が確認できる。
・Qiita 全体の現在のトレンドを確認できる。
・ユーザーがフォローしているタグのトレンド記事を確認する。
・ユーザーがフォローしているタグの最新記事一覧を確認する。
ユーザー登録
全ての機能を利用する前にユーザー登録をさせる必要があります。
QiitaAPI を使って認証します。認証の方法に関しては以下の記事でまとめました。 QiitaAPI の Oauth を Django でやる
これを行うことでフォロー中のタグの確認や通知の確認を行います。
各実装について
そもそも Django でどうやって LINE Messaging API を作るかについては以下の記事で紹介しています。
各機能はメニューから選択して実行します。 何かを話しかけることによってリプライで以下のようなメニューが送信されてきます。
メニューの送信
以下が、メニューを作成する関数です。
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
}
action
の type
を見てみると postback
が指定されています。
これはボタンを押すことで action
内の data
を再度サーバーに送信する action です。
動きとしては以下のようなものになります。
この動画で「Qiita 紐付け」を押すことでそれに指定されている data
である login
が送信されます。
この送信される data
の内容で各機能に分岐させています。
直近の自分の記事に対する直近の「いいね」「コメント」の確認
ここでは直近 5 記事の直近の「いいね」「コメント」を取得します。
QiitaApi のGET /api/v2/authenticated_user/itemsを使用して認証中のユーザーの記事を取得します。
そしてそれぞれの記事に対して「いいね」「コメント」を取得し、1 日以内につけられたものの数を数えます。
Qiita 全体の現在のトレンドの確認
これに関しては現在のトレンドを確認する方法が QiitaAPI にありませんでした。 そのため、Qiita のトップページをスクレイピングして、記事を取得します。 詳しく以下の記事で紹介しています。
Python のスクレイピングで Qiita のトレンドを取得してみる
ユーザーがフォローしているタグのトレンド記事/最新記事一覧の確認
QiitaAPI からユーザーのフォローしているタグ/タグのついた記事を取得します。 GET /api/v2/users/:userid/followingtags
フォロー中タグに関しては LINE のメッセージで送信できる上限により、フォロー日時の上位 15 個までのタグを表示する仕様となっています。
タグのトレンド記事に関しては Qiita の API で取得できないので同様にスクレイピングを利用して取得します。
タグの最新記事一覧に関しては QiitaAPI のGET /api/v2/tags/:tag_id/itemsを利用して取得します。
終わりに
これで僕の Qiita ライフは少しだけ手軽なものになりました。
いいなっと思った方はこちらから Qiita ちゃんを友達追加して試してみてください!
バグや改善の希望などがありましたら気が向いたら修正するのでTwitterまでお願いします!
個人的にはいいねした記事などからユーザーごとにおすすめの記事を機械学習で算出して返すなどをやってみたいです(圧倒的に経験値が足りない)