Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

参考サイト

no1fushi
プログラミングを多少かじったにわかオタクな高専生 音フェチです HTML5/CSS3/JavaScript/CLang/Ruby/LISP(Scheme)
https://no1fushi.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away