【Python】Apex Legends ミックステープの現在のモードを教えてくれるDiscord botコード

プログラミング

Apex Legendsのシーズン16から、アリーナに替わり常設となった「ミックステープ」モード。コントロール・チームデスマッチ・ガンゲームと3種類のモードが15分置きに入れ替わって遊べるモードとなっています。

本記事では、ミックステープで今何のモードをやっているのかを確認する簡単なDiscord botのコードを書いたので公開しています。また、追加でランクのマップ情報、プレデターのボーダーRPを取得するコードも書いています。

スポンサーリンク

ミックステープ情報取得Discord Bot(Python)

非常に簡易的で雑なコードなので使用の際はカスタマイズして使って下さい。
また、APIの仕様が変更されると使えなくなる場合があるので、その際は必ず修正を入れて下さい。

実行環境
python 3.9.12
discord.py 2.3.0a4790+gbb7668f8
requests 2.27.1
# -*- coding: utf-8 -*-
import requests
import time
import datetime
import json
import discord
from discord.ext import commands

# APEX用APIキーとDiscord bot用トークン
# 環境変数として読み込むなり変更してください
API_KEY = 'APEX APIキー'
TOKEN = 'Discord bot用トークン'
# APIリクエスト先
url = 'https://api.mozambiquehe.re/'

# ミックステープ情報取得関数
def get_mix_rotation():
    # マップローテーション version=2指定でミックステープのマップローテーション情報も取れる
    map_url = url + 'maprotation?version=2?'

    # ヘッダー設定
    headers = {"Authorization": API_KEY}

    # リクエストを送信しレスポンスを取得
    try:
        response = requests.get(map_url, headers=headers)
    except requests.exceptions.RequestException as e:
        # リクエストエラー
        mes = f'Requestエラー発生: {e}'
        print(mes)
        return mes

    # レスポンスをJSON形式に変換
    data = json.loads(response.text)

    # mixtapeの情報格納
    mix_rot = data.get('ltm')
    if isinstance(mix_rot, dict):
        # 時刻情報が正しいかどうかだけ確認
        now_timestamp = int(time.time())
        if mix_rot.get('current').get('start') < now_timestamp < mix_rot.get('current').get('end'):
            pass
        else:
            return '取得タイムスタンプが異常です。時刻を正常化し、時間を置いてから再度実行下さい'
    else:
        return 'データが取得できていません。APIの正常性やプログラムエラーを確認してください'
    
    return mix_rot

# ディスコードBot接続準備
intents = discord.Intents().default()
intents.message_content = True
# ディスコードコマンドの接頭辞はcommand_prefixで指定
bot = commands.Bot(command_prefix='!', intents=intents)

# ミックステープ・ローテーション情報を返すコマンド定義
@bot.command(name='mix')
async def send_map_rotation(ctx):
    tmp_data = get_mix_rotation()
    if isinstance(tmp_data, str):
        await ctx.send(tmp_data)
    elif isinstance(tmp_data, dict):
        # 現在のマップ情報を取り出す
        str_mix_current = tmp_data.get('current').get('eventName')
        # 次回のマップ情報を取り出す
        str_mix_next = tmp_data.get('next').get('eventName')
        txt_mix_rotation = f'現在: {str_mix_current}\r\n次回: {str_mix_next}'
        await ctx.send(txt_mix_rotation)

bot.run(TOKEN)

ミックステープのモードは15分毎に3モードが切り替わっていくため、自分がプレイしたい時に何のモードが行われているか起動しないと分からず、コントロールモードだけやりたいのに確認のためだけにApexを起動するのがあまりにも面倒くさかったのでこのコードを書きました。

やりたいモードが決まっていたり、嫌いなモードがあるような人でPythonが使える場合は活用してみてください。

Discordで表示されるモード情報は、

  • Control
  • Gun Run
  • TDM

という表記のままなので、分かりにくい人や日本語表記が良い人は適宜修正ください。またAPIのReteLimitには気をつけることと、エラー多発してるのに放置する等は止めましょう。

コード実行に

  • APIキー発行
  • Discord bot用トークン作成

が必要なので、それぞれに関して以下で簡単に書いていきます。

Apex用情報取得APIキー作成

Apex Legendsの情報取得APIを使用するためには認証が必要となります。以下のAPI PortalでAPIキーを作成した後、更にDiscordでの認証してください。

Discordの認証関係が怖いなら使わない方が良いです。

APIのドキュメントは、以下のサイトになります。メンテナンスか何かは分かりませんが、たまにサーバーエラーで落ちてることもあるので注意。

Discord認証されたらDiscord上で「Verified API User」や「API User」のロールが付いているはずで、私の場合は次の日くらいにAPIリクエストが通るようになっていました。「Verified API User」のロールが着いているにも関わらず数日経ってもリクエストが拒否される場合は、DiscordのアナウンスメントやAPI infoなどで不具合が置きていないか確認して、なければticketで運営に問い合わせしてみてください。

全て英語なので、自分で調べて解決しようという気がない人はやらないほうが良いと思います。

Discord bot用トークン作成

こちらは通常通りDiscord bot用トークンを作成してください。既存のbotに組み込んだりしても問題ありません。

注意点としては、Intent設定は「MESSAGE CONTENT INTENT」を許可しておいてください。これが許可されていないとDiscordでメッセージを打った際にエラーが発生します。

小さくて文字が潰れてたので拡大画像。

これを許可してSaveしておいてください。

Discordでの使い方

Botを設定しているチャンネルで、設定したコマンドを打つと現在のミックステープモードが返ってきます(画像内のコマンドは「!mix」)。

コマンドは、コード中のcommand_prefixで指定した記号が接頭辞となり、デコレータで指定したワードと組み合わせたものになります。本コードでは、

bot = commands.Bot(command_prefix='!', intents=intents)
@bot.command(name='mix')

となっているので、!とmixを組み合わせた

!mix

のコマンドを打つとミックステープモードの情報が返ってくるようになっています。適宜自分の使いやすいコマンドに書き換えて下さい。

また今回利用しているAPIでは、ミックステープモードだけでなく、ランクのマップや、プレデターのRP(ランクポイント)のしきい値なども取得できるため、それらのコードも載せておきます。各関数でコマンドをデコレータで指定すれば対応したコマンドを打つだけで必要な情報が返ってきます。

ランクのマップローテーションを取得する関数

# ランク情報取得関数
def get_rank_rotation():
    # マップローテーション
    map_url = url + 'maprotation?version=2?'

    # ヘッダー設定
    headers = {"Authorization": API_KEY}

    # リクエストを送信しレスポンスを取得
    try:
        response = requests.get(map_url, headers=headers)
    except requests.exceptions.RequestException as e:
        # リクエストエラー
        mes = f'Requestエラー発生: {e}'
        print(mes)
        return mes
    
    # レスポンスをJSON形式に変換
    data = json.loads(response.text)

    # Rankマップの情報格納
    rank_rot = data.get('ranked')
    if isinstance(rank_rot, dict):
        # 時刻情報が正しいかどうかだけ確認
        now_timestamp = int(time.time())
        if rank_rot.get('current').get('start') < now_timestamp < rank_rot.get('current').get('end'):
            pass
        else:
            return '取得タイムスタンプが異常です。時刻を正常化し、時間を置いてから再度実行下さい'
    else:
        return 'データが取得できていません。APIの正常性やプログラムエラーを確認してください'
    
    return rank_rot

# ランクのマップ情報を返すコマンド定義
@bot.command(name='rank')
async def send_rank_rotation(ctx):
    tmp_data = get_rank_rotation()
    if isinstance(tmp_data, str):
        await ctx.send(tmp_data)
    elif isinstance(tmp_data, dict):
        # 現在のマップ情報を取り出す
        str_map_current = tmp_data.get('current').get('map')
        # 次回のマップ情報を取り出す
        str_map_next = tmp_data.get('next').get('map')
        txt_rank_rotation = f'現在: {str_map_current}\r\n次回: {str_map_next}'
        await ctx.send(txt_rank_rotation)

現在と次回のマップ情報(ランク)を取得して表示するようにしています。

ランクだけでなくカジュアル情報も取れますので、興味のある方は取ってきた情報を表示してみて必要なものを表示するように変更下さい。

プレデターのRPしきい値を取得する関数

# プレデター情報取得関数
def get_predator_info():
    # プレデター情報
    pre_url = url + 'predator?'

    # ヘッダー設定
    headers = {"Authorization": API_KEY}

    # リクエストを送信しレスポンスを取得
    try:
        response = requests.get(pre_url, headers=headers)
    except requests.exceptions.RequestException as e:
        # リクエストエラー
        mes = f'Requestエラー発生: {e}'
        print(mes)
        return mes

    # レスポンスをJSON形式に変換
    data = json.loads(response.text)

    # Predator情報の格納
    pre_rot = data.get('RP')
    if isinstance(pre_rot, dict):
        # 時刻情報が正しいかどうかだけ確認
        now_timestamp = int(time.time())
        if pre_rot.get('PC').get('updateTimestamp') < now_timestamp + 1:
            pass
        else:
            return '取得タイムスタンプが異常です。時刻を正常化し、時間を置いてから再度実行下さい'
    else:
        return 'データが取得できていません。APIの正常性やプログラムエラーを確認してください'
    
    return pre_rot

# プレデターのRPボーダー情報を返すコマンド定義
@bot.command(name='pre')
async def send_predator_info(ctx):
    tmp_data = get_predator_info()
    if isinstance(tmp_data, str):
        await ctx.send(tmp_data)
    elif isinstance(tmp_data, dict):
        # プレデターのボーダーRP情報を取り出す 本コードではPC版指定
        val_threshold = tmp_data.get('PC').get('val')
        txt_pre_info = f'ボーダーは {val_threshold} RPです。'
        await ctx.send(txt_pre_info)

プレデターのボーダーRPを表示するようになっています。各プラットフォームのボーダー情報を取得できますが、本コードではPC版の情報を表示するようにしています。適宜必要なプラットフォームに書き換えて下さい。

また、プレデター情報の中にはマスター以上の人数情報が含まれています。興味がある人は見てみて下さい。

以上、Apex Legendsの各種情報取得APIを用いた、ミックステープモード情報を教えてくれるDiscord Bot,及びランクマップ、プレデターのRPしきい値を取得する追加コードとなります。

Apex Legends API Portal

コメント

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