githubのpullrequestの情報をAPI経由で取得する

参考リンク：https://qiita.com/kz800/items/f822fe7a3b285b14085c

情報を取得して、定期的にslackへ通知するような仕組みを作成したいと思います。レビューやマージの依頼を受けたけど、放置してしまうこともありチーム全体で定期的にPRを認知する仕組みです。似たようなことができる仕組みはありますが、ある程度自分で制御できるという意味で自作したい。

# 仕組み
・定期的にgithubのapiからpullrequestの一覧を取得する
・pullrequestがあればslackに通知する

## slackへの通知
### APIを利用するためトークンを取得する
アプリを登録する　→https://api.slack.com/
![create_app.png](https://qiita-image-store.s3.amazonaws.com/0/110457/746b1285-6938-e23d-5014-1754da3783a7.png)

作成したアプリのインストール
![install.png](https://qiita-image-store.s3.amazonaws.com/0/110457/fc97d4f9-5895-1d32-33ba-70c175cd84e2.png)

アクセストークンの取得
![token_2.png](https://qiita-image-store.s3.amazonaws.com/0/110457/bf4fc671-3df6-0027-f31c-04bde596cd98.png)
※トークン文字列が表示されているため、上部のみキャプチャしてます

（任意）permissionを追加する
![per.png](https://qiita-image-store.s3.amazonaws.com/0/110457/100795bc-05b7-3a4e-9e44-fb5be56be83f.png)
### メッセージを投稿する
API一覧は以下に記載があります
https://api.slack.com/methods
今回はまずslackに通知してみるので、以下を利用します
https://api.slack.com/methods/chat.postMessage

**シェル（curl）経由で通知する**

```sh
$ curl -X POST -d 'token=アクセストークン' -d 'channel=#general' -d 'text=post it!' https://slack.com/api/chat.postMessage
```

**通知受け取り**
![slackpost.png](https://qiita-image-store.s3.amazonaws.com/0/110457/692158a6-9f40-392f-2fd6-330487a39b4f.png)


## githubから情報取得
### APIを利用するためトークン取得
「setting」->「Developer settings」->「Personal access tokens」からトークン生成

**シェル（curl）経由で取得する**
以下のリポジトリにPRが1件あるため取得できるか確認
https://github.com/kaikusakari/kaikusakari.github.io

```shell
$ curl https://api.github.com/repos/kaikusakari/kaikusakari.github.io/pulls?access_token=アクセストークン
[
  {
    "url": "https://api.github.com/repos/kaikusakari/kaikusakari.github.io/pulls/1",
    "id": 161073288,
     ・・・中略・・・
    "author_association": "OWNER"
  }
]
```

## gitから情報を取得して、slackにPOSTする
pythonで実装します。動作は以下の通り。
1.gitのAPIからPR一覧を取得
2.レスポンスで受け取ったJSON文字列を取捨選択
3.slackに通知
pythonのインストールや、importモジュールのインストールは省略・・・。

```python:receve.py
# -*- coding: UTF-8 -*-
import requests
import json

def main():
    results = ''
    repogitories = requests.get('https://api.github.com/user/repos?access_token=gitのアクセストークン')
    for repogitory in repogitories.json():
        pullrequests = requests.get('https://api.github.com/repos/' + repogitory["full_name"] + '/pulls?access_token=gitのアクセストークン')
        for pullrequest in pullrequests.json():
            results += pullrequest["url"] + ", updated_at:" + pullrequest["updated_at"] + '\n'
    post_data = {}
    if len(results) == 0:
        post_data = {'token':'slackのアクセストークン','channel':'#general', 'username':'github_pullrequest', 'text':'open状態のPRはありません'}
    else:
	    post_data = {'token':'slackのアクセストークン','channel':'#general', 'username':'github_pullrequest', 'text':results}
    requests.post('https://slack.com/api/chat.postMessage',data=post_data)

if __name__== '__main__':
    main()
```

**結果**
![slack_result.png](https://qiita-image-store.s3.amazonaws.com/0/110457/d366d8df-ec37-1d1e-2a4d-85b0da0f95bb.png)

何度か失敗した通知が出てますが笑、リンクと時間を表示しています。
時間を相対時間にして、より視覚的にわかりやすくするなど修正していきたいです。
※PRをマージすると、APIで取得できなくなります

**注意**
GitHub APIのリクエスト回数は1時間5000回が上限のようです。情報取得は1日1回も実施すれば良いと思いますが、アクセス可能な全リポジトリを巡回しているので上限は注意してください。（参考：https://developer.github.com/v3/#rate-limiting）