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