[AWS Lambda + Python + NHK番組表API]自分好みの番組リストをSlackメッセージで受け取るものを作った

# はじめに

カジキはテレビはほぼNHKしか見ませんが、テレビ視聴に関してはわがままです。
まず、

- **自分が興味のある番組は見逃したくないわ…**

と思うものの、番組表をじっくり眺めて絞り込む時間はあまりありません。また、他にやるべきことがある時は、

- この時間は集中したいから、**むしろ面白そうな番組がやってることは知りたくないわ**…

ということを思って、特定の日や時間帯についてはテレビを敢えて見ないようにしている時もあります。
そんな超絶わがままな現代カジキは、テレビと仲良く賢く付き合うために、今回、

- 自分が見る番組の候補を絞り込むアプリケーション

を作成してみました。

# どういうものができますか?

こんな感じの、`カスタム番組リスト`が毎日投稿されます。後述する抽出加工を実施し、

- `特定の時間帯`の、
- `特定のジャンル`の番組
    - 自分の場合、ジャンルは`ドキュメンタリー`、`動物`、`紀行`などで絞っています

のみがリストアップされて投稿されます。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631819/9f234d47-e989-93ea-1328-4477b8ba07bb.png)


# 1. NHK番組表APIの利用登録とAPIキー発行

下記にて利用ユーザー登録しAPIキーを発行します。制限については、取得処理が1日300回までとのことです。

- [NHK番組表API \| portal](https://api-portal.nhk.or.jp/)

APIポータル上では、利用登録後、下記のように実際の取得リクエストを試すこともできます。
![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631819/2c6b0e2c-2d04-6174-2c73-c701d743e2fb.png)

## 公式のAPIドキュメント

各APIのリクエスト方法についてのドキュメント

- [NHK番組表API \| portal](https://api-portal.nhk.or.jp/)

APIからのreturnに関する情報

- [ドキュメント リクエスト \| portal](https://api-portal.nhk.or.jp/doc-request)

# 2. Slack API APPを作成し、チャンネルと連携

今回、

- 番組チャンネル(NHK総合、Eテレ…)ごとに、投稿先slackチャンネルも分ける

ことにしたので、投稿用にSlack API APPを作成してSlackのチャンネルに紐づけています。
本記事では手順の詳細は割愛しますが、下記の方の記事がわかりやすかったので参考にしてください。

[Slack API を使用してメッセージを投稿する](https://zenn.dev/kou_pg_0131/articles/slack-api-post-message)

# 3. アプリケーションコード+インフラをデプロイ

今回は、下記を構築しました。
- AWS Systems Manager Parameter Store
    - 手動作成し、NHK APIキーやSlackのtoken、チャンネル情報など必要な情報を格納します。
    - 格納パラメータの構成については下記、SAMリポジトリのREADME.mdに記載してあります。
- AWS SAM(Lambdaコンテナイメージ)
    - [miicool/nhk\-get\-program\-data\-sam](https://github.com/miicool/nhk-get-program-data-sam)

# Tips: 自分仕様の番組フィルタリングの実装

## 1. 好きなジャンルの番組だけを抽出する

これは、**番組ジャンルコード**を利用してフィルタリングすることで実現できます。
この情報はjsonのreturnのうち、該当の番組情報の`genres`に配列で含まれています。

どのジャンルがどのコードに割当てられているか、というのは一応ドキュメントがあるのですが、2023年現在、公式の日本語版はリンク切れで、英語版も情報が不完全です。

なので、ちょっと面倒なんですが、

- 一度Program List APIを実際に実行し、自分が好きな番組に割り振られているジャンルコードが何かを確認してフィルタリングで利用する

のがTipsとなります。

また、有志(~~同志だと思ってます~~)の方がまとめて記載してくれているものもあるので、リンクを貼っておきます。

- [ＮＨＫの番組をゆるく検索できる PowerAppsでつくってみた \- Qiita](https://qiita.com/MiyakeMito/items/a0c6b8b293463392fd35)

また、非公式と思われますが、現在リンク切れになっている日本語PDFは下記内容でした。

- 「第2部 付録H」にジャンルに関する規定が記載されている
    - [https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.738.2121&rep=rep1&type=pdf](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.738.2121&rep=rep1&type=pdf)

## 2. 自分がテレビを視聴しない時間帯の番組は除外する + 除外時間帯を平日or土日祝で変える

これは、**番組の開始時間情報**を利用してフィルタリングすることで実現できます。
この情報はjsonのreturnのうち、該当の番組情報の`start_time`に格納されています。

start_timeはISO8601形式の文字列が格納されているので、これを時刻型に変換して比較処理を実装します。格納されている情報は**日本のタイムゾーンが明記されている**ので、アプリケーション上での比較の際は気をつけましょう。

また、平日と土日祝で変える部分は、

- Parameter Storeに平日と土日祝用の時間帯パラメータを格納
- `jpholiday`を使用した判定処理を追加

にて実装しました。

`jpholiday`については、下記の方の記事が参考になりました。
- [jpholidayで祝日を判定する（Python） \| 資格マフィア](https://shikaku-mafia.com/jpholiday/)

# おわりに

カジキさんは普段は読書派ですが、読書って不思議なもので、頭がある種類の疲れがあると進まないんですよね。テレビというメディアは「受動的なメディア」と悪口言われたりもしますが、これまた不思議なことに、テレビ視聴は良くも悪くも読書とは頭の使い方が違うので、ほどよくであれば読書を妨げているその種の疲れをリフレッシュできます。(見すぎに注意は必要ですが…)

今回完全に個人のニッチを満たすためのアプリケーションですが、これで1回1回番組表を目で眺めるより効率よく、「こんな面白い番組やってるんだ」というのを発見できるようになりました。

# 参考文献

[ＮＨＫの番組をゆるく検索できる PowerAppsでつくってみた \- Qiita](https://qiita.com/MiyakeMito/items/a0c6b8b293463392fd35)