|
1 | 1 | <h1>ICheatReportingService Interface</h1> |
2 | | -This service allows your game to report cheats and cheaters to the |
3 | | -<a href="/doc/features/anticheat#VAC">VAC</a> system and provides the toolset behind the |
4 | | -<a href="/doc/features/anticheat#GameBans">Game Bans</a> system. It enables two independent |
5 | | -workflows for detecting and managing cheating in your game:<br /> |
| 2 | +This service allows you to report cheating incidents and ban players from your game using the |
| 3 | +<a href="/doc/features/anticheat#GameBans">Game Bans</a> system. It enables two similar workflows |
| 4 | +for detecting and managing cheating in your game:<br /> |
6 | 5 | <ul> |
7 | 6 | <li> |
8 | | - Gather community reports of cheating and request bans/suspensions based upon this |
| 7 | + Gather community reports of cheating and issue bans/suspensions based upon this |
9 | 8 | information.<br /> |
10 | 9 | </li> |
11 | 10 | <li> |
12 | | - Submit detailed information about known cheat software to the VAC system. Once processed, |
13 | | - this information will be used to automatically detect and ban players using known cheats. |
| 11 | + Immediately ban a player with a 2 step process of reporting the cheating and then issuing a |
| 12 | + ban. |
14 | 13 | </li> |
15 | 14 | </ul> |
16 | 15 | <br /> |
17 | | -To use this interface you must first opt in to VAC support. This can be done from the |
| 16 | +To use this interface you must first opt in to anti-cheat support. When enabling anti-cheat support |
| 17 | +you may choose a 3rd party to grant access to the ICheatReportingService interface for your |
| 18 | +application. This can be done from the |
18 | 19 | <a href="/apps/vac/" target="_blank" rel="noreferrer">Anti-Cheat Configuration</a> page in the App |
19 | 20 | Admin panel.<br /> |
20 | 21 | <br /> |
@@ -332,175 +333,6 @@ <h2 class="bb_section"><a name="GetCheatingReports"></a>GetCheatingReports</h2> |
332 | 333 | <br /> |
333 | 334 | <strong>NOTE:</strong> This call requires a publisher API key to use this method. As such this API |
334 | 335 | <strong>MUST</strong> be called from a secure server, and can never be used directly by clients! |
335 | | -<h2 class="bb_section"><a name="ReportCheatData"></a>ReportCheatData</h2> |
336 | | -<div class="bb_code http"> |
337 | | - POST https://api.steampowered.com/ICheatReportingService/ReportCheatData/v1/ |
338 | | -</div> |
339 | | -<table> |
340 | | - <tbody> |
341 | | - <tr> |
342 | | - <th>Name</th> |
343 | | - <th>Type</th> |
344 | | - <th>Required</th> |
345 | | - <th>Description</th> |
346 | | - </tr> |
347 | | - <tr> |
348 | | - <td><strong>key</strong></td> |
349 | | - <td>string</td> |
350 | | - <td>✔</td> |
351 | | - <td>Steamworks Web API user authentication key.</td> |
352 | | - </tr> |
353 | | - <tr> |
354 | | - <td><strong>steamid</strong></td> |
355 | | - <td>uint64</td> |
356 | | - <td>✔</td> |
357 | | - <td>Steam ID of the user running and reporting the cheat.</td> |
358 | | - </tr> |
359 | | - <tr> |
360 | | - <td><strong>appid</strong></td> |
361 | | - <td>uint32</td> |
362 | | - <td>✔</td> |
363 | | - <td>The App ID of the game.</td> |
364 | | - </tr> |
365 | | - <tr> |
366 | | - <td><strong>pathandfilename</strong></td> |
367 | | - <td>string</td> |
368 | | - <td>✔</td> |
369 | | - <td>Path and file name of the cheat executable.</td> |
370 | | - </tr> |
371 | | - <tr> |
372 | | - <td><strong>webcheaturl</strong></td> |
373 | | - <td>string</td> |
374 | | - <td>✔</td> |
375 | | - <td>Web url where the cheat was found and downloaded.</td> |
376 | | - </tr> |
377 | | - <tr> |
378 | | - <td><strong>time_now</strong></td> |
379 | | - <td>uint64</td> |
380 | | - <td>✔</td> |
381 | | - <td>Local system time now. 64 bit windows system time.</td> |
382 | | - </tr> |
383 | | - <tr> |
384 | | - <td><strong>time_started</strong></td> |
385 | | - <td>uint64</td> |
386 | | - <td>✔</td> |
387 | | - <td> |
388 | | - Local system time when cheat process started. ( 0 if not yet run ) 64 bit windows |
389 | | - system time. |
390 | | - </td> |
391 | | - </tr> |
392 | | - <tr> |
393 | | - <td><strong>time_stopped</strong></td> |
394 | | - <td>uint64</td> |
395 | | - <td>✔</td> |
396 | | - <td> |
397 | | - Local system time when cheat process stopped. ( 0 if still running ) 64 bit windows |
398 | | - system time. |
399 | | - </td> |
400 | | - </tr> |
401 | | - <tr> |
402 | | - <td><strong>cheatname</strong></td> |
403 | | - <td>string</td> |
404 | | - <td>✔</td> |
405 | | - <td>Descriptive name for the cheat.</td> |
406 | | - </tr> |
407 | | - <tr> |
408 | | - <td><strong>game_process_id</strong></td> |
409 | | - <td>uint32</td> |
410 | | - <td>✔</td> |
411 | | - <td>Process ID of the running game.</td> |
412 | | - </tr> |
413 | | - <tr> |
414 | | - <td><strong>cheat_process_id</strong></td> |
415 | | - <td>uint32</td> |
416 | | - <td>✔</td> |
417 | | - <td>Process ID of the cheat process that ran.</td> |
418 | | - </tr> |
419 | | - <tr> |
420 | | - <td><strong>cheat_param_1</strong></td> |
421 | | - <td>uint64</td> |
422 | | - <td>✔</td> |
423 | | - <td>Extra cheat data.</td> |
424 | | - </tr> |
425 | | - <tr> |
426 | | - <td><strong>cheat_param_2</strong></td> |
427 | | - <td>uint64</td> |
428 | | - <td>✔</td> |
429 | | - <td>Extra cheat data.</td> |
430 | | - </tr> |
431 | | - </tbody> |
432 | | -</table> |
433 | | -<br /> |
434 | | -Reports cheat data. Only use on test account that is running the game but not in a multiplayer |
435 | | -session.<br /> |
436 | | -<br /> |
437 | | -This is for reporting specific cheats to the VAC system. This is done by running the cheat and the |
438 | | -game and then calling this webapi. |
439 | | -<div class="bb_callout bb_red bb_fixed"> |
440 | | - <div> |
441 | | - <strong>NOTE:</strong> Because of this you should only use a test account on a disposable |
442 | | - machine outside your network. You must also use a standard Web API key obtained from |
443 | | - <a href="https://steamcommunity.com/developer" target="_blank" rel="noreferrer" |
444 | | - >https://steamcommunity.com/developer</a |
445 | | - > |
446 | | - for that test account, not a partner Web API key. After calling this, the system should be |
447 | | - left idle for at least a half an hour so that VAC may fully scan the system. The test |
448 | | - account will be flagged and not allowed to authenticate into multiplayer games in the |
449 | | - future, so be sure to always use a test account that is for cheat reporting only. |
450 | | - </div> |
451 | | -</div> |
452 | | -<br /> |
453 | | -If the call does not report success, then the report has been ignored.<br /> |
454 | | -<br /> |
455 | | -<strong>Calling Example:</strong><br /> |
456 | | -<div class="bb_code"> |
457 | | - # requires python 2.7 import sys, os, time if sys.version_info >= ( 2, 7 ): # import argparse |
458 | | - print "Found python 2.7 or greater" else: print "Must use python 2.7 or greater" exit() import |
459 | | - urllib import urllib2 import json g_mapUniverseToWebapiServer = { 'public' : { 'host' : |
460 | | - 'api.steampowered.com', 'port_http' : 80, 'port_https' : 443, }, } g_bReadied = False # get |
461 | | - ready to issue webapi requests def readyAPIRequest( universe ): global g_bReadied # if proxy is |
462 | | - needed enable here # WARNING: it is not recommended to use this from inside your LAN # because |
463 | | - that would mean you are running cheats inside your LAN proxyneeded = 0 if proxyneeded == 1: |
464 | | - urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( |
465 | | - {"http":"http://proxy.valvesoftware.com:80"} ) ) ) else: urllib2.install_opener( |
466 | | - urllib2.build_opener( urllib2.ProxyHandler({}) ) ) g_bReadied = True # perform a webapi request |
467 | | - - currently assumes response is JSON # # you must pass # universe - string # interface - which |
468 | | - interface are you calling # request - the name of the method # # optional parameters # method - |
469 | | - GET or PUT # protocol - http or https # version - defaults to 0001 # timeout - defaults to 120 # |
470 | | - # other keyword arguments supplied are used as parameters to the webapi; e.g. to use # a webapi |
471 | | - key, 'key=0123456' def issueWebAPIRequest( universe=None, interface=None, request=None, |
472 | | - method='GET', protocol='http', version='0001', timeout=120, **kwargs ): if not universe or not |
473 | | - request or not interface: raise NameError( 'Need universe, interface, and request' ) if not |
474 | | - g_bReadied: raise RuntimeError( 'call readyAPIRequest first to ensure the proxy is set' ) entry |
475 | | - = g_mapUniverseToWebapiServer[ universe ] server = entry[ 'host' ] port = entry[ 'port_' + |
476 | | - protocol ] url = '%s://%s:%s/%s/%s/v%s/' % ( protocol, server, port, interface, request, version |
477 | | - ) if method == 'GET': sep = '?' for kw in kwargs: url = url + sep + kw + '=' + str( kwargs[ kw ] |
478 | | - ) sep = '&' rf = urllib2.urlopen( url, timeout=timeout ) else: rf = urllib2.urlopen( url, |
479 | | - urllib.urlencode( kwargs ), timeout=timeout ) return json.load( rf ) def sendcheatreport(): |
480 | | - readyAPIRequest( 'public' ) print "Current time is ",int(time.time()) # fill in defaults # |
481 | | - steamid should look like 7XXXXXXXXXXXXXXX steamid = 0 # key should be a hex string key = '' # |
482 | | - fill in your appid gameappid = 0 # init vars cheatprocid = 0 timecheatran = 0 cheatterminated = |
483 | | - 0 timecheatstopped = 0 if steamid == 0: steamid = raw_input( 'Input steam ID: ' ) if not key: |
484 | | - key = raw_input( 'Input web api key: ' ) if gameappid == 0: gameappid = raw_input( 'Input game |
485 | | - appid: ' ) cheatnamestring = raw_input( 'Input cheat descriptive name: ' ) cheatpathstring = |
486 | | - raw_input( 'Input full path to cheat file: ' ) webcheaturlstring = raw_input( 'Input full URL to |
487 | | - cheat download page (optional): ' ) cheatfiletype = int(raw_input( 'Input 1 if .exe or input 2 |
488 | | - if other file type: ' )) if cheatfiletype == 1: cheatprocid = raw_input( 'Input cheat process id |
489 | | - (Input 0 if stopped or unsure): ' ) timecheatran = int(time.time()) cheatterminated = |
490 | | - int(raw_input( 'Input 1 if cheat is still running or input 0 if it has stopped: ' )) |
491 | | - timecheatstopped = int(time.time()) if cheatterminated == 1: timecheatstopped = 0 gameprocid = |
492 | | - raw_input( 'Input game process id: ' ) print "sending webapi data now " print "steamid: ", |
493 | | - steamid print "key: ", key print "gameappid: ", gameappid print "cheatnamestring: ", |
494 | | - cheatnamestring print "cheatpathstring: ", cheatpathstring print "webcheaturlstring: ", |
495 | | - webcheaturlstring print "cheatprocid: ", cheatprocid print "timecheatran: ", timecheatran print |
496 | | - "timecheatstopped: ", timecheatstopped print "gameprocid: ", gameprocid # ready to go! results = |
497 | | - issueWebAPIRequest( universe='public', interface='icheatreportingservice', |
498 | | - request='reportcheatdata', key=key, protocol='https', method='POST', cheatname=cheatnamestring, |
499 | | - appid=gameappid, game_process_id=gameprocid, cheat_process_id=cheatprocid, |
500 | | - pathandfilename=cheatpathstring, webcheaturl=webcheaturlstring, time_now=int(time.time()), |
501 | | - time_started=timecheatran, time_stopped=timecheatstopped, steamid=steamid ) print "webapi |
502 | | - results:", results # clean up def main(): sendcheatreport() if __name__ == '__main__': main() |
503 | | -</div> |
504 | 336 | <h2 class="bb_section"><a name="RequestVacStatusForUser"></a>RequestVacStatusForUser</h2> |
505 | 337 | <div class="bb_code http"> |
506 | 338 | POST https://partner.steam-api.com/ICheatReportingService/RequestVacStatusForUser/v1/ |
|
0 commit comments