育児日記をSlackとGitHub Actionsでつけている話


育児の記録をなんらかの形で残したいとは思うものの、紙の日記やブログはどうしても続かないので、気が向いたときに個人Slackにつぶやいて、それを日次のGitHub ActionsでGitHubリポジトリにMarkdownファイルに落とし込んで残すようにしています。

何でこんなことをやってるかというと、

そして、Slackのデメリットを補うために、GitHubのプライベートリポジトリにMarkdownファイルとして残していて、それをGitHub Actionsのデイリー実行でやっています。

Markdownとして保存されていれば、GitHub上でプレビューできたり、やろうと思えばSSGでブログっぽく見せることも可能ですし。

Slack API設定

Slack API: Applications | SlackCreate New App ボタンをクリックして、目的のワークスペースを選択します。

OAuth & Permissions をクリック、 Scopes で権限を設定します。

Bot Token Scopes はBotとして動く場合の権限、 User Token Scopes はユーザとして動く場合の権限のようです。今回の用途であればUser Token Scopes でいいかと思って、私はそちらで以下の権限を設定しています。

権限を設定したあと Install to Workspace ボタンをクリックしてワークスペースにインストールするとAPIキーが生成されます。

GitHub Actions設定

まとめる先のプライベートリポジトリを作ります。

SettingsSecrets and variables で変数とシークレットを登録します。全部シークレットでいいと思います。

.github/workflows/slack2md.yml みたいなファイルを作ります。日本時間9:15に定期実行するようにしていますが、負荷状況によってずれます。

投稿がなければ count_messages がエラーに見えちゃうとか課題もあって、もっとうまいやり方はありそうですが、大体こんな感じでやってます。リポジトリへのコミットもちゃんとしたお作法がありそうな気がします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
name: Slack Conversation to Markdown

on:
  schedule:
    - cron:  '15 0 * * *'
  workflow_dispatch:

jobs:
  main:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - id: count_messages
      env:
        SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
        SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
      continue-on-error: true
      run: |
                [[ 0 -lt $(printenv SLACK_TOKEN | curl -s -H @- "https://slack.com/api/conversations.history?channel=${SLACK_CHANNEL}&oldest=$(date +%s --date "$(date '+%Y-%m-%d' --date '1 days ago')T00:00:00+09:00")&latest=$(date +%s --date "$(date '+%Y-%m-%d')T00:00:00+09:00")" | jq '.messages | length') ]]

    - if: ${{ steps.count_messages.outcome == 'success' }}
      env:
        SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
        SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
      run: |
        echo "---" > "$(date '+%Y-%m-%d' --date '1 days ago').md"
        echo "title: \"$(date '+%Y/%m/%d' --date '1 days ago')\"" >> "$(date '+%Y-%m-%d' --date '1 days ago').md"
        echo "date: $(date '+%Y-%m-%d' --date '1 days ago')T23:59:59+09:00" >> "$(date '+%Y-%m-%d' --date '1 days ago').md"
        echo "---" >> "$(date '+%Y-%m-%d' --date '1 days ago').md"
        echo >> "$(date '+%Y-%m-%d' --date '1 days ago').md"
        printenv SLACK_TOKEN | curl -s -H @- "https://slack.com/api/conversations.history?channel=${SLACK_CHANNEL}&oldest=$(date +%s --date "$(date '+%Y-%m-%d' --date '1 days ago')T00:00:00+09:00")&latest=$(date +%s --date "$(date '+%Y-%m-%d')T00:00:00+09:00")" | jq -r '.messages | sort_by(.ts) | .[].text + "\n"' >> "$(date '+%Y-%m-%d' --date '1 days ago').md"        

    - if: ${{ steps.count_messages.outcome == 'success' }}
      env:
        GIT_AUTHOR_NAME: ${{ secrets.GIT_NAME }}
        GIT_AUTHOR_EMAIL: ${{ secrets.GIT_EMAIL }}
        GIT_COMMITTER_NAME: ${{ secrets.GIT_NAME }}
        GIT_COMMITTER_EMAIL: ${{ secrets.GIT_EMAIL }}
      run: |
        git add .
        git commit -m "Add files"
        git pull
        git push origin main        

どんなに簡易化しようと書かないものは書かないんですよね…