これは
YAMAP エンジニア Advent Calendar 2021 の第 17 日目の記事にします。
qiita.com
はじめに
皆さん、日々の作業の振り返りってどのようにされていますか?
自分は、以下のように、退勤しますポストのスレッドに「俺の夕会」と称して、Slack を相手に独りでやっています。
こうやって、日々のやったことが 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]
now = Date.today
days_ago = now - OLDEST.to_i
oldest = sprintf("%.5f", days_ago.to_time.to_i)
cursor = nil
loop do
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")
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 API と Ruby を使うことで、定期的な振り返りが捗りました!