rubyでslack通知

↓の記事でwhile readしないとうまく動かない理由がわかったので、slack通知の部分を変更した nanka.hateblo.jp

動かない理由はこちら nanka.hateblo.jp

改善版

require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://hooks.slack.com/services/*/*/*")

STDIN.each do |line|
  payload = {
    text: line,
    channel: ARGV[0],
    username: ARGV[1],
    icon_emoji: ARGV[2]
  }

  Net::HTTP.post_form(uri, { payload: payload.to_json })
end

tail -Fの結果をslackに流すだけなので、複数行の通知は諦めた(STDIN.readを使うとtail -FからEOFがやってこないので永遠に待ち状態になる)

STDIN.eachで標準入力を待ち構えて、やってきたら送信を繰り返すだけ

こうすることでやっと↓のように使える

tail -F logfile | ruby slack.rb "#room" "name" ":emoji:"

rubyの正規表現で文字列抽出

matchを使うと正規表現で文字列を抽出できる

hoge = 'ip = 255.255.255.255'
ip = hoge.match(/ip = (\d+\.\d+\.\d+\.\d+)/)[1]
puts ip
$ ruby -e "hoge = 'ip = 255.255.255.255'; ip = hoge.match(/ip = (\d+\.\d+\.\d+\.\d+)/)[1]; puts ip"
255.255.255.255