4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitHub Issue から ATOM Feed を作る

Last updated at Posted at 2022-03-27

背景

あるリポジトリの 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">&lt;p&gt;This is a test body&lt;/p&gt;</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 に食わせた結果。

image.png

ポイント

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 に公開ができる。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?