ようへいの日々精進XP

よかろうもん

俺は月末の振り返りを Slack と Ruby でやっている

これは

YAMAP エンジニア Advent Calendar 2021 の第 17 日目の記事にします。

qiita.com

はじめに

皆さん、日々の作業の振り返りってどのようにされていますか?

自分は、以下のように、退勤しますポストのスレッドに「俺の夕会」と称して、Slack を相手に独りでやっています。

f:id:inokara:20211223214838p:plain

こうやって、日々のやったことが Slack 上に記録されることになります。

さて

この Slack 上に記録した「俺のやったこと」を一ヶ月分取得したくなりました。なぜなら、月末に、社内で利用している勤怠管理システムに、工数登録をする必要になったからです。ということで、以下のような Ruby スクリプトで Slack にポストした投稿を取得して、一ヶ月分の「俺のやったこと」をリストアップすることにしました。

require 'json'
require 'net/http'
require 'csv'

SLACK_API_BASE_URL = 'https://slack.com/api'
SLACK_BASE_URL = ENV['SLACK_BASE_URL']
SLACK_USER_TOKEN = ENV['SLACK_USER_TOKEN']
MY_SLACK_CHANNEL_ID = ENV['MY_SLACK_CHANNEL_ID']
OLDEST = ARGV[0].nil? ? 7 : ARGV[0]

# 7 日前のタイムスタンプを取得
now = Date.today
days_ago = now - OLDEST.to_i
oldest = sprintf("%.5f", days_ago.to_time.to_i)

cursor = nil
loop do
  # https://api.slack.com/methods/conversations.history
  uri = URI("#{SLACK_API_BASE_URL}/conversations.history")
  params = {
    channel: MY_SLACK_CHANNEL_ID,
    cursor: cursor,
    limit: 1000,
    oldest: oldest
  }

  uri.query = URI.encode_www_form(params)
  req = Net::HTTP::Get.new(uri)
  req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}"

  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    http.request(req)
  end
  res_body = JSON.parse(res.body)

  res_body['messages'].each do |message|
    next if message['subtype'] == 'bot_message'

    myts = message['thread_ts'] if message['text'].include?('撤収')
    next if myts.nil?

    ts = message['ts'].to_i
    time = Time.at(ts, in: "+09:00").strftime("%F %T")

    # https://api.slack.com/methods/conversations.replies
    uri = URI("#{SLACK_API_BASE_URL}/conversations.replies")
    params = {
      channel: MY_SLACK_CHANNEL_ID,
      ts: myts
    }

    uri.query = URI.encode_www_form(params)
    req = Net::HTTP::Get.new(uri)
    req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}"

    res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
      http.request(req)
    end
    res_body = JSON.parse(res.body)

    res_body['messages'].each do |msg|
      puts "\n-----------------------------------------------\n" if msg['text'].include?('俺の夕会')
      ts = msg['ts'].to_i if msg['text'].include?('俺の夕会')
      time = Time.at(ts, in: "+09:00").strftime("%F %T")
      puts "#{time}\n#{msg['text']}" if msg['text'].include?('俺の夕会')
    end
  end

  break unless res_body['has_more']
  cursor = res_body['response_metadata']['next_cursor']
end

このスクリプトを yattakoto.rb なんてファイル名で保存しておいて、以下のように実行します。

$ export SLACK_BASE_URL=https://xxxxxxxxxxxx
$ export SLACK_USER_TOKEN=your-token
$ export MY_SLACK_CHANNEL_ID=your-channel
$ ruby yattakoto.rb

以下のように出力されます。

-----------------------------------------------
2021-12-22 22:08:28
# 俺の夕会 2021-12-22

## 今日やったこと

• 楽しいミーティング
• あれ
• これや

-----------------------------------------------
2021-12-21 23:33:59
# 俺の夕会 2021-12-21

## 今日やったこと

• つらいミーティング
• あれ
• これや

-----------------------------------------------
2021-12-17 18:40:46
# 俺の夕会 2021-12-17

## 今日やったこと

• ねむいミーティング
• まけないこと
• なげださないこと

-----------------------------------------------
2021-12-16 19:09:13
# 俺の夕会 2021-12-16

## 今日やったこと

• ねむいミーティング
• にげださないこと
• しんじぬくこと

yattakoto.rb はデフォルトで、過去 7 日分の「俺のやったこと」を取得しますが、今回は休みが重なったので 4 日分の「俺のやったこと」が取得出来ました。

以上

Slack APIRuby を使うことで、定期的な振り返りが捗りました!