Code Monkey home page Code Monkey logo

api.mineskin.org's People

Contributors

dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar inventivetalentdev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

api.mineskin.org's Issues

Question

How to convert the signature in the blob (what reverse action we need)?
I tried base64decode, but get a non-working signature.

Incorrect model returns 500 | Format Detection

I noticed that specifying the incorrect player model for a provided url fails. I'm not sure if this is an issue with this api or with mojang, but I do know the minecraft launcher allows you to set either model and might distort the skin to fit. Would be great if that functionality was here too, instead of just breaking.

For example,

curl -X POST "https://api.mineskin.org/generate/url?model=slim" -d "url=https://i.imgur.com/Pgu9R1s.png"

will always return

{"error":"Failed to generate skin data","err":"Authentication failed - Invalid credentials. Invalid username or password.","accountId":#}

Uploaded skins are replaced with random skins from the global gallery

I have tried generating many skins but only one seems to actually be successfully applied to my player. When I try generating the other ones and then try to apply them to my player once I join, it seems to get a random skin from Mineskin's global gallery. First time it happened I logged on with a shrek skin lol.
If I go to the gallery and try to download one of my own skins (any of the ones that don't work), it downloads a random skin file from the global gallery.
This is extremely annoying and it's driving me insane. Do you have any idea what could be causing this? Again, so far only ONE skin has actually worked. And it's nothing special from the others.

Here's an example. It was supposed to generate according to this skin
image
But it instead randomly gave me this
image

Invalid accounts

There seem to be quite a few invalid accounts in the system.
What I suggest to do is to (temporaily) deactivate an account when its failed and logging it out somewhere so that you can contact the owner and ask what happened.
should be easy to filter for the error msg "Authentication failed - Invalid credentials. Invalid username or password."

I observed the following accounts as being invalid:
4
6
11
13
15
18
22
26
27
28
29
30
31
36

Sometimes "nextRequest" value missing

What steps will reproduce the problem?

  1. Do request for upload same image multiple times.

What were you expecting to happen? What happened instead?

It should return nextRequest value, but sometimes this value missing, all other values presents.
The last generated response for me: https://pastebin.com/0RMm5L5T

Idk how important this parameter, but as i understood, it should be guaranteed to return. Few days before it worked perfectly.

I already wrote this on discord, this was fixed quickly, but seems like not fully.

API does not match OpenAPI specification

The Mineskin API at https://api.mineskin.org does not match the OpenAPI specification here

Examples

  • The specification mentions an API key should be included as query parameter key. However when this is included the API will time out
  • The specification mentions that for the endpoint POST /generate/user, the UUID should be given in the json payload. However the real API expects it as the query parameter uuid.

What were you expecting to happen?

The API should follow the OpenAPI specification, or the OpenAPI specification should be updated to match the API

Config example update

Is your feature request related to a problem? Please describe.
I believe there are certain things missing from the current example config file.
Like the entire gitconfig feature, or requestServers?

Describe the solution you'd like
A little update & maybe some comments sprinkled in?

Describe alternatives you've considered
Building something myself to generate skin signatures. But I really don't want to.

API Times out at random

What steps will reproduce the problem?

None, just sending a request will sometimes make it timeout
When it does I am greeted with a Cloudflare error page

What were you expecting to happen? What happened instead?

The skin data to be returned.

Error 524 Ray ID: 5c142680028f0843 • 2020-08-11 18:53:31 UTC
A timeout occurred
You
Browser
Working
Paris
Cloudflare
Working
api.mineskin.org
Host
Error
What happened?
The origin web server timed out responding to this request.

What can I do?
If you're a visitor of this website:
Please try again in a few minutes.

If you're the owner of this website:
The connection to the origin web server was made, but the origin web server timed out before responding. The likely cause is an overloaded background task, database or application, stressing the resources on your web server. To resolve, please work with your hosting provider or web development team to free up resources for your database or overloaded application. Additional troubleshooting information here.

Cloudflare Ray ID: 5c142680028f0843 • Your IP: REDACTED • Performance & security by Cloudflare

Not generating right skin on upload (hash collision?)

What steps will reproduce the problem?

  1. Go on MineSkin.org and upload IMG-20180331-WA0002 without any additional settings
  2. You should be seeing the skin 479376871 or 628530970 when selectiong alex/slim model on upload

What were you expecting to happen? What happened instead?

To be redirected to the right skin (and it not to differ from steve/alex models o.0 Just found it out now by luck).
Editing the file a bit results in the right skin generated: OBS-VirtualCam2 0 4-Installer

Some more information

Found this skin in my Google Photos gallery extremely compressed and as jpg. So its original quality is lost and maybe some voodo google compression has been applied 🤷‍♂️

minesk.in / imagelink redirection

Is your feature request related to a problem? Please describe.
We have a a lot of players from SkinsRestorer that want to apply skins from http://novask.in.
This fails as it will redirect to http://lh3.googleusercontent.com/

Example: http://novask.in/747913458.png

Describe the solution you'd like
A way that mineskin can catch the redirection and collect the skin from there.
A way for mineskin to collect a skin from a non.png link like:
http://lh3.googleusercontent.com/f7E3jItJPMnGRXeho8u-6KQXPsZk-vMZm1p4K9RnxIxVJezQZlzloo_q61RMlV3K8cnI1whmDD9MrutO4lGcfQ

Describe alternatives you've considered
We now have them upload the skin to imgur.
But it would be nice if this process can be done on mineskin side.

Additional context
SkinsRestorer = https://github.com/SkinsRestorer/SkinsRestorerX
How we intergrate mineskin = https://github.com/SkinsRestorer/SkinsRestorerX/blob/master/src/main/java/skinsrestorer/shared/utils/MineSkinAPI.java

POST request trouble with reading a file

Hi, I have a problem with making a POST request to Mineskin API and it's getting trouble with reading a file object.
Maybe it's not that related issue but it could help everyone in the future.

Here's the error:

TypeError: source.on is not a function
    at Function.DelayedStream.create (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\delayed-stream\lib\delayed_stream.js:33:10)  
    at FormData.CombinedStream.append (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\combined-stream\lib\combined_stream.js:45:37)
    at FormData.append (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\form-data\lib\form_data.js:74:3)
    at C:\Users\PC\custom-skin-uploader\skin-uploader-api\server.js:21:14
    at Layer.handle [as handle_request] (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\PC\custom-skin-uploader\skin-uploader-api\node_modules\express\lib\router\index.js:335:12)

Here's what I've actually made. Any solutions? i tried everything.

app.post('/upload', (req, res) => {
    if(req.files === null) {
        return res.status(400).json({ msg: 'No file uploaded'});
    }
    console.log(req.files.file);

    const formData = new FormData();
    formData.append('file', req.files.file);
    formData.append('api', API_KEY);

    axios.post('https://api.mineskin.org/generate/upload', formData, {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    }).then((res) => {
            console.log(`Status: ${res.status}`);
            console.log('Body: ', res.data);
        }).catch((err) => {
            console.error(err);
        })
});

API for random skin?

Hi there!

Is it possible to have an API endpoint for getting a random skin? Something like /get/random maybe?
I thought about querying /get/id/<random number> but some IDs are missing here even while being in the correct range and this method is also deprecated.

My use case is that I want to assign random skin to players who don't have custom skin.

[Suggestion] Improve /give command

There seems to be a minor issue with the output of the /give command generated and it seems to be related to having spaces in the NBT data.

For example:
The command shown here wouldn't work:

minecraft:give <player> minecraft:player_head{ SkullOwner:{ Id:29f5f630-3109-4c4e-974a-9c530267989b, Properties:{ textures:[{ Value:"eyJ0aW1lc3RhbXAiOjE1Nzk0NTM2NDE3ODUsInByb2ZpbGVJZCI6IjE5MjUyMWI0ZWZkYjQyNWM4OTMxZjAyYTg0OTZlMTFiIiwicHJvZmlsZU5hbWUiOiJTZXJpYWxpemFibGUiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzgyYWQwNWVmMzNmNzdjMDJlNDQ5MmRlNzNkOTg4ZTMxMGU2Mzc3Nzc0NTAxYzM1ODUyMzE0MGQxMzFjOWZlMTIifX19", Signature:"YvosqJT4oCkQVyIhgzyik1LXjclzdBm+oM5THcN/ddqb3hoPol+r1yLQAPZL4JF0uUe+8yVxvaawoTH1pPTGhfBXMzB63jq4dBo7xrPf0ZxowSF3UkeLFqcrt8pFXUemJZEROIAXag46IwMgXIQ9lzqyyIWIWXPqEhVCb0H25Qclxje9jz6NS2cBS3JV/KaPcXLcJCQcYrHlPLAkZM7tQuiCJ0iSw9s8Uo/anmJyujnySWeMWdvguVykGlhaPx33mM/qCnvN7kHjWHpoTkXT8fioRUUJpyaJOnIGsT43RNZTzEAtZ8KZ16vwms7GNg8Z3muotF/476GoER/c16HXPeBctIQeHNlYTEyYp5iHWhmix2JlM3+eAUGZPJwbaVUW8pEZcJb2F13I2eZ/EQJAaiyBC081y5EDLBZCzVnuuXwdXKgMM2/lTp8+d2yGsf0FzopDpNfGBDhv0pxy+tFj0kEmFj4HyWTMMrELLSzZU4kuIgC+GXAhyScnSALS3oU3tIve30htERbaQIgYTzHq126fwZfc0mAItT+FUoyppw7QrXHJy+qHPkqOixl4FZ1Md5Nmd9kebtTG0vEX81fFCkEqZU4Crto6KYAK+reQV917LiCVTBORgXRK/3flgp9Fn/HovG0+LhPoJJA+P4Hw1iv6YrZRwYAO6xJ61blKU08=" }] } }, display:{ Name:"{\"text\":\"CinematicUI\"}", Lore:[ "{\"text\":\"Skin #139238042\"}", "{\"text\":\"generated on Jan 19, 2020 6:07:21 PM\"}", "{\"text\":\"via MineSkin.org\"}" ] } }

Meanwhile, this command here does work:

minecraft:give <player> minecraft:player_head{SkullOwner:{Id:29f5f630-3109-4c4e-974a-9c530267989b, Properties:{textures:[{Value:"eyJ0aW1lc3RhbXAiOjE1Nzk0NTM2NDE3ODUsInByb2ZpbGVJZCI6IjE5MjUyMWI0ZWZkYjQyNWM4OTMxZjAyYTg0OTZlMTFiIiwicHJvZmlsZU5hbWUiOiJTZXJpYWxpemFibGUiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzgyYWQwNWVmMzNmNzdjMDJlNDQ5MmRlNzNkOTg4ZTMxMGU2Mzc3Nzc0NTAxYzM1ODUyMzE0MGQxMzFjOWZlMTIifX19",Signature:"YvosqJT4oCkQVyIhgzyik1LXjclzdBm+oM5THcN/ddqb3hoPol+r1yLQAPZL4JF0uUe+8yVxvaawoTH1pPTGhfBXMzB63jq4dBo7xrPf0ZxowSF3UkeLFqcrt8pFXUemJZEROIAXag46IwMgXIQ9lzqyyIWIWXPqEhVCb0H25Qclxje9jz6NS2cBS3JV/KaPcXLcJCQcYrHlPLAkZM7tQuiCJ0iSw9s8Uo/anmJyujnySWeMWdvguVykGlhaPx33mM/qCnvN7kHjWHpoTkXT8fioRUUJpyaJOnIGsT43RNZTzEAtZ8KZ16vwms7GNg8Z3muotF/476GoER/c16HXPeBctIQeHNlYTEyYp5iHWhmix2JlM3+eAUGZPJwbaVUW8pEZcJb2F13I2eZ/EQJAaiyBC081y5EDLBZCzVnuuXwdXKgMM2/lTp8+d2yGsf0FzopDpNfGBDhv0pxy+tFj0kEmFj4HyWTMMrELLSzZU4kuIgC+GXAhyScnSALS3oU3tIve30htERbaQIgYTzHq126fwZfc0mAItT+FUoyppw7QrXHJy+qHPkqOixl4FZ1Md5Nmd9kebtTG0vEX81fFCkEqZU4Crto6KYAK+reQV917LiCVTBORgXRK/3flgp9Fn/HovG0+LhPoJJA+P4Hw1iv6YrZRwYAO6xJ61blKU08="}]}},display:{Name:"{\"text\":\"CinematicUI\"}",Lore:["{\"text\":\"Skin #139238042\"}","{\"text\":\"generated on Jan 19, 2020 6:07:21 PM\"}","{\"text\":\"via MineSkin.org\"}"]}}

The only difference between the two is that the first one has spaces between the brackets while the second doesn't.

Another thing I would like to suggest is to change the output from /give @p minecraft:player_head{<NBT-Data>} to minecraft:give @p minecraft:player_head{<NBT-Data>} for two reasons:

  1. The command is always too long for a player to actually use it, so having the / is redundant as command blocks and consoles don't need/use it.
  2. The command will not only be used on vanilla minecraft servers, but most likely also on spigot servers, therefore a plugin like EssentialsX could be installed, causing the give-command to be overriden. That's why adding minecraft: to the command is useful.

Invalid

Ignore me

I thought the timestamp, name is related to the actual skin data.

Poor /get/list performance, possibly due to countDocuments

Uncached requests of the /get/list/[page] endpoint take very long (> 20 s) to load.

I suspect this is caused by the use of countDocuments (introduced in 7c1fc1b).

From the MongoDB docs:

Returns the count of documents that match the query for a collection or view. The method wraps the $group aggregation stage with a $sum expression to perform the count.

On the other hand, the count operation returns an estimated count, but using collection metadata.

Was there any reason for the change?

API Returning 500 on upload

What steps will reproduce the problem?

  1. Attempt to upload skin via URL

##Information
Using:
node v14.15.5
axios

Printout

Error: Request failed with status code 500
    at createError (C:\Users\camde\Documents\code\skins\node_modules\axios\lib\core\createError.js:16:15)
    at settle (C:\Users\camde\Documents\code\skins\node_modules\axios\lib\core\settle.js:17:12)
    at IncomingMessage.handleStreamEnd (C:\Users\camde\Documents\code\skins\node_modules\axios\lib\adapters\http.js:244:11)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (internal/streams/readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  config: {
    url: 'https://api.mineskin.org/generate/url',
    method: 'post',
    data: '{"url":"https://cdn.discordapp.com/attachments/808204542843813898/813614236458418237/SAILOR_3.png","variant":"slim","name":"Otis","visibility":0}',
    headers: {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/json;charset=utf-8',
      'User-Agent': 'HelloImCamden/1.0',
      'Content-Length': 145
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    adapter: [Function: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    validateStatus: [Function: validateStatus]
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      socket: [Function (anonymous)],
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      connect: [Function (anonymous)],
      error: [Function (anonymous)],
      timeout: [Function (anonymous)],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 7,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: null,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'api.mineskin.org',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'api.mineskin.org',
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 305,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(kSetNoDelay)]: false,
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'POST /generate/url HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'Content-Type: application/json;charset=utf-8\r\n' +
      'User-Agent: HelloImCamden/1.0\r\n' +
      'Content-Length: 145\r\n' +
      'Host: api.mineskin.org\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'fifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    path: '/generate/url',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 500,
      statusMessage: 'Internal Server Error',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://api.mineskin.org/generate/url',
      redirects: [],
      [Symbol(kCapture)]: false,
      [Symbol(RequestTimeout)]: undefined
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'api.mineskin.org',
    protocol: 'https:',
    _redirectable: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 145,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://api.mineskin.org/generate/url',
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'content-type': [Array],
      'user-agent': [Array],
      'content-length': [Array],
      host: [Array]
    }
  },
  response: {
    status: 500,
    statusText: 'Internal Server Error',
    headers: {
      date: 'Mon, 01 Mar 2021 04:04:29 GMT',
      'content-type': 'application/json; charset=utf-8',
      'content-length': '111',
      connection: 'close',
      'set-cookie': [Array],
      'cf-ray': '628f8034ffb8138a-SEA',
      'access-control-allow-origin': '*',
      etag: 'W/"6f-aaqOo9QpjTbIWRIzA+jo4OIix2U"',
      'cf-cache-status': 'DYNAMIC',
      'cf-request-id': '088d8e75180000138a2a8fb000000001',
      'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
      'x-mineskin-breadcrumb': 'c0d33a4d',
      'x-mineskin-delay': '4',
      'x-mineskin-server': 'melon',
      'x-powered-by': 'Express',
      'x-ratelimit-limit': '15',
      'x-ratelimit-remaining': '14',
      'x-ratelimit-reset': '1614571472',
      'report-to': '{"endpoints":[{"url":"https:\\/\\/a.nel.cloudflare.com\\/report?s=YaZYQgNbPDMikwlmt65HLSo19%2ByzjkJjSxNdqRzd9mvsKZuoShd1axYjgGQhBoSL%2FuBcVNirI0ecoFzpCFdZ93zFfQO%2BP5OLZ3tHWpMMCdyB"}],"max_age":604800,"group":"cf-nel"}',
      nel: '{"max_age":604800,"report_to":"cf-nel"}',
      server: 'cloudflare'
    },
    config: {
      url: 'https://api.mineskin.org/generate/url',
      method: 'post',
      data: '{"url":"https://cdn.discordapp.com/attachments/808204542843813898/813614236458418237/SAILOR_3.png","variant":"slim","name":"Otis","visibility":0}',
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      adapter: [Function: httpAdapter],
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      validateStatus: [Function: validateStatus]
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: null,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      _header: 'POST /generate/url HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Content-Type: application/json;charset=utf-8\r\n' +
        'User-Agent: HelloImCamden/1.0\r\n' +
        'Content-Length: 145\r\n' +
        'Host: api.mineskin.org\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/generate/url',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'api.mineskin.org',
      protocol: 'https:',
      _redirectable: [Writable],
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: {
      success: false,
      errorType: 'GeneratorError',
      errorCode: 'skin_change_failed',
      error: 'Failed to change skin'
    }
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}

File upload issue

What steps will reproduce the problem?

  1. Try to understand what the wiki means with the file parameter
  2. Try to upload a skin via https://api.mineskin.org/generate/upload

What were you expecting to happen? What happened instead?

I expected to find any kind of possibility to understand what the file parameter means because you can't send a file directly with json as a byte array or something like this you have to send it as a string in a specific format (most common is converting the byte array to base64)

REST API documentation

Could you please improve your documentation, because there many details missing. Things I noticed:

  • GET /generate/textures.minecraft.net/texture/a2e6a3f8caea7913ab48237beea6d6a1a6f76936e3b71af4c7a08bb61c7870 -> 404
  • /generate/upload -> I guess Post? How should we encode the file?
  • /generate/user/:uuid -> Generates 429 error message with a 500 response code - I assume it's rate-limiting, but there is no documentation about it

Support base64-encoded image in either generate route

Is your feature request related to a problem? Please describe.
I'm attempting to make use of this API in a semi-restrictive environment, and only have reliable access to the base64-encoded image. When trying to pass the decoded image to mineskin, I receive generation failures. Confirmed the image is ok by uploading through the mineskin UI manually. I assume the problem here is utf-8 encoding done to my payload, which is out of my control.

I have also tried to use the generate/url route using a Data URL https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs, but one of the checks before pulling the texture fails and I receive {"success":false,"errorType":"GeneratorError","errorCode":"invalid_image_url","error":"Failed to find image from url","nextRequest":1703510085.607,"delayInfo":{"seconds":6,"millis":6000}}.

The data url was {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABAklEQVR4Xu3VMQ7CMAyF4VyBgZmBialsrIiFC3RmRuycH3CFJeu1SZlKUv2fZAFJg+xHJFKa8bx2r1I9zsdi6fc1RwfW0oG19PuaUxqytEcABEAA6wng8zJZBLCGAPRvzSsOcU+70fC21nf70Tkte6ZP2+H5WLZ2Ox3+H5A3as3E0nUbJH2Hnxpcz8eqOgBtVgOIA9rgdiPivp7TGm5BzQH4NdfGfT2G4AHEtV/OVx2ANpyrOHAcfK5KAdie9rM4bdhLg/Hrru/1OT1/SZtsALan/SxubgAf2H91WysF4J+bCcCH08b1yucCyJ1vJgAAAAAAAAAAAAAAAAAAAAAAALA6b27DnSK0ejouAAAAAElFTkSuQmCC"}

Describe the solution you'd like
I'd like either of the routes to support base64-encoded images. This is generally a more http-friendly format of data, compatible with any client. The easiest fix I believe would be supporting a data url in here - https://github.com/MineSkin/api.mineskin.org/blob/master/src/generator/Generator.ts#L864

Describe alternatives you've considered
I have considered uploading to another API, most support base64-encoded images such as the imgur api, and using the url. I would prefer not doing the extra hop.

Links to skins from namemc.com do not work.

Links to skins from namemc.com do not work. For example https://namemc.com/texture/266c152a597e9d9b.png using
curl -X POST https://api.mineskin.org/generate/url --data "url=https://namemc.com/texture/266c152a597e9d9b.png" returns
{"error":"Failed to determine file size"}.

The skins at namemc.com are cached via cloudflare, is it denying access to your backend? HEAD requests directly to the skin url from my machine using curl work just fine.

An endpoint that only generates data for the skin, but does not upload it.

Is your feature request related to a problem? Please describe.
Perhaps it is. I am likely to use this API a lot and would like to avoid overloading it. I am mainly using it to convert skin images to data which contains signature and whatnot, and believe that uploading it would be deemed unnecessary.

Describe the solution you'd like
A simple endpoint that takes the skin file as an input and outputs the data. Does not store the image or skin data.

Describe alternatives you've considered
I can just use the /generate/upload endpoint to get what I want.

Additional context
Example response:

{
  "model": "steve",
  "data": {
    "uuid": "3d7834c2-9543-4f13-9bcf-f9a14a35e2ec",
    "texture": {
      "value": "...",
      "signature": "..."
    }
  },
  "timestamp": 1606936920
}

Some skins are always gives 429 and 204 error code.

Hello i use MineSkin api in my server to change player skins.

But some skins are always gives 204(no content) error code and if i try to refresh the page it gives 429(too many request) error code. I never can't get these skins.

Here following players lives that issue:

They have skins and it is visible in Minecraft premium servers. Also some sites like mcskinsearch.com can see their skins as well.

Access tokens

Is your feature request related to a problem? Please describe.
As minecraft requires Bearer access token to change skin, it is possible to add direct access token to account donation

Describe the solution you'd like
Add an option to account donation something like "Access token"

Describe alternatives you've considered

Additional context

Timestamps can be floating point numbers

What steps will reproduce the problem?

  1. Request Skin #2137060160 via API (https://api.mineskin.org/get/id/2137060160)
  2. Check the timestamp

What were you expecting to happen? What happened instead?

I would expect a timestamp to not be a floating point number... But when comparing to the timestamp inside texture-value, it is only a couple of ms off (when rounding) so the timestamp itself is not entirely wrong.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.