Slack に投稿した日報を API で取得して、ReleaseNote 風にする (じぶんリリースノートの準備)
Tags: slack
Published: 2020-03-26 00:43:59

# はじめに

最近、じぶんリリースノートなるものが流行りだそうで、少しのってみることにしました。
https://blog.a-know.me/entry/2019/02/02/214612

【※注意】4/21 にやろうと思ったばかりなので、まだじぶんリリースノートは作れていません。来月作るための簡単な準備をしたので、それを共有します。

そもそも、フリーランス時代に色々と自分のスキルだったり実績を整理していたんだけど、これがまぁまぁ大変で、抜け漏れはあるわ・アップデート忘れるわで結構面倒だったので、じぶんリリースノート作れば良いんじゃないかなって思ったのがはじまり。

ただ、いきなり過去を振り返るのは大変だし、今月振り返るだけでも中々に時間が取られそう

というわけで、じぶんリリースノートを作る上で、こうやると良いかもなぁっていうお試し方法をまとめてみた。
4/21 に始めたので、来月あたりじぶんリリースノート作った時にまた改善すると思います。

# 何するの

特別なことはしません。
Slack に日報を投稿して、それを API で取得して、Qiita に貼りやすいように Markdown 形式で出力するだけです。

# 準備するもの

* Slack のアカウントと適当なチャンネル
  * 個人ワークスペースを作って、jibun_release_note みたいなチャンネルを作ると良いと思います
* Slack の API 準備
  * API のアクセストークンの取得方法はこちらを参考に
     * https://www.dkrk-blog.net/slack/slack_api01
     * スコープ設定時に channels.history を選択すること (メッセージ取得権限)

# Slack への投稿

例えばこんな感じ

<img width="722" alt="SnapCrab_NoName_2019-4-22_22-2-34_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44638/b2fe4e17-59c8-c80e-20f2-56773fd9c7db.png">

社外秘など、あとで公開したくない情報には "[confidential]" をつける

# Slack メッセージ取得

コードはこんな感じ。(日付処理まわりとか雑なのは許して)

```:history.py
#!/usr/bin/env python3

from datetime import datetime
import calendar
import requests
import json
import os
import sys

url = 'https://slack.com/api/channels.history'
token = os.environ['SLACK_API_TOKEN']
channel_id = os.environ['SLACK_CHANNEL_ID']
date_yy_mm = os.environ['HISTORY_REQUEST_YY_MM']

def main():
    year = int(date_yy_mm.split('-')[0])
    month = int(date_yy_mm.split('-')[1])
    _, lastday = calendar.monthrange(year, month)

    oldest = datetime.strptime(date_yy_mm + "-01", '%Y-%m-%d').timestamp()
    latest = datetime.strptime(date_yy_mm + "-" + str(lastday), '%Y-%m-%d').timestamp()
    payload = {
        'token': token,
        'channel': channel_id,
        'latest': str(latest),
        'oldest': str(oldest)
    }
    r = requests.get(url, params=payload)
    if r.status_code != 200:
        print('Failed to get response (' + r.status_code + ')')
        sys.exit(1)

    json = r.json()
    ok = json['ok']
    if ok is False:
        print('Failed to get messages')
        print(json['error'])
        sys.exit(1)
    else:
        msgs = json['messages']
        for msg in msgs:
            date = datetime.fromtimestamp(int(float(msg['ts'])))
            message = msg['text'].replace('\u2022', '+')
            out = []
            for line in message.splitlines():
                if line.find('[confidential]') > 0:
                    continue
                out.append(line)
            print("### " + str(date.date()))
            print('\n'.join(out))
            print()

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

実行結果はこうなります。
※ Slack のチェンネル ID の取得方法はこちら (https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08)

```
$ export SLACK_API_TOKEN='xoxp-XXXXXXX...'
$ export SLACK_CHANNEL_ID=CHxxxxxxx
$ export HISTORY_REQUEST_YY_MM=2019-04
$ ./history.py
### 2019-04-22
+ mysqldump-parser (python) の施策
+ rubocop と rails_best_practice を適用してみた (rubocop のエラー多すぎるので MaxLineLength あたり緩和
+ ruby の auto-complete が遅い問題調査 (deoplete で omni の pattern 弄るのやめたらマシになった)
+ python 3.7.3 を pyenv に install
+ vim で python lsp をどう使うか調査
+ slack channel history API 使ってみた

### 2019-04-21
+ react の eslint 設定見直し
+ vim に eslint を本格導入 (自動整形は一時的に off)
+ ローカルの yarn を 1.15.2 にアップデート
+ global の node_modules を整理 (最低限必要な eslint-cli と yarn だけに変更)

```

ちゃんと confidential も抜けてますね。

あとは Qiita なり、CHANGELOG.md なり、ReleaseNote.md なりに貼るだけ！
じぶんリリースノートのレポジトリを github に作って、ReleaseNote.md に >> で

# 貼ってみた

### 2019-04-22
+ mysqldump-parser (python) の施策
+ rubocop と rails_best_practice を適用してみた (rubocop のエラー多すぎるので MaxLineLength あたり緩和
+ ruby の auto-complete が遅い問題調査 (deoplete で omni の pattern 弄るのやめたらマシになった)
+ python 3.7.3 を pyenv に install
+ vim で python lsp をどう使うか調査
+ slack channel history API 使ってみた

### 2019-04-21
+ react の eslint 設定見直し
+ vim に eslint を本格導入 (自動整形は一時的に off)
+ ローカルの yarn を 1.15.2 にアップデート
+ global の node_modules を整理 (最低限必要な eslint-cli と yarn だけに変更)