Github Issuesを一覧出力しエクセル(excel)等で見たいという要望が
意外と存在するかと思います。
自分の場合は、
「エクセルでissueをコメント込みで一括で見たい」
「社内のgitの情報を外部に渡す際にテキスト(csv)にしたい。」
というような要望がありました。
そこでpythonを使って、APIを利用して、csv出力するソースを作成しました。
内容は以下の通り。
[ユーザ名][リポジトリ名]は自身のgit-hubのリポジトリの情報が入ります。
処理ソース(main.py)
# -*- coding: utf-8 -*-
import json
import requests
import os
import pandas as pd
def main():
os.environ["no_proxy"] = "localhost"
token = ""
# トークンを設定している場合は以下のtokenをurlの末尾に + toeknで付与する。
# token = "?access_token=生成されたtokentoken"
url = "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues"
response = requests.get(url, verify=False)
json_dict = json.loads(response.text)
csv_header = ["No", "title", "内容", "コメント"]
csv_body = []
cnt = 1
for issue_items in json_dict:
csv_line_body = []
csv_line_body.append(str(cnt))
csv_line_body.append(issue_items["title"])
csv_line_body.append(issue_items["body"])
if issue_items["comments"] > 0:
url = issue_items["comments_url"] + token
comments_response = requests.get(url, verify=False)
comments_json = json.loads(comments_response.text)
comment_str = ""
for commnet in comments_json:
comment_str = commnet["updated_at"] + "\n"+ commnet["body"] + "\n\n" + comment_str
csv_line_body.append(comment_str)
else:
csv_line_body.append("")
csv_body.append(csv_line_body)
cnt = cnt + 1
df = pd.DataFrame(csv_body, columns=csv_header)
df.to_csv("output.csv", index=False)
if __name__ == '__main__':
main()
処理説明
まず、issue取得APIhttps://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues
でアクセスし、
issueのタイトルや最初の記述を取得します。
その後、コメントはコメント取得APIで取得します。
APIのURLはissue取得APIのレスポンスのcomments_url
に設定されているのでそれを利用します。
csv処理はpandasを使用。
issue取得APIのレスポンスは以下の通り。
[ユーザ名]と[リポジトリ名]が指定したGit-hub連携先となります。
[
{
"url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/2",
"repository_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]",
"labels_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/2/labels{/name}",
"comments_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/2/comments",
"events_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/2/events",
"html_url": "https://github.com/[ユーザ名]/[リポジトリ名]/issues/2",
"id": 443208115,
"node_id": "MDU6SXNzdWU0NDMyMDgxMTU=",
"number": 2,
"title": "hogehoge",
"user": {
"login": "[ユーザ名]",
"id": 31556091,
"node_id": "MDQ6VXNlcjMxNTU2MDkx",
"avatar_url": "https://avatars0.githubusercontent.com/u/31556091?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/[ユーザ名]",
"html_url": "https://github.com/[ユーザ名]",
"followers_url": "https://api.github.com/users/[ユーザ名]/followers",
"following_url": "https://api.github.com/users/[ユーザ名]/following{/other_user}",
"gists_url": "https://api.github.com/users/[ユーザ名]/gists{/gist_id}",
"starred_url": "https://api.github.com/users/[ユーザ名]/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/[ユーザ名]/subscriptions",
"organizations_url": "https://api.github.com/users/[ユーザ名]/orgs",
"repos_url": "https://api.github.com/users/[ユーザ名]/repos",
"events_url": "https://api.github.com/users/[ユーザ名]/events{/privacy}",
"received_events_url": "https://api.github.com/users/[ユーザ名]/received_events",
"type": "User",
"site_admin": false
},
"labels": [
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 1,
"created_at": "2019-05-13T05:12:00Z",
"updated_at": "2019-05-13T05:12:06Z",
"closed_at": null,
"author_association": "OWNER",
"body": "hogehoge01"
},
{
"url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/1",
"repository_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]",
"labels_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/1/labels{/name}",
"comments_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/1/comments",
"events_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/1/events",
"html_url": "https://github.com/[ユーザ名]/[リポジトリ名]/issues/1",
"id": 275602345,
"node_id": "MDU6SXNzdWUyNzU2MDIzNDU=",
"number": 1,
"title": "a",
"user": {
"login": "[ユーザ名]",
"id": 31556091,
"node_id": "MDQ6VXNlcjMxNTU2MDkx",
"avatar_url": "https://avatars0.githubusercontent.com/u/31556091?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/[ユーザ名]",
"html_url": "https://github.com/[ユーザ名]",
"followers_url": "https://api.github.com/users/[ユーザ名]/followers",
"following_url": "https://api.github.com/users/[ユーザ名]/following{/other_user}",
"gists_url": "https://api.github.com/users/[ユーザ名]/gists{/gist_id}",
"starred_url": "https://api.github.com/users/[ユーザ名]/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/[ユーザ名]/subscriptions",
"organizations_url": "https://api.github.com/users/[ユーザ名]/orgs",
"repos_url": "https://api.github.com/users/[ユーザ名]/repos",
"events_url": "https://api.github.com/users/[ユーザ名]/events{/privacy}",
"received_events_url": "https://api.github.com/users/[ユーザ名]/received_events",
"type": "User",
"site_admin": false
},
"labels": [
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2017-11-21T06:45:05Z",
"updated_at": "2017-11-21T06:45:05Z",
"closed_at": null,
"author_association": "OWNER",
"body": "a"
}
]
これだけだとコメントが取得できないので、コメントがあれば取得するようにします。
コメント取得APIのレスポンスは以下の通り。
それぞれの情報がリスト形式に埋め込まれ、
body
にコメントの情報があるので、
それを取得して文字列として連結する。
[
{
"url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/comments/491678084",
"html_url": "https://github.com/[ユーザ名]/[リポジトリ名]/issues/2#issuecomment-491678084",
"issue_url": "https://api.github.com/repos/[ユーザ名]/[リポジトリ名]/issues/2",
"id": 491678084,
"node_id": "MDEyOklzc3VlQ29tbWVudDQ5MTY3ODA4NA==",
"user": {
"login": "[ユーザ名]",
"id": 31556091,
"node_id": "MDQ6VXNlcjMxNTU2MDkx",
"avatar_url": "https://avatars0.githubusercontent.com/u/31556091?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/[ユーザ名]",
"html_url": "https://github.com/[ユーザ名]",
"followers_url": "https://api.github.com/users/[ユーザ名]/followers",
"following_url": "https://api.github.com/users/[ユーザ名]/following{/other_user}",
"gists_url": "https://api.github.com/users/[ユーザ名]/gists{/gist_id}",
"starred_url": "https://api.github.com/users/[ユーザ名]/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/[ユーザ名]/subscriptions",
"organizations_url": "https://api.github.com/users/[ユーザ名]/orgs",
"repos_url": "https://api.github.com/users/[ユーザ名]/repos",
"events_url": "https://api.github.com/users/[ユーザ名]/events{/privacy}",
"received_events_url": "https://api.github.com/users/[ユーザ名]/received_events",
"type": "User",
"site_admin": false
},
"created_at": "2019-05-13T05:12:06Z",
"updated_at": "2019-05-13T05:12:06Z",
"author_association": "OWNER",
"body": "hogehoge02"
}
]
python環境さえあれば特に難しくない感じです。
(デフォルトではrequestsとpandasのライブラリが無いはずなので、
それは追加インストールしてもらう必要有)
シェルだとどこのlinux環境でもできるのですが、
jsonの中身を解析するのが面倒なので・・・。
python環境をwindows端末やlinuxサーバで構築しとくと、
こういったちょっとしたツールを作成するのに便利なのでお勧めです。
(余談でした)
コメント