Документація Steamworks
Інтерфейс ICheatReportingService
Ця служба дозволяє вашій грі повідомляти про чіти й чітерів до системи VAC, а також надає набори інструментів системи ігрових блокувань. Вона активує два незалежних рішення для виявлення і вживання заходів стосовно чітерства у вашій грі:
  • Збір повідомлень спільноти про чітерство й надсилання запитів на блокування/відсторонення на основі цієї інформації.
  • Надсилання докладної інформації про відомі чітерські програми до системи VAC. Після передання цю інформацію буде використано для автоматичного виявлення і блокування гравців, які використовують відомі чіти.

Для користування цим інтерфейсом вам спершу потрібно підключити підтримку VAC. Це можна зробити на сторінці конфігурації античіту на панелі адміністрування застосунку.

ПРИМІТКА: це службовий інтерфейс. Методи в цьому інтерфейсі викликаються з параметром input_json.

Докладнішу інформацію про використання веб-API Steamworks можна знайти тут.

ReportPlayerCheating

POST https://partner.steam-api.com/ICheatReportingService/ReportPlayerCheating/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача, про чітерство якого надсилається інформація.
appiduint32AppID гри.
steamidreporteruint64(Необов’язково) SteamID користувача чи ігрового сервера, що повідомляють про чітерство.
appdatauint64(Необов’язково) Дані про вказаний розробником тип чіту для цього застосунку (наприклад: 1 = Aimbot, 2 = Wallhack, 3 = Griefing).
heuristicbool(Необов’язково) Додаткова інформація про джерело чітерства — евристичний аналіз.
detectionbool(Необов’язково) Додаткова інформація про джерело чітерства — виявлення.
playerreportbool(Необов’язково) Додаткова інформація про джерело чітерства — скарга користувача.
noreportidbool(Необов’язково) Не повертає reportid. Потрібно передавати, лише якщо ви не плануєте застосовувати блокування на основі цієї скарги.
gamemodeuint32(Необов’язково) Додаткова інформація про стан гри — особливий тип ігроладу чи ігрового режиму (0 = універсальний).
suspicionstarttimeuint32(Необов’язково) Додаткова інформація про час, коли гра вперше запідозрила користувача в чітерстві. Час у форматі UNIX (з 1 січня 1970 року).
severityuint32(Необов’язково) Рівень серйозності порушення, про яке повідомляється. Шкала встановлюється розробником.

ReportPlayerCheating розроблено для збирання скарг спільноти на чітерство, де один гравець може поскаржитися в грі на іншого.

Призначається для ненадійних даних від користувачів у грі (напівнадійні джерела). Внутрішній сервер, який повідомляє дані, має переконатися в авторизації обох сторін, але самі дані розглядаються як ненадійні. Можна використовувати необов’язкові параметри для кодування підозрюваного типу чітерства чи додаткових доказів (ідентифікатор, що вказує матч чи демоверсію для подальшої перевірки).

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

RequestPlayerGameBan

POST https://partner.steam-api.com/ICheatReportingService/RequestPlayerGameBan/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача, про чітерство якого надсилається інформація.
appiduint32AppID гри.
reportiduint64Початково використаний для повідомлення про чітерство reportid.
cheatdescriptionstringОпис чітерства.
durationuint32Тривалість запитів на блокування в секундах (значення 0 накладе безкінечне блокування, тривалість зі значенням менше року призведе до тимчасового блокування й не показуватиметься в профілі).
delaybanboolВідкладає блокування відповідно до стандартних правил блокування.
flagsuint32Додаткова інформація про запит на блокування (не використовується).

Надсилає запит на ігрове блокування певного користувача.

Створено для використання після перевірки випадків із ICheatReportingService/ReportPlayerCheating та підтвердження чітерства.

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

RemovePlayerGameBan

POST https://partner.steam-api.com/ICheatReportingService/RemovePlayerGameBan/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача, з якого слід зняти ігрове блокування.
appiduint32AppID гри.

Вилучає ігрове блокування користувача.

Використовується у випадках, коли ігрове блокування виявилося хибним.

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

GetCheatingReports

GET https://partner.steam-api.com/ICheatReportingService/GetCheatingReports/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
appiduint32AppID гри.
timeenduint32Кінець часового діапазону. Час у форматі UNIX (з 1 січня 1970 року).
timebeginuint32Початок часового діапазону. Час у форматі UNIX (з 1 січня 1970 року).
reportidminuint64Мінімальна кількість reportID для включення (можна передати 0 до кінця попереднього періоду повідомлень).
includereportsbool(Необов’язково) Включає скарги. Якщо значення false, то параметр includebans повинен мати значення true.
includebansbool(Необов’язково) Включає запити на блокування. Якщо значення false, то параметр includereports повинен мати значення true.
steamiduint64(Необов’язково) Запит лише цього SteamID.

Отримує список повідомлень про чітерство для цього застосунку.

Використовується для збирання повідомлень про чітерство, щоби їх можна було перевірити і прийняти рішення.

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

ReportCheatData

POST https://api.steampowered.com/ICheatReportingService/ReportCheatData/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації користувача.
steamiduint64SteamID користувача, що використовує чіт і повідомляє про нього.
appiduint32AppID гри.
pathandfilenamestringШлях і назва файлу програми-чіта.
webcheaturlstringURL-адреса, за якою чіт було знайдено та завантажено.
time_nowuint64Час локальної системи зараз. 64-бітний системний час Windows.
time_starteduint64Час локальної системи в момент початку використання чіта (0, якщо програму ще не запущено). 64-бітний системний час Windows.
time_stoppeduint64Час локальної системи в момент припинення роботи чіта (0, якщо програма ще працює). 64-бітний системний час Windows.
cheatnamestringОписова назва чіта.
game_process_iduint32ID процесу запущеної гри.
cheat_process_iduint32ID процесу запущеного чіта.
cheat_param_1uint64Додаткові дані про чіт.
cheat_param_2uint64Додаткові дані про чіт.

Повідомляє дані про чіт. Слід використовувати лише на тестовому акаунті, на якому запушено гру, але не в багатокористувацьких сеансах.

Призначено для повідомлення конкретних чітів до системи VAC. Працює шляхом запуску гри й чіта з подальшим викликом цього веб-API.
ПРИМІТКА: через це тестовий акаунт потрібно використовувати лише на недорогому комп’ютері за межами вашої мережі. Також необхідно використовувати стандартний ключ веб-API, отриманий на сайті https://steamcommunity.com/developer для цього тестового акаунта, а не ключ веб-API партнера. Після виклику функції систему слід лишити в режимі бездіяльності щонайменше на півгодини, аби VAC міг повністю просканувати систему. Тестовий акаунт буде позначено й не допущено до автентифікації для багатокористувацьких ігор у майбутньому. Через це переконайтеся, що завжди використовуєте тестовий акаунт, призначений виключно для надсилання повідомлень про чіти.

Якщо виклик не повернув результатів, то повідомлення ігнорується.

Приклад виклику:
# потрібен python версії 2.7 import sys, os, time if sys.version_info >= ( 2, 7 ): # імпорт argparse print "Виявлено python версії 2.7 або новішої" else: print "Потрібен python версії 2.7 або новішої" exit() import urllib import urllib2 import json g_mapUniverseToWebapiServer = { 'public' : { 'host' : 'api.steampowered.com', 'port_http' : 80, 'port_https' : 443, }, } g_bReadied = False # підготовка надсилання запитів до веб-API def readyAPIRequest( universe ): global g_bReadied # якщо потрібен проксі-сервер, вмикайте його тут # УВАГА: не рекомендується використовувати у власній локальній мережі # інакше ви запускатимете чіти всередині своєї локальної мережі proxyneeded = 0 if proxyneeded == 1: urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( {"http":"http://proxy.valvesoftware.com:80"} ) ) ) else: urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler({}) ) ) g_bReadied = True # виконання запиту веб-API — очікується відповідь у форматі JSON # # необхідно передати # universe — рядок # interface — інтерфейс, який ви викликаєте # request — назва методу # # необов’язкові параметри # method — GET або PUT # protocol — http або https # version — стандартно 0001 # timeout — стандартно 120 # # інші надані ключові аргументи використовуються як параметри веб-API; наприклад, використання # ключа веб-API, 'key=0123456' def issueWebAPIRequest( universe=None, interface=None, request=None, method='GET', protocol='http', version='0001', timeout=120, **kwargs ): if not universe or not request or not interface: raise NameError( 'Need universe, interface, and request' ) if not g_bReadied: raise RuntimeError( 'call readyAPIRequest first to ensure the proxy is set' ) entry = g_mapUniverseToWebapiServer[ universe ] server = entry[ 'host' ] port = entry[ 'port_' + protocol ] url = '%s://%s:%s/%s/%s/v%s/' % ( protocol, server, port, interface, request, version ) if method == 'GET': sep = '?' for kw in kwargs: url = url + sep + kw + '=' + str( kwargs[ kw ] ) sep = '&' rf = urllib2.urlopen( url, timeout=timeout ) else: rf = urllib2.urlopen( url, urllib.urlencode( kwargs ), timeout=timeout ) return json.load( rf ) def sendcheatreport(): readyAPIRequest( 'public' ) print "Current time is ",int(time.time()) # заповніть стандартними значеннями # SteamID має виглядати як 7XXXXXXXXXXXXXXX steamid = 0 # ключ має бути шістнадцятковим рядком key = '' # заповність номер свого AppID gameappid = 0 # ініціалізація змінних cheatprocid = 0 timecheatran = 0 cheatterminated = 0 timecheatstopped = 0 if steamid == 0: steamid = raw_input( 'Input steam ID: ' ) if not key: key = raw_input( 'Input web api key: ' ) if gameappid == 0: gameappid = raw_input( 'Input game appid: ' ) cheatnamestring = raw_input( 'Input cheat descriptive name: ' ) cheatpathstring = raw_input( 'Input full path to cheat file: ' ) webcheaturlstring = raw_input( 'Input full URL to cheat download page (optional): ' ) cheatfiletype = int(raw_input( 'Input 1 if .exe or input 2 if other file type: ' )) if cheatfiletype == 1: cheatprocid = raw_input( 'Input cheat process id (Input 0 if stopped or unsure): ' ) timecheatran = int(time.time()) cheatterminated = int(raw_input( 'Input 1 if cheat is still running or input 0 if it has stopped: ' )) timecheatstopped = int(time.time()) if cheatterminated == 1: timecheatstopped = 0 gameprocid = raw_input( 'Input game process id: ' ) print "sending webapi data now " print "steamid: ", steamid print "key: ", key print "appid: ", appid print "cheatnamestring: ", cheatnamestring print "cheatpathstring: ", cheatpathstring print "webcheaturlstring: ", webcheaturlstring print "cheatprocid: ", cheatprocid print "timecheatran: ", timecheatran print "timecheatstopped: ", timecheatstopped print "gameprocid: ", gameprocid # готово! results = issueWebAPIRequest( universe='public', interface='icheatreportingservice', request='reportcheatdata', key=key, protocol='https', method='POST', cheatname=cheatnamestring, appid=gameappid, game_process_id=gameprocid, cheat_process_id=cheatprocid, pathandfilename=cheatpathstring, webcheaturl=webcheaturlstring, time_now=int(time.time()), time_started=timecheatran, time_stopped=timecheatstopped, steamid=steamid ) print "webapi results:", results # очищення def main(): sendcheatreport() if __name__ == '__main__': main()

RequestVacStatusForUser

POST https://partner.steam-api.com/ICheatReportingService/RequestVacStatusForUser/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача.
appiduint32AppID гри, у яку грає користувач.
session_iduint64ID сеансу, отриманий із виклику ICheatReportingService/StartSecureMultiplayerSession.

Перевіряє стан блокування VAC користувача й підтверджує стан сеансу VAC користувача. Якщо підтвердження не станеться, то користувач не буде допущений до пошуку матчів на захищеному ігровому сервері.

Використовується до того, як користувач почне пошук матчів чи приєднається до гри. Якщо гравець якось заблокував VAC і VAC не може відсканувати комп’ютер на чіти, то результатом буде success = true та session_verified = false. Перевірка цього веб-API дозволить вам уникнути ситуації, за якої користувач спочатку допускається до пошуку матчів чи приєднується до сервера та незабаром виганяється за допомогою VAC (через результат k_EAuthSessionResponseVACCheckTimedOut зі зворотного виклику автентифікації). Система VAC не завжди має час повністю визначити, чи система клієнта співпрацює, і в таких випадках буде результат success = false. Також система гравця може пройти початкову перевірку, але не дати відповідь пізніше. У цьому випадку перевірка буде успішною, але k_EAuthSessionResponseVACCheckTimedOut відбудеться пізніше.


ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

Сеанси веб-API

ПРИМІТКА: для ігор із впровадженою автентифікацією Steam не варто використовувати наведені нижче виклики API. Ці ігри натомість мають використовувати налаштування однорангового інтерфейсу ISteamUser або ігрових серверів. Співробітники Valve мають вручну надати доступ до цього набору викликів, які можна використовувати лише в іграх, котрі виконують автентифікацію користувача повністю незалежно від Steam.

StartSecureMultiplayerSession

POST https://partner.steam-api.com/ICheatReportingService/StartSecureMultiplayerSession/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача.
appiduint32AppID гри.

Повідомляє серверам VAC, що почався захищений багатокористувацький сеанс.

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

EndSecureMultiplayerSession

POST https://partner.steam-api.com/ICheatReportingService/EndSecureMultiplayerSession/v1/
НазваТипОбов’язковоОпис
keystringКлюч веб-API Steamworks для автентифікації видавця.
steamiduint64SteamID користувача.
appiduint32AppID гри.
session_iduint64ID сеансу, отриманий із виклику ICheatReportingService/StartSecureMultiplayerSession.

Повідомляє серверам VAC, що закінчився захищений багатокористувацький сеанс.

ПРИМІТКА: для цього виклику необхідний API-ключ видавця. Тому цей API ОБОВ’ЯЗКОВО викликати із захищеного сервера й за жодних умов не допускати його використання клієнтами!

Відповідь:
[
{
"name": "success",
"type": "bool",
"description": ""
}
]