🎮

LoLでCSを落とすとメスガキに罵倒される『ドM専用コーチングツール』をPythonで作った話

に公開

LoLでCSを落とすとメスガキに罵倒される『ドM専用コーチングツール』をPythonで作った話

こんにちは、個人開発者のりっとんです。

突然ですが、League of Legends (LoL) というゲーム、難しくないですか?
特にレーナーの基礎であるCS(クリープスコア)
「練習しなきゃ」と思っても、優しく指摘されるだけじゃ甘えてしまう……。

「いっそ、CSを落とすたびにメスガキに罵倒されれば、悔しくて上手くなるのでは?」

そんな歪んだ動機で、 『LoL CS Auto Coach(罵倒版)』 を開発しました。
今回は、このツールの 技術的な仕組み(Riot APIの活用) と、なぜBANされず安全なのかという点について、ソースコードを交えて解説します。

完成したもの

https://x.com/Litton_Dev/status/2008766689836757339?s=20
実際に動作している様子がこちらです。

【機能】

  1. 試合開始から3分後、監視スタート。
  2. リアルタイムで分間CS (CSPM) を計算。
  3. 基準値を下回ると、 「はぁ?引退したら?」 などの罵倒ボイスが再生される。

完成品(exe版)はBOOTHで無料配布しています
https://litton-lab.booth.pm/items/7852304

技術的な仕組み:なぜ「安全」なのか

「外部ツールってBANされるんじゃないの?」と不安になる方もいると思います。
結論から言うと、このツールは ホワイト(安全) な設計で作られています。

チートツールとの違い

  • × 一般的なチート(BAN対象):
    • ゲームのメモリを直接読み書きする。
    • パケットを解析・送信する。
    • キャラクターを自動操作する。
  • ◎ 今回作ったツール:
    • Riotが公式に提供しているローカルAPIを叩いて、数字を見ているだけ。
    • ブラウザで戦績サイトを見るのと仕組みは同じです。

Riot Live Client Data API とは

LoLのクライアントが起動している間、PC内部(ローカルホスト)でWebサーバーが立ち上がっており、以下のURLにアクセスするとJSON形式で試合データが取得できます。

[https://127.0.0.1:2999/liveclientdata/allgamedata](https://127.0.0.1:2999/liveclientdata/allgamedata)

本ツールは、PythonでこのURLに定期的にアクセスし、「あ、こいつCS落としたな」と判定して音を鳴らしているだけです。ゲームサーバーへの干渉は一切ありません。

ソースコード全公開

「exeファイルを実行するのはウイルスとか怖くて無理」というエンジニアの方向けに、GitHubでソースコードを完全公開しました。
中身を見ていただければ、怪しい通信を行っていないことが分かります。

GitHubリポジトリ
https://github.com/noraneko3474/lol_coach

実装のポイント(Python)

主要なロジック部分の抜粋です。requests ライブラリでAPIを叩いています。

Python
import requests
import urllib3
import time

# ローカルAPIは自己署名証明書のため、SSL警告を無視する設定が必要
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def get_api_data(endpoint):
    url = f"[https://127.0.0.1:2999/liveclientdata/](https://127.0.0.1:2999/liveclientdata/){endpoint}"
    try:
        # verify=False でSSL検証をスキップ
        response = requests.get(url, verify=False, timeout=2)
        return response.json()
    except:
        return None

# メインループの一部
while True:
    # プレイヤーリストを取得
    data = get_api_data("playerlist")
    
    # 自分のCSを取得して計算
    my_stats = [p for p in data if p["summonerName"] == MY_NAME][0]
    cs = my_stats["scores"]["creepScore"]
    
    # 分間CS (CSPM) の計算
    game_time = get_game_time()
    cspm = cs / (game_time / 60)
    
    # 基準以下なら罵倒する
    if cspm < 6.0:
        play_insult_voice()

誤検知について(VirusTotal等)

Pythonを PyInstaller でexe化すると、Windows Defenderや一部のセキュリティソフトで「トロイの木馬」として誤検知されることがあります(Python製アプリあるあるです)。
もしexe版の警告が不安な方は、上記の GitHubからコードをDLして、Python環境で直接実行 してください。全く同じ動作をします。

配信者・ストリーマーの方へ(Mod機能)

このツール、ただ罵倒されるだけではありません。
「音声ファイルの差し替え(Mod機能)」 に対応させました。

1. 推しの声に変更可能

assets フォルダ内の .wav ファイルを入れ替えるだけで、好きな音声に変更できます。
リスナーから罵倒ボイスを募集して 「リスナーに詰められながらLoLをする参加型配信」 などが可能です。

2. 特定チャンピオン専用ボイス

「ヤスオを使っている時だけ流れるボイス」も作れます。
assets/champion_specific フォルダに以下のルールでファイルを入れるだけです。

Yasuo_trash.wav
Yone_trash.wav
Python
# チャンピオン名を取得(スペース除去)
champ_name = current_champion_name.replace(" ", "")
# 専用ファイルがあるか確認
target_file = f"{champ_name}_trash.wav"

if os.path.exists(target_file):
    play(target_file) # 専用ボイス再生
else:
    play_random_trash() # 汎用罵倒再生

おわりに

「技術の無駄遣い」 と言われるかもしれませんが、こういうツール作りが一番プログラミングを楽しめる瞬間だと思います。
もしバグ報告や、「こんな機能が欲しい」などの要望があれば、X(Twitter)までご連絡ください。

▼ ダウンロード(無料)
https://litton-lab.booth.pm/items/7852304

▼ ソースコード
https://github.com/noraneko3474/lol_coach

▼ 開発者Twitter
https://x.com/Litton_Dev

※本ツールで使用している音声:VOICEVOX:春日部つむぎ

Discussion