これは
YAMAP エンジニア Advent Calendar 2021 の第 17 日目の記事にします。
はじめに
皆さん、日々の作業の振り返りってどのようにされていますか?
自分は、以下のように、退勤しますポストのスレッドに「俺の夕会」と称して、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] # 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 日分の「俺のやったこと」が取得出来ました。