ru docs seems to be done

This commit is contained in:
McModder
2025-02-05 18:03:09 +03:00
parent ea1227cdf9
commit aa2f5a343f
9 changed files with 315 additions and 87 deletions

View File

@@ -1,6 +1,6 @@
# Ely.by API (симуляция Mojang API)
Здесь приведена информация об API, совместимом с функционалом [Mojang API](http://wiki.vg/Mojang_API) Обращаем ваше внимание на то, что это не полноценное API Ely.by, а только набор дополнительных запросов, реализованных на базе нашего [сервера авторизации](./minecraft-auth.md).
Здесь приведена информация об API, совместимом с функционалом [Mojang API](http://wiki.vg/Mojang_API) Обращаем ваше внимание на то, что это не полноценное API Ely.by, а только набор дополнительных запросов, реализованных на базе нашего [сервера авторизации](./minecraft-auth).
## Запросы
:::note
@@ -90,7 +90,7 @@ API не имеет ограничения на количество запро
В случае, если один из переданных никнеймов не найден в базе данных, для него не будет возвращено значения (он будет просто пропущен). Учитывайте эту ситуацию при парсинге ответа.
### Запрос информации о профиле по UUID {#profile-by-uuid}
См. [запрос профиля для сервера авторизации](./minecraft-auth.mdx#profile-request).
См. [запрос профиля для сервера авторизации](./minecraft-auth#profile-request).
## Возможные ошибки {#possible-errors}

View File

@@ -26,7 +26,8 @@
**Причина**: Пользователь ввёл/разработчик передал неверные значения.
**Решение**: Необходимо вывести пользователю уведомление о неправильно введённых данных.
{#not-found}Для индикации ошибки **Not Found** используется ответ с `404` статусом
#### Not Found {#not-found}
Для индикации ошибки **Not Found** используется ответ с `404` статусом
## Авторизация в лаунчере {#launcher}
В этом разделе описана авторизация для игрового лаунчера и описывает действия, необходимые для получения `accessToken` для игрового клиента Minecraft. В результате авторизации будет получен **JWT-токен** с [правами доступа](./oauth.md#available-scopes) `minecraft_server_session`.
@@ -100,7 +101,7 @@
> * **clientToken** (*string*) Уникальный идентификатор клиента, относительно которого получен accessToken.
> * **requestUser** (*bool*) Если поле передано как `true`, то в ответе сервера будет присутствовать поле `user`.
::note
:::note
В оригинальном протоколе так же передаётся значение `selectedProfile`, но в реализации Mojang он не влияет ни на что. Наша реализация сервера авторизации игнорирует этот параметр и опирается на значения `accessToken` и `clientToken`.
:::
@@ -217,10 +218,12 @@
Тем не менее, описанный ниже запрос актуален только для **Minecraft 1.7.6+**, когда для загрузки скинов стала использоваться Authlib.
> {#profile-request}**GET /session/profile/\{uuid\}**
### Запрос профиля {#profile-request}
> **GET /session/profile/\{uuid\}**
>
> Запрос на этот URL выполняется клиентом в одиночной игре на локальном сервере (созданном посредством самой игры). В URL передаётся UUID пользователя, с которым был запущен клиент, а в ответ получается информация о текстурах игрока в таком же формате, как и при `hasJoined` запросе.
## Готовые библиотеки authlib {#premade-authlib}
:::tip
Ely.by поддерживает библиотеку authlib-injector. Это наиболее простой и универсальный способ установки системы авторизации в игру и игровые сервера. За подробностями обратитесь в [соответствующий раздел документации](./authlib-injector.md).
@@ -255,7 +258,7 @@ Ely.by поддерживает библиотеку authlib-injector. Это н
Прежде чем производить установку, необходимо определить, какой именно файл подлежит модификации:
* **>=1.16**: `libraries/net/minecraft/server/ВЕРСИЯ-ЦИФРЫ/server-ВЕРСИЯ-ЦИФРЫ-extra.jar`.
* **1.13-1.15**: `libraries/net/minecraft/server/ВЕРСИЯ/server-ВЕРСИЯ-extra.jar`.
* **<=1.12**: `minecraft_server.ВЕРСИЯ.jar`.
* **\<=1.12**: `minecraft_server.ВЕРСИЯ.jar`.
Когда необходимый файл найден, выполните для него установку authlib, аналогично [оригинальному серверу](#authlib-server-vanilla).
@@ -314,4 +317,4 @@ java -jar cache/patched-ВЕРСИЯ.jar
Ту же самую операцию вам необходимо провести и с сервером, только заменить ссылку на `hasJoined`.
После этих действий вам нужно в настройках включить online-mode=true и сервер станет пускать на себя только тех игроков, которые будут авторизованы через Ely.by.
После этих действий вам нужно в настройках включить `online-mode=true` и сервер станет пускать на себя только тех игроков, которые будут авторизованы через Ely.by.

View File

@@ -41,13 +41,13 @@ https://example.com/oauth/ely.php?error=access_denied&error_message=The+resource
| *prompt* | `consent` или `select_account` | Принудительно отобразить запрос прав (`consent`) или принудительно запросить выбор аккаунта (`select_account`). |
| *login_hint* | `erickskrauch` или `erickskrauch@ely.by` | Если у пользователя есть несколько аккаунтов, то указав в этом параметре username или E-mail пользователя, вы автоматически выберете аккаунт за него. Это полезно в случае повторного входа, когда токен истёк. |
### Перечень доступных scopes {#oauth-scopes}
### Перечень доступных scopes {#available-scopes}
| **Scope** | **Описание** |
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **account_info** | Получение информации о пользователе. |
| **account_email** | В ответе на запрос информации о пользователе будет также присутствовать его email. |
| **offline_access** | Вместе с `access_token` вы также получите и `refresh_token`. Смотрите подробнее в [соответствующем разделе](#refresh-token-grant). |
| **offline_access** | Вместе с `access_token` вы также получите и `refresh_token`. Смотрите подробнее в [соответствующем разделе](#refresh-token). |
| **minecraft_server_session** | `access_token` можно будет использовать в качестве сессии для Minecraft. |
## Обмен кода на ключ {#access_key}
@@ -91,9 +91,161 @@ if (!is_null($_GET['code'])) {
curl_close($curl);
}
```
Пояснение к коду:
:::info[Пояснения к коду]
Сначала мы объявляем переменную `$oauthParams`, в которую заносим значения, полученные после регистрации приложения.
Затем проверяем, не возникла-ли ошибка. В этом случае сразу же прерываем выполнение.
Формируем POST запрос к форме обмена `code` на `access_token`, передавая необходимые поля.
Выполняем запрос, получаем ответ, переводим его из JSON в ассоциативный массив.
:::
### Ответ сервера {#access_key_result}
В случае успешного запроса в теле ответа будет находиться результат обмена кода авторизации на `access_token`. Данные являются JSON документом и могут быть легко интерпретированы средствами используемого языка программирования.
Тело JSON документа содержит следующие поля:
```json
{
"access_token": "4qlktsEiwgspKEAotazem0APA99Ee7E6jNryVBrZ",
"refresh_token": "m0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze", // Представлен только в случае запроса с правами offline_access
"token_type": "Bearer",
"expires_in": 86400 // Количество секунд, на которое выдан токен
}
```
На этом процедура авторизации закончена. Полученный `access_token` может быть использован для получения информации о пользователе и взаимодействия с нашим API.
## Получение информации о пользователе {#get-user-info}
Если полученный токен имеет scope `account_info`, то вы можете запросить информацию об аккаунте пользователя. Для этого необходимо отправить запрос на URL:
```url
https://account.ely.by/api/account/v1/info
```
Для передачи `access_token` используется заголовок `Authorization` со значением `Bearer {access_token}`.
```php title="Пример реализации получения информации о пользователе на PHP"
<?php
$accessToken = 'some_access_token_value';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/account/v1/info');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $accessToken,
]);
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
```
В ответ вы получите JSON документ со следующим содержимым:
```json
{
"id": 1,
"uuid": "ffc8fdc9-5824-509e-8a57-c99b940fb996",
"username": "ErickSkrauch",
"registeredAt": 1470566470,
"profileLink": "http:\/\/ely.by\/u1",
"preferredLanguage": "be",
"email": "erickskrauch@ely.by"
}
```
## Обновление токена доступа {#refresh-token}
Если при выполнении авторизации вами было запрошено право на получение scope `offline_access`, то вместе с `access_token` вы также получите и `refresh_token`. Данный токен не истекает и может быть использован для получения нового токена доступа, когда он истечёт.
Для выполнения операции обновления токена необходимо отправить **POST** запрос на тот же URL, что использовался и при обмене кода на ключ доступа, но со следующими параметрами:
| **Параметр** | **Описание** |
|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `client_id` | ClientID, полученный при регистрации приложения. |
| `client_secret` | ClientSecret, полученный при регистрации приложения. |
| `scope` | Те же scope, что были запрошены и при получении начального токена доступа. Попытка запросить большее количество прав приведёт к ошибке. |
| `refresh_token` | Непосредственно токен, полученный вместе с начальным токеном доступа. |
```php title="Пример реализации обновления токена доступа на PHP"
<?php
// refresh_token, полученный при завершении авторизации
$refreshToken = 'm0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze';
$requestParams = [
'client_id' => 'ely', // Ваш ClientId, полученный при регистрации
'client_secret' => 'Pk4uCtZw5WVlSUpvteJuTZkVqHXZ6aNtTaLPXa7X', // Ваш ClientSecret, полученный при регистрации
'scope' => 'account_info account_email',
'refresh_token' => $refreshToken,
'grant_type' => 'refresh_token',
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/oauth2/v1/token');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestParams));
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
```
В качестве ответа будет точно такое же тело, какое было получено в результате [обмена кода на ключ доступа](#access_key_result). Поле `refresh_token` будет отсутствовать.
## Готовые библиотеки {#libraries}
Более простым способом будет использовать уже готовую библиотеку, которой будет необходимо передать лишь регистрационные параметры. Ниже перечислены библиотеки для различных языков программирования. Вы можете дополнить этот список своей библиотекой.
* **PHP**:
* [Официальная] https://github.com/elyby/league-oauth2-provider
* **Ruby**:
* [Официальная] https://github.com/elyby/omniauth-ely
## Возможные ошибки {#errors}
Ниже приведены стандартные ошибки, которые вы можете получить в случае неправильной передачи данных на сервер авторизации. Если вы столкнулись с ошибкой, не описанной в этой документации, пожалуйста, сообщите о ней через [форму обратной связи](https://ely.by/site/contact).
### Ошибки при инициализации авторизации {#errors-init-auth}
Этот раздел описывает ошибки, отображаемые при переадресации пользователя с вашего сайта на нашу страницу инициализации авторизации.
```
Invalid request ({parameter} required).
```
Данная ошибка означает, что вы передали не все необходимые параметры. Чтобы решить эту ошибку просто добавьте недостающий параметр.
```
Invalid response type '{invalid_response_type_value}'.
```
Данная ошибка означает, что вы передали неподдерживаемый тип `response_type`. На данный момент поддерживается только значение `code`.
```
Invalid scope '{invalid_scope}'.
```
Ошибка указывает на то, что было запрошено неизвестный `scope`. Убедитесь, что вы запрашиваете [поддерживаемые права](#available-scopes).
```
Can not find application you are trying to authorize.
```
Данная ошибка говорит о том, что переданные параметры не соответствуют ни одному из зарегистрированных приложений. Для решения проблемы исправьте ваши значения `client_id` и `redirect_uri`.
### Ошибки при обмене кода на ключ {#issue-token-errors}
В случае возникновения ошибки вместо ожидаемого ответа с `200` статусом вы получите `40x` код и следующие 2 поля:
```json
{
"error": "invalid_request",
"error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"code\" parameter."
}
```
В поле `error` находится системный идентификатор ошибки, в `error_description` — описание ошибки на английском языке.
#### Возможные значения error
* `invalid_request`: Переданы не все необходимые параметры запроса или значение `code` не было найдено в базе выданных кодов.
* `unsupported_grant_type`: Данная ошибка сигнализирует о том, что вы попытались произвести авторизацию по неизвестному для нашего OAuth2 сервера типу Grant.
* `invalid_client`: Эта ошибка возникает в случае, когда трио значений `client_id`, `client_secret` и `redirect_uri` не совпали ни с одним из зарегистрированных приложений.
### Ошибки при запросе информации о пользователе {#errors-request-user}
Ответ со статусом `401` указывает на то, что заголовок `Authorization` не присутствует в запросе или его значение сформировано неверно. Тело ответа будет следующим:
```json
{
"name": "Unauthorized",
"status": 401,
"message": "Your request was made with invalid credentials."
}
```
Ответ со статусом `403` сигнализирует о том, что переданный в заголовке `Authorization` токен не содержит scope `account_info` или он истёк. Получаемый ответ будет иметь следующий формат:
```json
{
"name": "Forbidden",
"status": 403,
"message": "You are not allowed to perform this action."
}
```
### Ошибки при обновлении токена доступа {#errors-renewing-token}
При выполнении обновления токена доступа вам могут встретиться те же ошибки, что и при [обмене кода на ключ доступа](#issue-token-errors), а также несколько новых:
* `invalid_request`: Переданы не все необходимые параметры запроса или значение `refresh_token` не был найден в базе выданных токенов.
* `invalid_scope`: Были перечислены неподдерживаемые scope или запрошено больше, чем было у изначального токена.

146
docs/skins-system.md Normal file
View File

@@ -0,0 +1,146 @@
# Система скинов
На этой странице вы найдёте информацию о доступных запросах к сервису системы скинов Ely.by. Вы можете использовать любой из них как дополнительный или основной источник скинов для своего проекта.
Сервис системы скинов Ely.by обеспечивает [проксирование текстур владельцев лицензии Minecraft](#textures-proxy), что означает, что при использовании этого сервиса игроки будут видеть как скины премиум пользователей Minecraft, так и скины пользователей сервиса Ely.by.
Мы стремимся соответствовать официальной системе скинов и не поддерживаем ушки и HD-скины. Система поддерживает плащи, но не позволяет игрокам самостоятельно их надевать.
Если у вас есть предложения по развитию существующего функционала, пожалуйста, [создайте новый Issue](https://github.com/elyby/chrly/issues/new) в [репозитории проекта Chrly](https://github.com/elyby/chrly).
:::note
Вы можете найти более подробную информацию о реализации сервера системы скинов в [репозитории проекта Chrly](https://github.com/elyby/chrly).
:::
## URL-адреса запросов {#url}
Система скинов размещена на домене `http://skinsystem.ely.by`.
Во всех запросах параметр `nickname` должен быть заменён на ник игрока. Значение не чувствительно к регистру.
### Запрос скина {#skin-request}
> **GET /skins/\{nickname\}.png**
URL для загрузки текстуры скина. Расширение `.png` опционально. Если текстура не будет найдена, сервер вернёт ответ с `404` статусом.
### Запрос плаща {#cape-request}
> **GET /cloaks/\{nickname\}.png**
URL для загрузки текстуры плаща. Расширение `.png` опционально. Если текстура не будет найдена, сервер вернёт ответ с `404` статусом.
### Запрос текстур
> **GET /textures/\{nickname\}**
По этому URL вы можете получить текстуры в формате, указанному в поле `textures` одноимённого property в [ответе на запрос подписанных текстур](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape):
```json
{
"SKIN": {
"url": "http://example.com/skin.png",
"metadata": {
"model": "slim"
}
},
"CAPE": {
"url": "http://example.com/cape.png"
}
}
```
В зависимости от доступных игроку текстур могут отсутствовать поля `SKIN` или `CAPE`. Если модель скина не является `slim`, то поле `metadata` также будет отсутствовать.
Если текстуры не будут найдены, сервер вернёт пустой ответ с `204` статусом.
### Запрос профиля
> **GET /profile/\{nickname\}**
Данный запрос является аналогом запроса [профиля игрока в API Mojang](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape), только вместо идентификации пользователя по UUID используется его ник. Также, как и в API Mojang, вы можете добавить к запросу `?unsigned=false`, чтобы получить текстуры с подписью. В ответе также будет присутствовать дополнительное property с `name` равным ely.
Если у пользователя нет текстур, то они будут запрошены через прокси Mojang, после чего переподписаны с использованием [нашего ключа подписи](#signature-verification-key-request).
```json
{
"id": "ffc8fdc95824509e8a57c99b940fb996",
"name": "ErickSkrauch",
"properties": [
{
"name": "textures",
"signature": "eks3dLJWzod92dLfWH6Z8uc6l3+IvrZtTj3zjwnj0AdVt44ODKoL50N+RabYxf7zF3C7tlJwT1oAtydONrxXUarqUlpVeQzLlfsuqUKBLi0L+/Y9yQLG3AciNqzEWq3hYaOsJrsaJday/hQmKFnpXEFCThTMpSuZhoAZIiH4VG48NhP70U93ejyXF9b1nPYnXP6k7BVB8LYSzcjZfdqY88jQJbbvRzOyX14ZSD0Ma92jceLNKmkTVc2UfRLUNXtQKtVSFUzlAjCXPJW89IIOZTRqLg65qstWwBvn6VuikyUB5EIxM8vuCh7zTkrMOx1v2Q0xIj8YSFcbnBH2bo87SYOIe1bOK57ZEeUJqY6uSgMlWs7dI5D3nmhFptErm72hg55Axdo1xbG4mvnmLYF7SA4yMDSytPPL+kA+sw3pafnvU2IZo38gqJSDOOpkOpdhUoHx85fzRJL8AcLSJiFlCZDl4pSi3cVuKy/xY5ohT/fJ6GEqpbZp3gACymn47zzI42VSh6j1DQnx2wnhqalTv0kE3qpAFpK/htSboQkFCW/bULO3b+vgU87XPlReT7UtH4yGLtixgs5GC8AzBraN8vOMv8TZCX9ab6mBBjOoDJjXa8Tq637TC75GxRHlpAN2jRHYvyp2zJwjUrML3u4eD4osHW+VBfl8D2l3nLJuemQ=",
"value": "eyJ0aW1lc3RhbXAiOjE2MTQ5MzczMjc0MzcsInByb2ZpbGVJZCI6ImZmYzhmZGM5NTgyNDUwOWU4YTU3Yzk5Yjk0MGZiOTk2IiwicHJvZmlsZU5hbWUiOiJFcmlja1NrcmF1Y2giLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly9lbHkuYnkvc3RvcmFnZS9za2lucy82OWM2NzQwZDI5OTNlNWQ2ZjZhN2ZjOTI0MjBlZmMyOS5wbmcifX19"
},
{
"name": "ely",
"value": "but why are you asking?"
}
]
}
```
Если запрошенный никнейм не будет найден ни в локальном хранилище, ни у Mojang, сервер вернёт пустой ответ с `204` статусом.
### Запрос публичного ключа {#signature-verification-key-request}
> **GET /signature-verification-key.der**
Данный запрос возвращает публичный ключ, который может быть использован для проверки подписи текстур. Ключ предоставляется в формате `DER`. Этот формат используется внутри Authlib, поэтому ключ может быть в ней использован без модификации алгоритма проверки подписи.
> **GET /signature-verification-key.pem**
Такой же запрос, что и предыдущий, но возвращает ключ в формате `PEM`.
### Запрос подписанных текстур
> **GET /textures/signed/\{nickname\}**
Этот запрос используется в нашем [плагине серверной системы скинов](https://ely.by/server-skins-system) для загрузки текстур с оригинальной подписью Mojang. Полученные в ответе текстуры могут быть без изменений переданы в немодифицированный игровой клиент. В ответе также будет присутствовать дополнительное property с `name` равным ely.
```json
{
"id": "ffc8fdc95824509e8a57c99b940fb996",
"name": "ErickSkrauch",
"properties": [
{
"name": "textures",
"signature": "QH+1rlQJYk8tW+8WlSJnzxZZUL5RIkeOO33dq84cgNoxwCkzL95Zy5pbPMFhoiMXXablqXeqyNRZDQa+OewgDBSZxm0BmkNmwdTLzCPHgnlNYhwbO4sirg3hKjCZ82ORZ2q7VP2NQIwNvc3befiCakhDlMWUuhjxe7p/HKNtmKA7a/JjzmzwW7BWMv8b88ZaQaMaAc7puFQcu2E54G2Zk2kyv3T1Bm7bV4m7ymbL8McOmQc6Ph7C95/EyqIK1a5gRBUHPEFIEj0I06YKTHsCRFU1U/hJpk98xXHzHuULJobpajqYXuVJ8QEVgF8k8dn9VkS8BMbXcjzfbb6JJ36v7YIV6Rlt75wwTk2wr3C3P0ij55y0iXth1HjwcEKsg54n83d9w8yQbkUCiTpMbOqxTEOOS7G2O0ZDBJDXAKQ4n5qCiCXKZ4febv4+dWVQtgfZHnpGJUD3KdduDKslMePnECOXMjGSAOQou//yze2EkL2rBpJtAAiOtvBlm/aWnDZpij5cQk+pWmeHWZIf0LSSlsYRUWRDk/VKBvUTEAO9fqOxWqmSgQRUY2Ea56u0ZsBb4vEa1UY6mlJj3+PNZaWu5aP2E9Unh0DIawV96eW8eFQgenlNXHMmXd4aOra4sz2eeOnY53JnJP+eVE4cB1hlq8RA2mnwTtcy3lahzZonOWc=",
"value": "eyJ0aW1lc3RhbXAiOjE0ODYzMzcyNTQ4NzIsInByb2ZpbGVJZCI6ImM0ZjFlNTZmNjFkMTQwYTc4YzMyOGQ5MTY2ZWVmOWU3IiwicHJvZmlsZU5hbWUiOiJXaHlZb3VSZWFkVGhpcyIsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83Mzk1NmE4ZTY0ZWU2ZDhlYzY1NmFkYmI0NDA0ZjhlYmZmMzQxMWIwY2I5MGIzMWNiNDc2ZWNiOTk2ZDNiOCJ9fX0="
},
{
"name": "ely",
"value": "but why are you asking?"
}
]
}
```
По умолчанию для этого запроса не применяется проксирование текстур. Чтобы его включить, добавьте дополнительный **GET** параметр `?proxy=true`.
Если текстуры не будут найдены, сервер вернёт пустой ответ с 204 статусом.
### Дополнительные параметры
При совершении любого из вышеописанных запросов вы также можете передать ряд дополнительных **GET** параметров. Они будут использованы для анализа использования сервиса разными версиями игры.
* `version`: Версия протокола, по которому идёт запрос на скины. На данный момент это версия `2` , т.е. вам необходимо указать `version=2`.
* `minecraft_version`: Версия Minecraft, с которой идёт запрос.
* `authlib_version`: Версия используемой Authlib. Этот параметр актуален для версий Minecraft 1.7.6+, где для загрузки скинов стала использоваться отдельная библиотека, а не внутриигровой код.
Пример запроса текстур с передачей вышеописанных параметров:
```url
http://skinsystem.ely.by/textures/erickskrauch?version=2&minecraft_version=1.14.0&authlib_version=1.5.25
```
### Вспомогательные URL
Также запрос скина и плаща можно выполнить, передавая ник через GET параметр. Эта возможность используется для передачи аналитических параметров в версиях игры до 1.5.2, когда ник просто добавлялся в конец строки. Для этого вся строка выстраивается таким образом, чтобы последним параметром шёл name, после добавления ника к которому получался полный запрос на текстуру.
> **GET /skins?name=\{nickname\}.png**
Смотрите [запрос на получение скина](#skin-request).
> **GET /cloaks?name=\{nickname\}.png**
Смотрите [запрос на получение плаща](#cape-request).
```url title="Пример запросов на текстуры с передачей параметров выше"
http://skinsystem.ely.by/skins?version=2&minecraft_version=1.5.2&name=erickskrauch.png
http://skinsystem.ely.by/cloaks?version=2&minecraft_version=1.4.7&name=notch
```
## Проксирование текстур {#textures-proxy}
Сервис системы скинов Ely.by получает текстуры из официальной системы скинов в случае, если в базе данных не было найдено информации о текстурах для запрошенного имени пользователя. Также запрос будет проксирован, если запись о скине будет найдена, но он будет стандартным.
Для улучшения пропускной способности проксирующего алгоритма, информация о текстурах кешируется в 2 стадии:
* Соответствие ника и UUID хранится [в течение 30 дней](https://help.minecraft.net/hc/en-us/articles/360034636712-Minecraft-Usernames#article-container:~:text=How%20often%20can%20I%20change%20my%20username%3F).
* Информация о текстурах обновляется не чаще [раза в минуту](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape:~:text=You%20can%20request%20the%20same%20profile%20once%20per%20minute).
Если вы владеете лицензионным аккаунтом Minecraft, но ваш ник занят, пожалуйста, обратитесь в [службу поддержки](https://ely.by/site/contact) и после небольшой проверки мы передадим ник в ваше пользование.
## Готовые реализации
Готовые реализации патчей и инструкции по их установке могут быть найдены в [разделе загрузок на главном сайте Ely.by](https://ely.by/load).