0
1

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 1 year has passed since last update.

METROCK(メトロック)2023のリセールチケットをRubyスクリプトでGETした話

Last updated at Posted at 2023-05-17

これはなに?

GW満喫してるうちに売り切れてしまったMETROCK(メトロック)2023 5/21のチケットを、公式のリセールでなんとか手に入れたエンジニアの物語。

どうやったの?

ぴあリセールチケットの公式サイトをスクレイピングして、5/21のチケットがリセールされたらLINE通知するRubyスクリプトを書いて、crontabで1分おきにスクリプトを実行するようにした。

詳しく教えてください

Rubyのインストール

めんどくさいので割愛します。たくさん記事が出てくると思うので、ググってみてください。

Rubyスクリプトの用意

まずは以下の処理を行うRubyスクリプトを用意する。要件はめちゃくちゃシンプルですね。

  • ぴあリセールチケットの公式サイトをスクレイピング
  • チケットを検知したらLINEに通知

実際のコードは以下です。

require 'net/http'
require 'uri'
require 'open-uri'
require 'nokogiri'

URL="ぴあリセールチケットの検索条件を指定した後に表示される画面のURLを貼りたまえ"

class LineNotify
  TOKEN = '君のトークンを書きたまえ'.freeze
  LINE_URL = 'https://notify-api.line.me/api/notify'.freeze

  attr_reader :message

  def self.send(message)
    new(message).send
  end

  def initialize(message)
    @message = message
  end

  def send
    Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |https|
      https.request(request)
    end
  end

  private

  def request
    request = Net::HTTP::Post.new(uri)
    request['Authorization'] = "Bearer #{TOKEN}"
    request.set_form_data(message: message)
    request
  end

  def uri
    URI.parse(LINE_URL)
  end
end

doc  = OpenURI.open_uri(URL).read
page = Nokogiri::HTML(doc)
text = page.text

if text.match?("1日") || text.match?("1日")
  LineNotify.send("1日券が出たよ")
end

たぶん、5 ~ 10分くらいで書きました。ほぼコピペです。

記事の情報を取得する

ぴあリセールチケットの検索条件を指定した後に表示される画面のURLにアクセスしてHTMLを取得します。そのあとで、取得したHTMLをNokogiriさんに解析してもらいます。
最後に解析したHTMLに1日もしくは1日という文字列があった場合に、LINE通知をするようにしてます。判定方法は僕の場合は1日券が欲しかったのでこのようになりましたが、ここの判定は欲しいチケットの内容によって変わります。いずれにせよ、文字が含まれてるかどうかの検索で十分かなと思います。
因みに、全角と半角どちらも検証してるのは、実際のリセールチケットの文言が分からなかったので、念の為どっちも検証してるためです。

LINE通知

LINE通知はこの記事を参考にしました。本当にありがとうございました。
詳しく知りたい方は記事を読んでください。
記事の注意点として、トークンはPCからじゃないと取得できないので、そこだけ気をつけてください。

スクレイピングとは?

プログラム上でwebページにリクエストを送って返却されたHTMLからデータを解析することです。要するに、プログラムを使ってwebページから知りたい情報を取得できる技術です。
Rubyの場合だと先ほど紹介したNokogiriという超有名なライブラリで簡単にスクレイピングできます。
詳しく知りたい方はここらへん読んでね。

スクリプトを定期実行する

Windowsの場合はcrontabが使えないので、ここら辺の記事を参考にしてみてください。

スクリプトを書いたので、次にスクリプトを自動で定期実行するようにします。crontabを使いましょう。

crontabの登録(編集)を実行します。

$ crontab -e

書いたスクリプトのフルパスを指定してrubyコマンドで実行。パスは自分の環境で確認してください。今回は毎分実行するように設定します。

* * * * * ruby /path/to/ticket.rb

登録されてることを確認。

$ crontab -l
* * * * * ruby /path/to/ticket.rb

事後処理

見事にチケットがGETできた、もしくは、残念ながらGTEできずにライブが終わった場合は、ちゃんと登録したcronを削除しておきましょう。crontab -rで全てのcronを削除できますが、他にもcronを登録してる場合は、crontab -eでさっき追加したcronだけ削除してください。

準備は整った

全ての作業が済んだので、あとはリセールチケットが出ることを待ちましょう。
僕は夕方頃に通知が来て、ちょうどリアルタイムで気づいたので速攻で購入サイトに行き、見事チケットをGETすることができました。
Screenshot_20230517-170201.png

まとめ

思いの外スクリプト仕掛けてからすぐに取れてよかったです。
エンジニアじゃなくても、ちょっと勉強すれば誰でも書けるコードなので、興味のある方は是非ご自分の環境で試してみてください。
ではでは。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?