Rubyでロト6とナンバーズの予想番号をiPhoneに通知するコマンド作った


自宅サーバとなったRaspberry Piを有効活用できていなかったので、せっかくなら「ロト6とナンバーズの当選予想でもしてもらおう」と思い、Rubyでコマンドを作ってみました。
(現状は単にrand関数を使っているだけなので、予想というか適当に数字を出しているだけです)

iPhoneへの通知には「im.kayac.com」を使用するので、事前にim.kayac.comのアカウント登録とiPhoneアプリをインストールしておきます。

今回はCLIツールを手軽に作成できる「thor」 gemとim.kayac.comへの通知を手軽にできる「im-kayac」 gemを使わせていただきました。

  • 縁起が良さそうなluckyディレクトリを作成
mkdir lucky
cd lucky
  • Gemfileの作成
# Gemfile
source "https://rubygems.org"

gem 'thor'
gem 'im-kayac'
  • gemのインストール
bundle install --path vendor/bundle

を実行
bundleがインストールされていない場合は

gem install bundler

でインストールを行なってください。

  • luckyコマンドの作成
#!/usr/local/rvm/rubies/default/bin/ruby
# encoding: UTF-8

require 'rubygems'
require 'bundler/setup'
require 'thor'
require 'im-kayac'

class Lucky < Thor
  desc "loto im-kayac-ACCOUNT [OPTIONS]", "send loto"
  method_option :set, :type => :string, :aliases => '-s', :desc => 'change loto category'
  def loto account
    holy = HolyNumber.new
    message = []
    message << "loto : #{holy.loto(options[:set])}"
    postImKayac(account, message)
  end

  desc "numbers im-kayac-ACCOUNT [OPTIONS]", "send numbers"
  method_option :set, :type => :string, :aliases => '-s', :desc => 'change numbers category'
  def numbers account
    holy = HolyNumber.new
    message = []
    message << "numbers : #{holy.numbers(options[:set])}"
    postImKayac(account, message)
  end

  private
  def postImKayac(account, message)
    begin
      ImKayac.to(account).post(message.join("\n"))
    rescue => e
      STDERR.puts e
    end
  end
end

class HolyNumber
  @@default_loto_type = 6
  @@default_numbers_type = 4

  def initialize
  end

  def numbers(set)
    max_range = 9
    result = []

    if (set.nil?)
      set = @@default_numbers_type
    end
    set = set.to_i

    set.times do
      result << (rand(max_range) + 1).to_i
    end

    return result.join("")
  end

  def loto(set)
    max_range = 43
    result = []

    if (set.nil?)
      set = @@default_loto_type
    end
    set = set.to_i

    set.times do
      result << get_loto_number(max_range, result)
    end

    return result.join(", ")
  end

  private
  def get_loto_number(max, result)
    number = sprintf("%02d", (rand(max) + 1).to_i)
    return (result.include?(number)) ? get_loto_number(max, result) : number
  end
end

Lucky.start

実行権限追加

chmod +x lucky

コマンドを実行してみるとヘルプが表示されます

./lucky
Commands:
  lucky help [COMMAND]                      # Describe available commands or one specif...
  lucky loto im-kayac-ACCOUNT [OPTIONS]     # send loto
  lucky numbers im-kayac-ACCOUNT [OPTIONS]  # send numbers

オプションとして-sをつけると番号数を変更できるのでロト5やナンバーズ3にも対応しています。

ロト5の場合:
lucky loto im-kayac-ACCOUNT -s 5

ナンバーズ3の場合:
lucky numbers im-kayac-ACCOUNT -s 3
  • cron設定

毎週水曜日のお昼に予想番号が届くように設定

crontab -e

00 12 * * 4 cd /home/apple/lucky;./lucky loto {my_account}
00 12 * * 4 cd /home/apple/lucky;./lucky numbers {my_account}

これで一週間の楽しみがひとつ増えました。
今はrand関数ですが、次は過去の結果を元に予想するように改良したいと思います。

参考URL