背景
あるリポジトリの Issue を RSS リーダーでチェックしたい。
どうやら Issue 単独で RSS は配信していない模様。
以下によると Wiki のフィードはあるらしい。
ないものは仕方ないので、自前で Issue からフィードを作成してみる。
方法
実装
愚直に GitHub API で Issue を取得してフィードを生成する。
フィードの生成には FeedGenerator を利用した。
from feedgen.feed import FeedGenerator
import json
import os
import requests
USER = os.environ['USER']
REPO = os.environ['REPO']
REQUEST_HEADER = {
'Accept': 'application/vnd.github.v3+json'
}
REQUEST_URI = f'https://api.github.com/repos/{USER}/{REPO}/issues?per_page=30'
response = requests.get(REQUEST_URI, headers=REQUEST_HEADER)
issues = json.loads(response.text)
feed = FeedGenerator()
# feed.id などフィードの設定をする
for issue in issues:
entry = feed.add_entry(order='append')
# entry.id などエントリの設定をする
entry.content(content=issue['body'], type='html')
feed.atom_file(f'{USER}/{REPO}/atom.xml')
実行結果
https://github.com/octocat/hello-world/issues の ATOM Feed を作ってみる。
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<id>tag:issue2atom,2006-01-02:/octocat/hello-world/issues</id>
<title>octocat/hello-world - GitHub Issues</title>
<updated>2022-03-26T15:02:35.517122+00:00</updated>
<author>
<name>octocat</name>
</author>
<link href="https://github.com/octocat/hello-world/issues" rel="alternate" />
<generator uri="https://lkiesow.github.io/python-feedgen" version="0.9.0">python-feedgen</generator>
<subtitle>GitHub Issues of octocat/hello-world</subtitle>
<entry>
<id>tag:issue2atom,2006-01-02:/octocat/hello-world/issues/2237</id>
<title>Check This out</title>
<updated>2022-03-25T05:46:38+00:00</updated>
<content type="html"><p>This is a test body</p></content>
<link href="https://github.com/octocat/Hello-World/issues/2237" rel="alternate" />
<summary>This is a test body...</summary>
<published>2022-03-25T05:45:05+00:00</published>
</entry>
:
</feed>
生成された ATOM を RSS リーダーの Inoreader に食わせた結果。
ポイント
Markdown を HTML 化
上記コードでは生の Markdown が配信されてしまうため、HTML に変換する。
import markdown
from mdx_gfm import GithubFlavoredMarkdownExtension
body_html = markdown.markdown(
issue['body'], extensions=[GithubFlavoredMarkdownExtension()]
)
GitHub Flavored Markdown (GFM) の Extension を使っているが、メンテされなくなっているようで少し心配。
なお、feedgen.entry.content()
はデフォルトで HTML Escape をしてくれる点に注意。これに気付かず、自前で html.escape()
したせいでうまく表示されないことがあった。
すぐ使いたい
GitHub Actions 化した。
Workflow の schedule で定期的に ATOM を生成し、GitHub Pages に公開ができる。