6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DiscordAdvent Calendar 2017

Day 18

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

Last updated at Posted at 2017-12-17

#はじめに
この記事は 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で実行する場合先にこ↑こ↓の作業を行ってから実行してください.
ご覧戴き、ありがとうございました!!

#参考サイト

6
8
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
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?