#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さんの[この記事かな!]
(https://qiita.com/nishiuchikazuma/items/b9d319732ddb540fd990)
*僕はexenvを使っているのですが、おそらく、たぶん、いや絶対上記の記事のバージョン管理が簡単な気がする。
##DiscordBotの設定
@1ntegrale9さんのこの記事かな!
##準備ができたら作っていきましょい!
今回は@madoramaさんのこちらの記事を参考にさせていただきました!
###あらためて今回の目標
上記の画像のトレンドのaタグをスクレイピングして、下記の画像のようにDiscordBotを用いて表示させます!
###プロジェクト作成
mix new qiita_discord_bot --sup
qiita_discord_bot
は自分の好きなプロジェクト名に変えてください。
なんか色々ファイルとかフォルダが作られると思うのでcd プロジェクト名
で移動してください。
*--sup
オプションが必須なのかが分からない、、(誰か教えてください)
###ライブラリの導入
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 :qiita_discord_bot,
discord_token: "bot token"
###Bot界のHelloWorld!?
はこちらをみてください。(書いてたんですけど、誤ってページ飛んだら保存されてないじゃないか、なにがじどうほぞんd)
###気を取り直して、qiitaをスクレイピングしてdiscordに表示させましょう!
えー、まずはHTTPoison(httpクライアント)とFloki(httpパーサ)を追加しましょう。(あ〜ここもちゃんと書いてたのになぁ)
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
となっているのでそこを利用します。
以下コードの全体です。
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にも載せてますので何かご不明な点などありましたら、コメントお待ちしております!
######本当の終わりに
誰か雇ってもろてもええですか?(就活生)