Skip to content

Instantly share code, notes, and snippets.

@5l
Created March 21, 2018 06:20
Show Gist options
  • Save 5l/8d946009c5c7ff7d8738687e0d814737 to your computer and use it in GitHub Desktop.
Save 5l/8d946009c5c7ff7d8738687e0d814737 to your computer and use it in GitHub Desktop.
設定した価格以下のチケットがチケット流◯センターに出品されるのを監視 (PHPCLI)
<?php
# 公演のURL
$url = "https://www.ticket.co.jp/sys/d/15637.htm?ki=30400&st=20180331";
# 通知最大金額
$maxprice = 20000;
# 取得間隔(秒)
$interval = 5;
// ログ
$dat = "./tickets.txt";
if(!file_exists($dat)){
file_put_contents($dat, json_encode(array()));
}
while(true){
$html = mb_convert_encoding(file_get_contents($url . "&order=price&orderable=1"), "UTF8", "EUCJP");
preg_match_all('#<ul class="list-ticket-box(.*?)">(.*?)</ul>#s', $html, $match);
if(isset($match[0]) && count($match[0]) > 0){
$tickets = array();
foreach($match[0] as $key => $value){
// 公演名
preg_match('#<p class="fw-bold">(.*?)</p>#s', $value, $title);
$tickets[$key]["title"] = trim($title[1]);
// 日時
preg_match('#<span class="fw-bold">(.*?)\(#s', $value, $date);
$tickets[$key]["date"] = trim($date[1]);
// 場所
preg_match('#<li class="list-ticket-place">(.*?)</li>#s', $value, $place);
$ticlets[$key]["place"] = trim(strip_tags($place[1]));
// 座席
preg_match('#<li class="list-ticket-seat">(.*?)</li>#s', $value, $seat);
$tickets[$key]["seat"] = implode(PHP_EOL, array_filter(array_map("trim", explode("\n", strip_tags($seat[1]))), "strlen"));
// 価格
preg_match('#<span class="ticket-price">¥(.*?)</span>#s', $value, $price);
$tickets[$key]["price"] = trim(str_replace(',', '', $price[1]));
// 枚数
if(preg_match('#<span class="ticket-sellunit">(.*?)<br>#s', $value, $tknum)){
$tickets[$key]["num"] = trim(strip_tags($tknum[1]));
}else{
$tickets[$key]["num"] = 1;
}
// チケットID
if(preg_match('#<span id="(.*?)">#s', $value, $ticketid)){
$tickets[$key]["id"] = trim($ticketid[1]);
}else{
$tickets[$key]["id"] = false;
}
// 取引状態
if(preg_match('#<span class="btn-no-order">(.*?)</span>#s', $value, $status)){
$tickets[$key]["status"] = trim(str_replace(array("(", ")"), "", $status[1]));
}elseif(preg_match('#value="注文へ"#s', $value, $status)){
$tickets[$key]["status"] = "購入可";
}else{
$tickets[$key]["status"] = "不明";
}
# 条件に一致するか判定
if($tickets[$key]["status"] === "購入可" && $tickets[$key]["price"] <= $maxprice){
# 過去に取得したことがあるか確認
$flag = true;
$oldticket = json_decode(file_get_contents($dat), true);
foreach($oldticket as $oldkey => $old_value){
if($old_value["id"] && $old_value["id"] == $tickets[$key]["id"]){
if($old_value["status"] === "購入可"){
$flag = false;
break;
}
}
}
if($flag){
# 通知
e($tickets[$key]['title']);
e($tickets[$key]['seat']);
e("¥" . $tickets[$key]['price']);
e("https://www.ticket.co.jp/sys/ticket.php?id=" . $tickets[$key]["id"]);
}
}
}
e(count($tickets) . "チケットが出品中");
# 保存
file_put_contents($dat, json_encode($tickets, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}else{
e("現在チケットが出品されてません。");
}
sleep($interval);
}
function e($str){
echo mb_convert_encoding($str . PHP_EOL, "SJIS", "auto");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment