Edited at
DiscordDay 18

Rubyで定期的に暗号通貨のレートをつぶやくDiscordのBotを作ろう!

More than 1 year has passed since last update.


はじめに

この記事は Discord Advent Calendar 2017 18日目の記事です.

また、私のQiita初投稿記事でもあります.

間違った知識や、言葉遣いはコメント等で教えていただけると幸いです.

纏まりのない文章ですがそれでもよければ、どうぞ.


Discordとは


Discord(ディスコード)はMicrosoft Windows, macOS, Android, iOS, Linux、Webブラウザで動作する、ゲーミング用に開発された無料のVoIPアプリケーション。

wikipediaより引用


簡単に言えばマルチプラットフォームな音声,ビデオ通話付きチャットツール

ゲーマー向けに言えば Skype + TeamSpeak

エンジニア向けに言えば 通話機能付きのslackですね

公式サイト: https://discordapp.com/


事前準備


  • Rubyの開発,実行環境の構築(gemも含む)

  • Rubyの基本的な構文の学習

  • Discordのアカウントの取得

  • Discordの基本操作習得


必要なライブラリのインストール

dircordrbというライブラリを使用します

GitHub: https://github.com/meew0/discordrb

RubyDoc: http://www.rubydoc.info/gems/discordrb/

Discord: https://discord.gg/3Trm6FW



$ gem install discordrb



以上ですね


雛形を書いてみる


bot.rb

require "discordrb"

require "json"
require "open-uri"
require 'net/http'
require "date"

bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id: CLIENTID, prefix: "!"

# 指定したsecごとに処理を実行する
# http://tbpgr.hatenablog.com/entry/20120624/1340549187 より引用
def execute_each_sec(sleep_sec)
yield
sleep sleep_sec
end

#コマンドボット等
bot.command(:hello, description: "hello Worldを返す") do |event|
event.respond "Hello World"
end

bot.run :async
loop do
execute_each_sec(3600) do ||
#こ↑こ↓の処理を3600秒毎に定期実行
end
end
bot.sync


TOKENとCLIENTIDは次の項で説明します。

prefix:'!'ここの''の中見でコマンドボットの呼び出し方が変わります

この場合!helloと打つとBotがHello Worldと返してくれます

チャットボットは下のような形で書くことができます


bot.rb

bot.command(:コマンド名, description: "説明文(あってもなくても良い)") do |event,変数|

 #全チャンネルで反応
event.respond "返す文字"
#特定のチャンネルで反応
bot.send_message(channel_id=ChannelID, "返す文字列")
end

説明文に関してはデフォルトで!help コマンド名 でそのコマンドの説明が見れます

そこに書かれる説明文のことです

チャンネルIDに関してはこ↑こ↓を参照してください


Botを登録する



  1. https://discordapp.com/developers/applications/me にアクセスする

  2. NewAppをクリック

  3. APP NAMEを入力しCreate Appをクリック

  4. Client IDとclick to revealをクリックして出てきたClient Secretを控える


  5. https://discordapp.com/oauth2/authorize?client_id=ClientID&scope=bot&permissions=0 のClientIDを控えた18文字くらいの数字に置き換えアクセス

  6. Botを入れたいサーバを選択しBotを入れる

これでBotの登録は終わりました


パパっと書いて起動!


bot.rb

bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id:  CLIENTID, prefix: "!"

#TOKENをClient Secretに置き換える
#ClientIDを控えた18文字くらいの数字に置き換える

execute_each_sec(3600) do ||
#こ↑こ↓の処理を3600秒毎に定期実行
mona = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/mona_jpy')))
btc = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/btc_jpy')))

time = Time.now + (3600 * 2)
day = time.strftime("%Y/%m/%d:%A:")
time = Time.now
hms = time.strftime("%H:%M:%S")

bot.send_message(channel_id=ChannelID,"#{day} #{hms} 現在")
bot.send_message(channel_id=ChannelID,"モナコインの現在のレートは1monaあたり #{mona['last_price']} 円なり")
bot.send_message(channel_id=ChannelID,"ビットコインの現在のレートは1btcあたり #{btc['last_price']} 円なり")
end


暗号通貨のレートはZaif: https://zaif.jp/より取得します.

ZaifAPIより https://api.zaif.jp/api/1/last_price/通貨名_jpy の形でjson形式で暗号通貨の日本円レートが取得できるのでそれをパースしているだけです.


ソースの全貌


bot.rb

require "discordrb"

require "json"
require "open-uri"
require 'net/http'
require "date"

bot = Discordrb::Commands::CommandBot.new token: "TOKEN", client_id: CLIENTID, prefix: "!"

def execute_each_sec(sleep_sec)
yield
sleep sleep_sec
end

bot.command(:hello, description: "hello Worldを返す") do |event|
event.respond "Hello World"
end

bot.run :async
loop do
execute_each_sec(3600) do ||
mona = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/mona_jpy')))
btc = JSON.parse(Net::HTTP.get(URI.parse('https://api.zaif.jp/api/1/last_price/btc_jpy')))

time = Time.now + (3600 * 2)
day = time.strftime("%Y/%m/%d:%A:")
time = Time.now
hms = time.strftime("%H:%M:%S")

bot.send_message(channel_id=ChannelID,"#{day} #{hms} 現在")
bot.send_message(channel_id=ChannelID,"モナコインの現在のレートは1monaあたり #{mona['last_price']} 円なり")
bot.send_message(channel_id=ChannelID,"ビットコインの現在のレートは1btcあたり #{btc['last_price']} 円なり")
end
end
bot.sync


あとは$ ruby bot.rbして起動すれば完成です.

また、Windowsで実行する場合先にこ↑こ↓の作業を行ってから実行してください.

ご覧戴き、ありがとうございました!!


参考サイト