はじめに
Qiitaにはユーザのフォロー機能がありますが、フォローしている人が投稿した記事を確認するには、フォロー中のユーザ
タブで記事を一覧表示して、当日の記事を確認するしか現状なさそうです
まぁ、それでもいいっちゃいいんですが、せっかくなら日常で使っているコミュニケーションツールに通知してくれた方が良いなーと思い、自動で通知する機能を作ってみました!
試してみる
では、さっそく試してみます。
Qiita APIを利用して情報を取得し、Slackに通知します。
※公式のQiita APIリファレンスはこちら
Slackの設定
まず、WebhookURL発行のためにSlack Appを作成します。
Slack Appでオリジナルのアプリを作ることで、作業の効率化などが行えます
https://api.slack.com/apps にアクセスし、Create New App
をクリックします。
アプリの名前を入力し、スラックのワークスペースを選択し、Create App
をクリックすればSlack Appが作られます。簡単ですね
次に、Webhookの設定です。
デフォルトだと、WebhookはOff
になっているので、On
にします。
Add New Webhook to Workspace
をクリックするとアクセス許可が求められるので、許可する
をクリックします。
すると、Webhook URLが払い出されます。こちらをLambdaで利用します。
ついでに、Basic Information
メニューのDisplay Information
でSlackにメッセージを送る際のアイコンを設定しちゃいましょう
Qiitaのキャラクターにしました!
Lambda関数の作成
次にLambda関数
を作成します。
Lambdaって何ですか?って思った方は、こちらの記事で説明していますので、もしよければ見てください!
関数名
を入力し、ランタイム
を選択して関数の作成
をクリックすると、関数が作られます。
※今回はNode.js 20.x
のサンプルコードになります
環境変数
に自身のQiitaのuserIdと、先ほどSlackで払い出したWebhookUrlを設定します。
Lambda関数に以下のコードを記載します。
とりあえず試せればいいやの精神なのでコードの書き方がよくない、とかはご了承ください
やっていることとしては、
- 自身のフォローユーザを100件取得 ※100人以上いる場合は、修正が必要です
- 取得したユーザの投稿記事を、投稿日時の降順で5件ずつ取得 ※1日に5件以上投稿する人はいないはず...
- 取得した投稿の投稿日時が当日の場合は、WebhookURLに記事のURLなどを送信
export const handler = async (event) => {
const now = new Date();
const today = now.toISOString().split('T')[0];
const userId = process.env.userId;
const followedUsers = await fetchfollowedUsers(userId);
for(const user of followedUsers) {
const items = await fetchItems(user.id);
for(const item of items) {
const createdAt = new Date(items[0].created_at);
const createdDate = createdAt.toISOString().split('T')[0];
if (createdDate == today) {
console.log(item);
await sendItemToSlack(user, item);
}
}
};
};
async function fetchfollowedUsers(userId) {
const perPage = 100;
const ENDPOINT = `https://qiita.com/api/v2/users/${userId}/followees?per_page=${perPage}`;
const REQUEST_TIMEOUT_MS = 5000;
try {
const res = await fetch(ENDPOINT, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
});
return res.json();
}
catch (e) {
console.error(e);
return 500;
}
}
async function fetchItems(userId) {
const perPage = 1;
const ENDPOINT = `https://qiita.com/api/v2/users/${userId}/items?per_page=${perPage}`;
const REQUEST_TIMEOUT_MS = 5000;
try {
const res = await fetch(ENDPOINT, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
});
return res.json();
}
catch (e) {
console.error(e);
return 500;
}
}
async function sendItemToSlack(user, item) {
const webhookUrl = process.env.webhookUrl;
const slackResponse = await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `${user.id}さんが本日、以下の記事を投稿しました :smiley: \n ${item.title} \n ${item.url}`
})
});
}
EventBridge Schedulerの作成
最後に、Lambdaを定期的に実行するためのEventBridge Scheduler
を作成します。
EventBridge Schedulerって何ですか?って思った方は、こちらの記事で説明していますので、もしよければ見てください!
スケジュール名
を入力します。
頻度
は定期的なスケジュール
にして、cron式を40 16 * * ? *
にします。
これで毎日16:40にLambdaを実行するようになります。
ターゲット
にLambca
のInvoke
を選択し、先ほど作成したLambda関数を選択します。
後はデフォルト値で設定していけば、作成出来ます。
実行してみる
では、最後に実行結果を確認してみましょう。時間になるとEventBridge SchedulerがLambda関数を実行し、当日に投稿された記事をSlackにメッセージ送信してくれるはずです!
👇当日の記事が2件あった場合、こんな感じになります
もっとこうしたらよさそう
今回は1日1回の頻度で、Lambda関数を実行し、Qiita APIから当日に投稿された記事を取得して、スラックに通知しました。
もっとリアルタイムに近い形で取得したいなら、Lambdaを10分に1回などにしたりするのが良さそうです!
実行頻度を上げる場合は、APIドキュメントにある通り認証しているユーザでないと1時間に60回までしかリクエスト出来ないようです。
必要に応じてアクセスキーを発行して利用しましょう!
利用制限
認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
おわりに
とりあえず、ぱっと思いついた方法でフォローしたユーザの当日投稿した記事をスラックに通知する仕組みを作ってみました
もっといい方法あるなどありましたら、コメント頂けると幸いです