Difference between revisions of "Web API"
(→Request: yes, that is the final server release, see https://server.xaseco.org/versions.php) |
(→Basic concepts: Completed the request header) |
||
Line 3: | Line 3: | ||
== Basic concepts == | == Basic concepts == | ||
− | TrackMania uses a XML-RPC based | + | TrackMania uses a XML-RPC based protocol to authenticate players, load server lists, load rankings, etc. Below is some documentation about what has been reversed engineered. A lot is still left to be documented, as logged on the [[Web_API/Progress|Progress]] page. |
− | The | + | The client sends HTTP(S) POST requests to |
* [http://game.trackmaniaforever.com/online_game/request.php http://game.trackmaniaforever.com/online_game/request.php] | * [http://game.trackmaniaforever.com/online_game/request.php http://game.trackmaniaforever.com/online_game/request.php] | ||
* [http://game2.trackmaniaforever.com/online_game/request.php http://game2.trackmaniaforever.com/online_game/request.php] | * [http://game2.trackmaniaforever.com/online_game/request.php http://game2.trackmaniaforever.com/online_game/request.php] | ||
* [http://nations.trackmaniaforever.com/online_game/request.php http://nations.trackmaniaforever.com/online_game/request.php] | * [http://nations.trackmaniaforever.com/online_game/request.php http://nations.trackmaniaforever.com/online_game/request.php] | ||
− | to communicate with the | + | to communicate with the master server, using the headers: |
+ | User-Agent: GameBox | ||
+ | Accept: */* | ||
+ | Content-Type: application/binary | ||
+ | Connection: Keep-Alive | ||
+ | Pragma: no-cache | ||
− | === Request === | + | === Request body === |
<pre> | <pre> | ||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Line 20: | Line 25: | ||
<distro>MOLUX</distro> | <distro>MOLUX</distro> | ||
<lang>fr</lang> | <lang>fr</lang> | ||
− | <sd>2011-02-21</sd> <!-- Only sent by server, see below --> | + | <sd>2011-02-21</sd> <!-- Only sent by dedicated server, see below --> |
</game> | </game> | ||
<author> | <author> | ||
Line 43: | Line 48: | ||
*** '''name''' The client you are using. Known values: TmForever | *** '''name''' The client you are using. Known values: TmForever | ||
*** '''version''' Version of the client. | *** '''version''' Version of the client. | ||
− | *** '''distro''' | + | *** '''distro''' Software distribution. E.g. MOLUX for TMNF or ORTIC for TMUF. |
− | *** '''lang''' Language of the client, as ISO 639-1. | + | *** '''lang''' Language of the client, as ISO 639-1. Dedicated server sets it to "xx". |
− | *** '''sd''' Server release date as YYYY-MM-DD, only sent by server. | + | *** '''sd''' Dedicated Server release date as YYYY-MM-DD, only sent by server. |
** '''author''' ''See [[#Author]]''. | ** '''author''' ''See [[#Author]]''. | ||
** '''request''' | ** '''request''' | ||
− | *** '''name''' Name of the | + | *** '''name''' Name of the remote procedure. |
*** '''param''' Parameters for the call. | *** '''param''' Parameters for the call. | ||
** '''auth''' ''Optional. Only seen on Connect and Disconnect''. | ** '''auth''' ''Optional. Only seen on Connect and Disconnect''. | ||
Line 54: | Line 59: | ||
==== Author ==== | ==== Author ==== | ||
− | The author tag identifies the user | + | The author tag identifies the user for whom the request is sent. In this documentation, three cases are possible for the author tag: |
<ul> | <ul> | ||
Line 65: | Line 70: | ||
<li>The method requires user name (denoted as "No (Set to 1)"), the author tag is filled with following content: | <li>The method requires user name (denoted as "No (Set to 1)"), the author tag is filled with following content: | ||
<pre> | <pre> | ||
− | <login>the user's | + | <login>the user's login</login> |
<session>1</session> | <session>1</session> | ||
</pre> | </pre> | ||
Line 71: | Line 76: | ||
<li>The method requires authentication (denoted as "Yes"), the author tag is filled with following content: | <li>The method requires authentication (denoted as "Yes"), the author tag is filled with following content: | ||
<pre> | <pre> | ||
− | <login>the user's | + | <login>the user's login</login> |
<session>the session's id</session> | <session>the session's id</session> | ||
</pre> | </pre> | ||
Line 77: | Line 82: | ||
</ul> | </ul> | ||
− | === Response === | + | === Response body === |
<pre> | <pre> | ||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Line 95: | Line 100: | ||
* '''r''' | * '''r''' | ||
** '''r''' | ** '''r''' | ||
− | *** '''n''' The name of the called | + | *** '''n''' The name of the called procedure. |
− | *** '''c''' The returned | + | *** '''c''' The returned content. |
** '''e''' A string giving the execution time. | ** '''e''' A string giving the execution time. | ||
Revision as of 22:58, 8 June 2019
The TrackMania Forever game client uses a XML-RPC based web API to communicate with the master server. This article attempts to document the API with the potential goal of eventually having a fully functional custom master server.
Basic concepts
TrackMania uses a XML-RPC based protocol to authenticate players, load server lists, load rankings, etc. Below is some documentation about what has been reversed engineered. A lot is still left to be documented, as logged on the Progress page.
The client sends HTTP(S) POST requests to
- http://game.trackmaniaforever.com/online_game/request.php
- http://game2.trackmaniaforever.com/online_game/request.php
- http://nations.trackmaniaforever.com/online_game/request.php
to communicate with the master server, using the headers:
User-Agent: GameBox Accept: */* Content-Type: application/binary Connection: Keep-Alive Pragma: no-cache
Request body
<?xml version="1.0" encoding="UTF-8"?> <root> <game> <name>TmForever</name> <version>2.11.16</version> <distro>MOLUX</distro> <lang>fr</lang> <sd>2011-02-21</sd> <!-- Only sent by dedicated server, see below --> </game> <author> [...] </author> <request> <name>[...]</name> <params> [...] </params> </request> <auth> <value>[...]</value> </auth> </root>
Here is a description of the xml:
- root
- game
- name The client you are using. Known values: TmForever
- version Version of the client.
- distro Software distribution. E.g. MOLUX for TMNF or ORTIC for TMUF.
- lang Language of the client, as ISO 639-1. Dedicated server sets it to "xx".
- sd Dedicated Server release date as YYYY-MM-DD, only sent by server.
- author See #Author.
- request
- name Name of the remote procedure.
- param Parameters for the call.
- auth Optional. Only seen on Connect and Disconnect.
- value Looks like an auth ticket.
- game
Author
The author tag identifies the user for whom the request is sent. In this documentation, three cases are possible for the author tag:
- The method doesn't require authentication (denoted as "No (Empty)"), the author tag is filled with following content:
<login/> <session/>
- The method requires user name (denoted as "No (Set to 1)"), the author tag is filled with following content:
<login>the user's login</login> <session>1</session>
- The method requires authentication (denoted as "Yes"), the author tag is filled with following content:
<login>the user's login</login> <session>the session's id</session>
Response body
<?xml version="1.0" encoding="UTF-8"?> <r> <r> <n>[...]</n> <c> [...] </c> </r> <e>execution time : 0.0010 s</e> </r>
Here is a description of the returned xml:
- r
- r
- n The name of the called procedure.
- c The returned content.
- e A string giving the execution time.
- r
Functions calls
GetConnectionAndGameParams
Gets a lot of information. First request sent by client.
Session required? | Parameters | Response |
---|---|---|
No (Empty) |
|
|
AddBuddy
Adds a player to the friends list.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
List of seen error codes:
ID | Meaning |
---|---|
14 | Unknown username |
143 | You must wait before adding back a deleted friend |
CheckLogin
Checks if login is already used for account creation.
Session required? | Parameters | Response |
---|---|---|
No (Set to 1) |
|
|
MailAccount
Requests the server to send a password recovery email.
Session required? | Parameters | Response |
---|---|---|
No (Empty) |
|
Empty response |
Disconnect
Closes connection.
Session required? | Parameters | Response |
---|---|---|
Yes |
Empty parameters |
Empty response |
GetBuddies
Gets the friends list.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
Left to document
|
GetManialinkInfos
Gets info about a manialink.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
GetManialinkResource
Gets info about a maniacode.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
GetOnlineProfile
Gets info about the player.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
A lot is left to document here
|
GetLeagues
Gets the regions list.
Session required? | Parameters | Response |
---|---|---|
No (Set to 1) |
Empty parameters |
|
OpenSession
Gets a session ID.
Session required? | Parameters | Response |
---|---|---|
No (Set to 1) |
|
|
k is hard-coded in the game's binary. One value has been seen, both for United and Nations:
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCpBgX3c4ezM18RiGPlQiVKINu+JicxOd6yuHl5q30 00CdTLu53A3ceuelum2+ui+MmASL3JjmVVOoNURvK7GCt79wLUUSbtTaZPXPr73TioZBCVkPd8chAb8 EurZtlDp5QQvDCaoCfFJ4V8VJgM0IK0qVIHRP+D03tKgb2WOgK9QIBEQ==
RemoveBuddy
Removes a player from the friends list.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
Empty response |
ReceiveMessages
Checks for messages.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
RequestAllowed
Checks if a request is allowed.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
SendMessages
Sends a message to a player.
Session required? | Parameters | Response |
---|---|---|
Yes |
|
|
Subscribe
Registers a new account. Warning: This is sent over HTTPS.
Session required? | Parameters | Response |
---|---|---|
No (Set to 1) |
|
|
RedirectOnMasterServer
This response happens sometimes. It tells the client to switch auth server. When received, the client sends same request it just sent, but to the other server specified.
Here is a description of the response:
- a
- b Name of the game.
- c New server address to use.
- d Endpoint (generally online_game).
- e HTTPS port.
- f HTTP port.
- g Base region (World).
- h ?. Set to 1
- i ?. Set to 1
- j (Maybe) List of authorized/available remote methods (described below), or permissions.
- k One remote call (multiple of them in the j tag)
- l Method/Permission name.
- q Might be if authorized/available or not (seems always 1).
- k One remote call (multiple of them in the j tag)
Here is a list of the methods that have been seen in k:
- AddCustomChallenge
- AddResults
- CheckServerPassword
- Connect
- ConvertAccount
- CreateGroup
- Disconnect
- GetChallenge
- GetChallengeFromUId
- GetManialinkResource
- GetReplay
- MoveFromLeague
- PayCoppersTransaction
- SLiveUpdate
- SendMessages
- ShareChallenge
- StartOfficialRecord
- StopOfficialRecord
- Subscribe
- SubscribeToGroup
- UnsubscribeFromGroup
- UpdateOnlineProfile
- UploadOfficialRecord
- ValidateSoloAccount
How to help
Use a packet analyzer to see the game's communication while experimenting with client features, and describe requests and responses in as much detail as possible.