Конвертируем SteamID и SteamInvite на PHP

Конвертируем SteamID

В этой статье я расскажу, как можно конвертировать между собой все виды SteamID, а также получать SteamID из пригласительных ссылок или наоборот – генерировать их. Это может быть полезно для сайтов игровых серверов или для разработки динамических MOTD для серверов на движке Source.

Какие бывают виды SteamID пользователей

  • Steam 2 ID, его еще часто называют SteamID 32, выглядит так: STEAM_1:1:125018747
  • Steam 3 ID, выглядит так: [U:1:250037495]
  • SteamID, он же UInt64, он же SteamID 64, выглядит так: 76561198210303223 и по нему можно найти профиль пользователя, подставив в ссылку, например: https://steamcommunity.com/profiles/76561198210303223

Ссылки-приглашения

В Steam существуют ссылки-приглашения или быстрые приглашения, позволяющие мгновенно добавить в друзья того, кто перешел по этой ссылке. Выглядят они так: https://s.team/p/vvk-ggwk/FBWQQDJB. Есть также более длинная версия таких ссылок: https://steamcommunity.com/user/vvk-ggwk/FBWQQDJB

Последняя часть ссылки временная и может быть использована лишь 1 раз. А вот предпоследняя часть ссылки является закодированным в HEX вашим SteamID, поэтому ссылка без последней части всегда будет вести на ваш профиль. Например эта короткая ссылка ведет на мой профиль: https://s.team/p/vvk-ggwk

Эти ссылки вы можете создавать на этой странице. Там же вы найдете “код для друга”, который является не чем иным, как вашим AccountID.

Конвертируем SteamID и SteamInvite

Для этого нам потребуется библиотека в виде всего одного файла. Если у вас PHP 8, скачайте этот файл и загрузите к себе на сайт, например в папку inc или lib. Если же у вас PHP 7.3 или 7.4, скачайте более старую версию файла.

Подключаем библиотеку в ваш PHP скрипт:

require __DIR__ . '/inc/SteamID.php';

Создаем переменную с любым известным вам SteamID и экземпляр класса:

$sid = 'STEAM_1:1:125018747';
$s = new SteamID($sid);

Теперь мы можем получать конвертированные данные.

Получить Steam 2 ID (SteamID32):

echo $s->RenderSteam2();

Обратите внимание: эта функция вернет вам SteamID следующего вида: STEAM_1:1:125018747. Но в старых играх, таких как Garry’s Mod или Counter Strike, ваш SteamID может начинаться на STEAM_0, а не на STEAM_1 и корректный SteamID32, например для Garry’s Mod, в моем случае выглядит так: STEAM_0:1:125018747. Если вы столкнулись с той же проблемой, то для ее решения вам нужно лишь добавить одну строчку перед получением Steam2:

$s->SetAccountUniverse(0);
echo $s->RenderSteam2();

Получить Steam 3 ID:

echo $s->RenderSteam3();

Получить SteamID (SteamID 64):

echo $s->ConvertToUInt64();

Получить AccountID:

echo $s->GetAccountID();

Получить SteamInvite (короткую ссылку на профиль):

echo 'http://s.team/p/'.$s->RenderSteamInvite();

Получить код приглашения друга в CS: GO:

echo $s->RenderCsgoFriendCode();

Как видите, здесь все просто. Однако, я рекомендую оборачивать функции в try … catch во избежание проблем, особенно, если вы не контролируете ввод. Это может выглядеть примерно так:

$sid = 'STEAM_1:1:125018747';
$s = new SteamID($sid);
try {
	$sid32 = $s->RenderSteam2();
	// далее ваш код
}
catch(InvalidArgumentException $e) {
	// тут можно обработать ошибку
}

Если из всего перечисленного в статье вам, как и мне, требуется лишь получать SteamID32 и SteamID64, вы можете подключить библиотеку в файле ваших функций и создать там для себя 2 функции, которые будете дальше использовать на вашем сайте и в которые будете передавать известный SteamID:

function GetSteamID32($sid) {
	$s = new SteamID($sid);
	try {
		//$s->SetAccountUniverse(0); // для старых игр
		$sid32 = $s->RenderSteam2();
		return $sid32;
	}
	catch(InvalidArgumentException $e) {
		return false;
	}
}

function GetSteamID64($sid) {
	$s = new SteamID($sid);
	try {
		$sid64 = $s->ConvertToUInt64();
		return $sid64;
	}
	catch(InvalidArgumentException $e) {
		return false;
	}
}

Библиотека имеет и другие функции, ознакомиться с ними вы можете на GitHub проекта. Обратите внимание на VanityURLs.php, его функции способны парсить любой ввод, будь то SteamID или ссылка на профиль или что-то еще. Мне это не понадобилось, но может быть будет интересно вам.