「Town Starで在庫を確認するのが面倒・・・」
「Town Starをもっと効率的にプレイしたい」
このような場合には、この記事の内容が役に立ちます。
この記事では、Town Starの在庫をLINEで通知する方法を解説しています。
つまり、Town Star在庫通知システムのレシピです。
本記事の内容
- Town Star在庫通知システムとは?
- クライアント(JavaScript)のコード
- サーバー(PHP)のコード
それでは、上記に沿って解説していきます。
Town Star在庫通知システムとは?
Town Starにおける在庫を通知するシステムを作ります。
在庫通知システムとは、少し大げさかもしれませんけどね。
Town Starにおける在庫とは、次の各アイテムの数値のことです。

この在庫状況の場合、次のような通知が行われます。
LINEにこのようなメッセージが届きます。

Town Star在庫通知システムのイメージができたでしょうか?
では、どうやってこのシステムが動くのかを説明します。
まずは、処理の流れから確認です。
以下の流れで在庫通知を行います。
- Town Star在庫情報の取得(クライアント)
- 在庫情報のPOST送信(クライアントからサーバーへ)
- 在庫情報のLINE送信(サーバー)
Ajaxを使った仕組みです。
この点では、ごくごくどこにでもあるシステムと言えます。
| クライアント | JavaScript |
| サーバー | PHP |
ただし、クライアントでJavaScriptを動かすことに工夫が必要です。
工夫と言っても、Town Starプレーヤーならお馴染みでしょう。
Tampermonkeyを利用するのです。
Tampermonkeyについては、次の記事で説明しています。
おそらく、自動売買のスクリプトでお世話になっているはずです。
同じようにTown Star在庫通知用のスクリプトを動かします。
そのスクリプト内で次の2つまで行います。
- Town Star在庫情報の取得(クライアント)
- 在庫情報のPOST送信(クライアントからサーバーへ)
そして、サーバー側でPOST送信された情報を受信します。
その情報をもとにLINEに送るメッセージを作成することになります。
LINEへの通知は、LINE NotifyのAPIを利用します。
詳細は、後述します。
以上が、Town Star在庫通知システムの仕様となります。
あとは、クライアントとサーバーそれぞれのコードを公開します。
クライアント(JavaScript)のコード
このコードを「zaiko_alert」として、Tampermonkeyに登録します。
// ==UserScript==
// @name zaiko_alert
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://townstar.sandbox-games.com/launch/
// @icon https://www.google.com/s2/favicons?domain=gala.games
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
var $ = window.jQuery;
(function() {
'use strict';
var server_url = "http://localhost/ts/zaiko_alert.php";
var interval_time = 30000;//30秒
// Your code here...
var fn = function() {
var zaiko_list = get_crafts_zaiko();
post_zaiko_info(zaiko_list);
}
var id = setInterval(fn,interval_time);
function post_zaiko_info(obj) {
$.ajax({
url: server_url,
type:'POST',
dataType: 'json',
timeout:3000,
data : {"post_data" : JSON.stringify(obj)},
}).done(function(data) {
console.log(data)
}).fail(function(XMLHttpRequest, textStatus, errorThrown) {
console.log(textStatus);
})
}
function get_labor_cost(){
var cost = ts_get_count("hud-labor-costs");
return cost;
}
function ts_get_count(class_str) {
var target_elem = $("." + class_str);
var count = target_elem.text();
count = $.trim(count);
count = count.replace(",", "");
return parseInt(count);
}
function ts_get_crafts_list() {
var list = new Array();
$("#hud-craft-target .crafts").each(function(i, elem) {
var class_str = $(elem).attr("class");
var classes = class_str.split(" ");
if (classes.length==2) {
var val = classes[1];
list.push(val);
}
});
return list;
}
function get_crafts_zaiko() {
var obj = new Object();
var list = ts_get_crafts_list();
$.each(list, function(index, value) {
var key = $.trim(value).replace("hud-craft-display-", "");
var cost = ts_get_count(value);
obj[key] = cost;
})
return obj;
}
})();
コードに関しては、よく確認してください。
jQueryが理解できれば、単純なコードと言えます。
私が悪意のあるコードを含まない可能性は、ゼロではありません。
それが意図するしないに関わらずです。
各自で変更する場所は、以下の部分です。
var server_url = "http://localhost/ts/zaiko_alert.php";
var interval_time = 30000;//30秒
「server_url」は、サーバー側プログラムのURLです。
基本的には、localhostや閉じた環境で動かす方が良いでしょう。
「interval_time」は、通知プログラムが動く間隔です。
デフォルトでは、30秒を指定しています。
30秒だと、こんな感じで届きます。

これがウザい場合は、間隔を伸ばしましょう。
サーバー(PHP)のコード
「server_url」で設定したURLのファイルです。
zaiko_alert.php
<?php
header('Access-Control-Allow-Origin: *');
require 'vendor/autoload.php';
$token = "LINE Notifyで発行したアクセストークン";
$post = $_POST["post_data"];
$zaiko_list = json_decode($post, true);
$str = "";
foreach($zaiko_list as $key => $value){
$str = $str . "\n";
$str = $str . "【" . $key . "】" . $value;
}
if(strcmp($str, "")!=0){
// リクエストヘッダ作成
$message = $str;
$query = http_build_query(['message' => $message]);
$header = ['Authorization: Bearer ' . $token];
$ch = curl_init('https://notify-api.line.me/api/notify');
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => $header,
CURLOPT_POSTFIELDS => $query
];
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
}else{
$ary = array();
$response = json_encode($ary);
}
echo $response;
?>
コードの内容を理解するには、次の記事を確認してください。
LINE Notifyの利用方法から、すべて説明しています。
以上、Town Star在庫通知システムの作り方を説明しました。



