読者です 読者をやめる 読者になる 読者になる

十を聞いて一を知る

要領の悪い高専生がプログラミングをします。

Mechanizeを使ってWeb予約を自動化してみる・続々々

LINE Bot 自動化 2016年度春休み連載

こんばんは。
それでは続きをしていきましょう。

今日はLINE Botとの連携までです。
ところで、Pushはどうするんだったかなーっとリファレンスを見てみると…
f:id:taira1999120:20170309233531p:plain
f:id:taira1999120:20170309233534p:plain
f:id:taira1999120:20170309233536p:plain
便利そうなクラスがあるではないですか。


どうやら公式のSDKのようです。

require 'sinatra'
require 'line/bot'

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    error 400 do 'Bad Request' end
  end

  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        message = {
          type: 'text',
          text: event.message['text']
        }
        client.reply_message(event['replyToken'], message)
      when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
        response = client.get_message_content(event.message['id'])
        tf = Tempfile.open("content")
        tf.write(response.body)
      end
    end
  }

  "OK"
end

(引用 line-bot-sdk-ruby

署名検証からパース、返信までお手軽にできるようですね。今までの苦労は一体何だったのか…
調べずに進めた私が悪いんですけど。


となれば後は簡単。

$ gem install line-bot-api

の後、前回のコードにちょっと足して。

require 'mechanize'
require 'line/bot'

def send_message
  message = { type: 'text', text: '予約に空きができました。'}
  client = Line::Bot::Client.new { |config|
    config.channel_secret = "<channel secret>"
    config.channel_token = "<channel access token>"
  }
  client.push_message("<to>", message)
end

post_uri = # ログインページURI
get_uri = # 予約一覧ページのURI
params = # IDとかパスワードとかログインに必要なパラメータをハッシュで

agent = Mechanize.new
agent.post(post_uri, params) # ログイン処理

loop do
  reservation_page = agent.get(get_uri)
  sleep(10) # これがないとただのDoS攻撃になる
  agent.post(post_uri, params) if ログインできてないと言える条件

  if 空いていると言える条件 then
    puts "空きができました。"
    send_message()
  end
end

これで終わりです。
試しに、自分が今取っている予約を一瞬だけ取り消したら無事Botからメッセが届きました。

次回はHerokuにあげようと思います。
それでは。