PythonでGitBucketのIssueをExcel出力する（API呼び出し編）

## 1. はじめに

社内ではSCMとしてgithubクローンの一つであるGitBucketを利用しています。最近、複数リポジトリのIssuesの状況を一覧で把握する必要が生じました。そこでGitBucketのWeb APIでIssueの一覧を取得してExcelファイルに出力するPythonプログラムを作ってみました。

今回はGitBucketのWeb APIを呼び出してIssueを取得し、jsonファイルに保存するところまでを説明したいと思います。PythonでExcelを操作する方法は[次回](https://qiita.com/5zm/items/282956dbc1b4f6813108)説明する予定です。
なお、Pythonを使ったのは単純に簡単だったからです。

## 2. GitBucketのAPIを利用してIssuesを取得するプログラム

[GitBucketは外部から操作可能なWeb APIを用意](https://github.com/gitbucket/gitbucket/wiki/API-WebHook)しています。未実装や多少の違いはありますが、だいたいgithubのAPIと互換性があるように設計されています。

```python:issuesApps.py
# -*- coding: utf-8 -*-
import os
import requests
import codecs

# get issues from repository
def get_issues_from_gitbucket(url, token):
    # ★ポイント1
    requestHeader = {'Authorization' : 'token ' + token}
    return requests.get(url, headers = requestHeader)

# save file with utf-8
def save_file(file_path, data):
    # ★ポイント2
    f_out = codecs.open(file_path, 'w', 'utf-8')
    f_out.write(unicode(data,'utf-8'))
    f_out.close()

# main
if __name__ == "__main__":
    # get information from environment
    # ★ポイント3
    url = os.getenv("ISSUES_URL")
    token = os.getenv("GITBUCKET_TOKEN")
    file_path = os.getenv("SAVE_FILE")
    
    response = get_issues_from_gitbucket(url, token)
    save_file(file_path, response.content)
```

**★ポイント1**
Web APIの呼び出しOAUTH TokenをHTTPヘッダに設定して認証を行います。
PythonのHTTPクライアントライブラリである`requests`を使うと簡単にHTTPヘッダを設定することができます。`requests`の説明については「[Pythonでマイクロサービス（概要編）](https://qiita.com/5zm/items/d5375a4ad95fd67b8960#332-requests%E3%81%AB%E3%82%88%E3%82%8Bhttp%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E9%80%81%E4%BF%A1)」を参照ください。
今回は`Authorization`ヘッダがあればいいのでこれを設定します。値は「`token API用のtoken`（tokenの後に半角スペースが必要）」です。

**★ポイント2**
レスポンスはjsonデータです。文字化けしないようにunicodeでエンコードしてutf-8としてファイルに保存します。

**★ポイント3**
API用のtokenをソースコードに記述するのはセキュリティ上問題があるため、環境変数から取得するようにします。また、GitBucketのAPIのURLや保存するファイル名も外部から変更できるように、こちらも環境変数を参照するようにしました。

```bat:setenv.bat（手動で設定してもいいけど、説明用にbatにしました）
@echo off
set ISSUES_URL=http://localhost:8888/api/v3/repos/demouser/testrepo/issues?state=closed
set GITBUCKET_TOKEN=【gitbucketで生成したAPI用のtoken】
set SAVE_FILE=issueslist.json
```

環境変数（ISSUES_URL）にIssueの一覧を取得するWeb APIのURLを設定します。APIの説明はgithubのページ「https://developer.github.com/v3/issues/#list-issues-for-a-repository 」にリンクされています。
githubのAPI説明を見るとパラメータの`state`は`open(default)、closed、all`の３つになっていますが、**残念ながらGitBucketに`all`は実装されていません。**全てのIssueを取得するには`state=open`と`state=closed`の２つを実行する必要があります。

ちなみにサンプルは「demouserのtestrepoリポジトリからクローズしたIssueを取得する」ものです。
なお実行時にProxyの問題が発生した場合、以下を参考にしてみてください。

* [2.3 Proxy超えのための環境変数の設定](https://qiita.com/5zm/items/d5375a4ad95fd67b8960#332-requests%E3%81%AB%E3%82%88%E3%82%8Bhttp%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E9%80%81%E4%BF%A1)
* [2.4 Proxyを経由させたくないURLを環境変数として設定](https://qiita.com/5zm/items/d5375a4ad95fd67b8960#24-proxy%E3%82%92%E7%B5%8C%E7%94%B1%E3%81%95%E3%81%9B%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84url%E3%82%92%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E8%A8%AD%E5%AE%9A)

## 3. （補足説明）GitBucketでAPI用のtokenを生成する

PrivateなリポジトリにアクセスするにはAPI用のtokenが必要になります。
ここではtokenを生成する手順について説明します。

1. gitbucketにログイン
2. 「Account settings」メニューを選択
3. 「Applications」メニューを選択
4. 「Generate new token」の「Token description 」にアプリの説明（自分で分かればいいので内容は適当）を入力して「Generate token」ボタンを押下
5. 「Tokens you have generated which can be used to access the GitBucket API. 」の下に表示された「Personal access tokens」がAPI用のtokenなのでこれをコピーすること

**このtokenはあなたの権限で（代わりとして）gitbucketを操作することになります。tokenを第三者に知られないように扱いには注意してください。**

## 4. つづく

今回はGitBucketのWeb APIを利用してIssueを取得し、jsonファイルに保存するPythonのプログラムについて説明しました。認証のtokenの設定さえ分かってしまえば、あとは単純にHTTPクライアントでAPIのURLにアクセスするだけなので簡単だったかと思います。
GitBucketのAPIはgithubと互換性があるように設計されているので、githubでも同様のことが実現できるはずです。興味のある方は試してみてください。
[次回](https://qiita.com/5zm/items/282956dbc1b4f6813108)はjsonファイルをもとにExcelファイルを作成するPythonのプログラムについて説明する予定です。