LoginSignup
14
5

More than 3 years have passed since last update.

年末ですね Slackボット (Elixir)

Last updated at Posted at 2020-12-26

はじめに

Qiita Advent Calendar 2020

スクリーンショット 2020-12-26 21.51.44.png

:tada::tada::tada:

インストール

  • Elixirをインストールしましょう :rocket::rocket::rocket:
  • 手前味噌ですが、インストールなどをご参照ください
  • 何事にも準備が肝心です
  • ここが一番つまらないし、謎にハマってしまうことが多いのですが、がんばってください!
  • うまくいかなかったら、思い切って僕の胸に飛び込んで来てほしい (by 長嶋茂雄 読売ジャイアンツ終身名誉監督)
    • elixirjp.slack.com slack workspaceNervesJP workspaceに入ってきていただいて、@torifukukaiouへご質問ください
    • たとえ私が答えられなくても、マジみんな親切で優しい人が多いので、きっと解決できるでしょう:bangbang:

プロジェクト作成

$ mix new nenmatsu_bot --sup
$ cd nenmatsu_bot
mix.exs
  defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
      {:httpoison, "~> 1.7"},
      {:jason, "~> 1.2"}
    ]
  end
  • HTTPクライアントHTTPoisonとすんげー速い:rocket:JSONパーサー&ジェネレーターJasonをプロジェクトで使えるようにします
$ mix deps.get

ソースコードを書く

lib/nenmatsu_bot/slack.ex
defmodule NenmatsuBot.Slack do
  @url "https://hooks.slack.com/services/secret..."

  def post(text, username, icon_url, channel_name) do
    body =
      %{
        text: text,
        username: username,
        icon_url: icon_url,
        link_names: 1,
        channel: channel_name
      }
      |> Jason.encode!()

    headers = [{"Content-type", "application/json"}]
    HTTPoison.post!(@url, body, headers)
  end
end
lib/nenmatsu_bot/worker.ex
defmodule NenmatsuBot.Worker do
  use GenServer

  @one_minute 60 * 1000
  @thirteen_minutes @one_minute * 13
  @famous_folks %{
    "徳川家康" =>
      "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Tokugawa_Ieyasu2.JPG/270px-Tokugawa_Ieyasu2.JPG",
    "有名人①" =>
      "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Bill_Gates_June_2015.jpg/220px-Bill_Gates_June_2015.jpg",
    "有名人②" =>
      "https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Elon_Musk_2015.jpg/220px-Elon_Musk_2015.jpg",
    "有名人③" =>
      "https://assets.media-platform.com/bi/dist/images/2019/06/07/jeff-bezos-shares-his-best-advice-for-anyone-starting-a-business.jpg"
  }

  def start_link(state \\ %{}) do
    GenServer.start_link(__MODULE__, state, name: __MODULE__)
  end

  def init(state) do
    Process.send_after(__MODULE__, :tick, @one_minute)
    {:ok, state}
  end

  def handle_info(:tick, state) do
    Process.send_after(__MODULE__, :tick, @thirteen_minutes)

    {username, icon_url} = Enum.random(@famous_folks)
    NenmatsuBot.Slack.post("年末ですね", username, icon_url, "kokura-ex")

    {:noreply, state}
  end
end
  • kokura-exのところは投稿したいチャネル名に変更してください
lib/nenmatsu_bot/application.ex
defmodule NenmatsuBot.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

  @impl true
  def start(_type, _args) do
    children = [
      # Starts a worker by calling: NenmatsuBot.Worker.start_link(arg)
      # {NenmatsuBot.Worker, arg}
      NenmatsuBot.Worker # add
    ]

    # See https://hexdocs.pm/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_one, name: NenmatsuBot.Supervisor]
    Supervisor.start_link(children, opts)
  end
end
  • ソースコードは説明しませんが、なんとなくやっていることは伝わるのではないでしょうか
    • $\huge{Don't think, feeeeeeeel}$
  • SlackのIncoming Web hook APIを使っています

スクリーンショット 2020-12-26 22.04.13.png

  • その他管理項目 > アプリを管理する
  • 次の画面で Incoming Web hookで検索

スクリーンショット 2020-12-26 22.05.55.png

  • あとは案内の通りに進めて、Webhook URL@urlにセットします

Run

$ iex -S mix
  • このまま放っておくと、
  • 13分に一回 kokura-ex チャネルに「年末ですね」を投稿します
  • Enum.random/1関数でランダムに有名人を選んでいます

スクリーンショット 2020-12-26 22.20.06.png

Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5