【Town Star攻略】在庫をLINEで定期的に通知(放置プレイ)

【Town Star攻略】在庫をLINEで定期的に通知(放置プレイ) ツール

「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在庫通知システムの作り方を説明しました。

タイトルとURLをコピーしました