はじめに
Qiita/RSSシリーズです。前回までの記事を振り返ります。
記事①では…。
「Qiita/RSS」を題材にPHPでXMLの解析を行いました。
記事②では…。
「Qiita/RSS」を題材にDrupalでAPI化をしてみました。
記事③では…。
Next.js でAPIデータにFetchしてみました。
今回は…。
EC2のCron設定で、Qiitaの更新情報を毎月1日にSlack通知してみたいと思います。
ちょっとこれだけだと情報不足...。
- 実装したAPIを利用して、Qiita公式更新情報を取得
- 取得したデータをPHPの関数でSlack通知機能を実装
- 月初に通知を行うよう、Jobの設定
って感じです。
一応…。完成イメージ。こんな感じでBotからメッセージが送信されます。
設計
シリーズが長くなってきたので一旦整理します。
環境 | 用途 |
---|---|
Qiita公式 | RSS配信 |
Drupal環境 | RSSデータをAPI化(キャッシュ実装込) |
Next.js環境 | フロントエンドからAPIを取得、レンダリング |
EC2(Drupal)環境 | Cron設定でSlackに通知を送る |
今回は、APIにアクセスしてEC2(Drupal環境)からSlackにQiita公式更新情報を送ってみます。
APIには 8h のキャッシュが効いているので、直接RSSにHTTP通信するよりはマシだと思っています。
SlackのBotについて
SlackのBotの導入については本記事では割愛します。
私は、以下の記事のやり方でBotを導入しています。(Webhookが簡単だと思うのでそちらでも全然いいかと)
気が向けば記事書きます。
実装
001. スクリプトの実装
まずは、Cronで発動するPHPの関数を実装します。
実装の流れはこんな感じ.
- APIからデータを取得
- データをメッセージ用に加工
- Slackに送信
/**
* Notice slack.
*/
function notice_qiita() {
// APIからデータを取得.
$client = new Client();
// 定数 'ENDPOINT' には実際のAPIのURLを設定してください。
$data = $client->get(ENDPOINT)->getBody()->getContents();
$data = json_decode($data, TRUE);
// Slackに送信するメッセージを構築.
$blocks = [
[
"type" => "section",
"text" => [
"type" => "mrkdwn",
"text" => "*<{$data['link']}|{$data['title']}>*",
],
],
];
foreach ($data['data'] as $item) {
$blocks[] = [
"type" => "section",
"text" => [
"type" => "mrkdwn",
"text" => "<{$item['link']}|{$item['title']}> - {$item['published']}",
],
];
}
$slack_message = [
"blocks" => $blocks,
];
// 環境変数.
$token = getenv('slack_token');
$channel_id = getenv('slack_channel_id');
// 送信.
$client->post('https://slack.com/api/chat.postMessage', [
'headers' => [
'Authorization' => "Bearer {$token}",
'Content-Type' => 'application/json',
],
'json' => [
'channel' => $channel_id,
'blocks' => $slack_message['blocks'],
],
]);
echo "Slackに送信しました。";
}
// 記事内では例外処理は省略.
この時点で送信にこけないか、テストで関数を実行してみてください。
002. Cronの設定
毎月1日にスクリプトを実行します。
Crontabを開く
crontab -e
毎月1日に発動するよう設定
// 私はPHPスクリプトを実行するShellを実装しました。
0 0 1 * * bash script/batch/notice-slack.bash
Cron設定は以上です。
月初を待ってられないので、テストでいろいろ試してみてください。
まとめ
いかがでしたか?
今回のやり方だと、自身のサーバーがないと試せないですが、CronでSlackにいろいろ送ることができます。
AWSだったら無料利用枠でかなりのことできますので、使ってみてもいいかもですね。