HaskellでSlackに投稿する

Network.Curlを使って

  1. HaskellによるWebスクレイピング
  2. HaskellでSlackに投稿する(この記事)
  3. systemdを使ってプログラムを定期実行する

scalpelで更新情報を抽出した後、保存されているテキストデータと異なっていた場合は、その旨をSlackへ通知を入れたい。 そのための関数はMain.hsとは別にLib.hsへ保存する。

Lib.hs

{-# LANGUAGE OverloadedStrings #-}

module Lib where

import Network.Curl as NC

webhookurl :: URLString
webhookurl = "https://hooks.slack.com/services/xxxx/xxxxxxxxxxxxxxxxx"

message :: [String]
message = ["payload={\"text\": \"UPDATE: Check http://example.com/\" }"]

sendUDMessage = curlPost webhookurl message

最初はslack-apiあたりを使おうかと色々探っていたのだが、単にSlack内のチャンネルに投稿するだけであれば、Incoming Webhooksを使って投稿するのが一番手っ取り早い。

cf: Sending messages using Incoming Webhooks | Slack

コード内でWebhooksのURLが丸裸になるのが微妙だが、セキュリティ面を厳密に考慮する必要のない私的ミニプロジェクトなのでよしとする。
Webhooksを叩くには、たとえばlinuxのターミナルからであればcurl postでいける。これをHaskellで実現するには、Network.CurlライブラリのcurlPostで十分。
messageの形式はSlackの仕様に合わせる必要があるが、投稿内容自体は件のWebサイトへのリンクがあれば事足りるので、全体として非常にシンプルにモジュールを作れた。