GithubのIssuesを一覧出力(Excel参照可能)する

  • 更新日2019.05.16
  • IT
GithubのIssuesを一覧出力(Excel参照可能)する

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サーバで構築しとくと、
こういったちょっとしたツールを作成するのに便利なのでお勧めです。
(余談でした)

ITカテゴリの最新記事