はじめに
GASを触り始めたのでスラックを使ったものにも挑戦してみたお話しです。
APIも触り慣れていないので凡ミスなども目立ちました。
準備
- Qiitaアカウントと記事を投稿しておく
- Qiita APIを使うにあたってトークンを発行しておく ※
- スラック投稿できるようにAppなどを用意しておく
※参考記事
参考記事
このスクリプトを作るにあたって以下の記事を参考にしました。
やったこと
- JSONデータでQiita記事の情報を取得
- 上のデータからタイトルと日付、URLを取得する
- 1時間以内に投稿された記事があればスラックにテキストなどのデータを渡す
- スラックAPIを使って指定したチャンネルにメッセージを飛ばす
ソース(記事取得の部分のみ)
Qiita.gs
const url = "Qiita個人ページのフィードURL";
const apiKey = "Qiita APIのトークン";
const qiitaPost = () => {
//Qiita API
const apiUrl = "https://qiita.com/api/v2/authenticated_user/items";
//自分の投稿記事の情報を取得
const response = UrlFetchApp.fetch(apiUrl, {
headers: {
Authorization: `Bearer ${apiKey}`,
},
}
// レスポンスからJSONデータを取得
const data = response.getContentText();
const jsonData = JSON.parse(data);
// 取得したデータから記事のURLを抽出してSlackに投稿
for (let i = 0; i < jsonData.length; i++) {
const postUrl = jsonData[i].url;
const title = jsonData[i].title;
const createdAt = jsonData[i].created_at;
// 投稿日時をDateオブジェクトに変換
const postDate = new Date(createdAt);
// 現在の日時を取得
const nowTime = new Date();
// 1時間以内に投稿された記事のURLをSlackに投稿
if (nowTime - postDate <= 3600000) {
const user = "ユーザー名";
const text = `@${user} さんが【${title}】を投稿しました。\n${postUrl}`;
postSlackbot(text);
}
}
};
// あとはスラックの投稿APIの設定を追加する
壁だったところ
XMLでは記事URLは取得できない
参考にした記事ではXMLデータから記事の投稿日時やタイトルを取得していましたが、記事のURLはXMLでは取得できないのでJSON取得しました。
APIの使い方をはじめに確認しておく
Exception: Request failed for http://qiita.com returned code 403. Truncated server response: <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> </body> </html> (use muteHttpExceptions option to examine full response)
トークン発行し忘れていた為、ずっとスクリプト実行すると跳ね返されており、原因に気づくのが遅れました.......APIのトークン発行は最初にやっておくべきでした。
QiitaAPIのURLによっては取得するURLの範囲が広がる
最初、apiUrlに設定していたURLをhttps://qiita.com/api/v2/items
にしていたのですが、この状態だと、自分のみではなく1時間以内に投稿された記事が全部取れてしまったため
https://qiita.com/api/v2/authenticated_user/items
に変更して認証中のユーザーの記事のみにしています。
▼参考