LoginSignup
7
1

More than 3 years have passed since last update.

Elixirでスクレイピング&DiscordBotを動かそう!

Last updated at Posted at 2021-02-09

Elixirって?

Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。(Wikipedia参照

Elixirちょっと触ってみたいって人は@piacerexさんのこの記事をどうぞ!

Discordって?

Discord(ディスコード)は、Windows・macOS・Linux・Android・iOS・Webブラウザで動作する、ビデオ通話・音声通話・VoIPフリーウェアである。(Wikipedia参照)

Lineのグループチャットのようなものです。
僕も普段からよくお世話になっております。

さっそく作ってみよう!

今回は、qiitaの各言語のトレンドがdiscordでコマンドを打つだけで見れるものを作ろうと思います
!qiita elixir的な感じで取得します
*Elixirのインストール方法やdiscordbotのアカウント作成等はさらっと、他の記事にぶん投げます!

まずはElixirのインストール

ここだよ!
Elixirのバージョン管理したいなら@nishiuchikazumaさんのこの記事かな!

*僕はexenvを使っているのですが、おそらく、たぶん、いや絶対上記の記事のバージョン管理が簡単な気がする。

DiscordBotの設定

@1ntegrale9さんのこの記事かな!

準備ができたら作っていきましょい!

今回は@madoramaさんのこちらの記事を参考にさせていただきました!

あらためて今回の目標

Screen Shot 2021-02-11 at 3.06.26.png
上記の画像のトレンドのaタグをスクレイピングして、下記の画像のようにDiscordBotを用いて表示させます!

プロジェクト作成

mix new qiita_discord_bot --sup 

qiita_discord_botは自分の好きなプロジェクト名に変えてください。
なんか色々ファイルとかフォルダが作られると思うのでcd プロジェクト名で移動してください。

*--supオプションが必須なのかが分からない、、(誰か教えてください)

ライブラリの導入

mix.exsの中にこちらを追加

mix.exs
defp deps do
  [
    {:alchemy, "~> 0.6.7", hex: :discord_alchemy}
  ]
end

追加したら

mix deps.get

を実行してライブラリを取得

configファイルを作ろう

Elixir1.9からconfigファイルが自動で生成されなくなったのでconfig/config.exsを作ってください。

mkdir config
cd config
touch config.exs

次にconfig.exsにbotのトークンを書きます。

config.exs
config :qiita_discord_bot,
  discord_token: "bot token"

Bot界のHelloWorld!?

こちらをみてください。(書いてたんですけど、誤ってページ飛んだら保存されてないじゃないか、なにがじどうほぞんd

気を取り直して、qiitaをスクレイピングしてdiscordに表示させましょう!

えー、まずはHTTPoison(httpクライアント)とFloki(httpパーサ)を追加しましょう。(あ〜ここもちゃんと書いてたのになぁ

mix.exs
defp deps do
  [
    {:alchemy, "~> 0.6.7", hex: :discord_alchemy},
    {:httpoison, "~> 1.8"}, # <-追加
    {:floki, "~> 0.29.0"} # <-追加
  ]
end

追加したら

mix deps.get

を実行!

実際にコードを書いてく

はい、それではコードを書いていきましょう。
https://qiita.com/tags/**********の部分を引数にしてやればそれぞれのタグのトレンドが取得できます。
ちなみに、Cogs.def コマンド名(引数) doとなっているのでそこを利用します。
以下コードの全体です。

application.ex
defmodule QiitaDiscordBot.Application do
  use Application

  defmodule Commands do
    use Alchemy.Cogs

    Cogs.def ping do # <- bot界のhelloworld
      Cogs.say "pong!"
    end
   # 今回したかったやつ
    Cogs.def qiita(key) do 
      key = String.downcase(key) # <- 大文字が入るとうまくいかなかったので全て小文字に変換
      Cogs.say "#{key}の先週のトレンド"
      target_url = "https://qiita.com/tags/" <> key
      HTTPoison.get!(target_url).body # <- htmlのbodyを取得
      |> Floki.find("a.css-eebxa") # <- トレンドの部分のクラスを取得
      |> Floki.attribute("href") # <- 属性を取得
      |> Enum.each(&(Cogs.say(&1))) # <- それぞれ表示
    end
  end


  def start(_type, _args) do
    opts = [strategy: :one_for_one, name: QiitaDiscordBot.Supervisor]
    Supervisor.start_link(children, opts)

    token = Application.get_env(:qiita_discord_bot, :discord_token)
    run = Alchemy.Client.start(token)
    use Commands
    run
  end
end

実行

mix run --no-halt

はい、discord開いて!qiita elixirって打ってみたら、elixirのトレンドの記事が出てきますよ〜!
間違って、!qiita EliXIrなんて打っても大丈夫ですからね〜!

終わりに

たった数行でスクレイピングできたりdiscordにつぶやけたり、elixirってすごいですね!
今回のプロジェクトはgithubにも載せてますので何かご不明な点などありましたら、コメントお待ちしております!

本当の終わりに

誰か雇ってもろてもええですか?(就活生)

7
1
3

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
7
1