Skip to main content
Roolink talks to Roolink. Everything that reaches the target site goes through a client you own, and the site reads that client’s connection before it reads a single byte of payload. Python’s requests, Go’s net/http and Node’s fetch each have a handshake of their own, and bot protection knows all three. This page builds a client whose handshake is Chrome’s.

Create the client

One constructor call sets everything the site fingerprints at connection time. Build it once per session and pass it around.
The three libraries wrap the same engine, so a profile name means the same thing in every language and the rest of these docs treat them interchangeably. The Python library installs from GitHub with pip install git+https://github.com/Nintendocustom/Python-Tls-Client.git and downloads the shared library it wraps on first use, so it keeps up with new Chrome profiles without a package release.

Send headers in the browser’s order

Chrome sends headers in a fixed order that differs between a page load, a script load and a post from a script. Most HTTP libraries reorder headers silently; these clients let you pin the order, and you should on every request. The order comes from your powhttp recording, never from memory or from a guide.
In Go, the pseudo-header order matters too. Chrome sends :method, :authority, :scheme, :path, and the line above pins it. Python and Node set that order for you.

Choose a proxy

The site ties its cookies to the IP that earned them. Change IP mid-session and every cookie you hold is worthless.
  • Sticky, not rotating. The proxy must keep one IP for as long as you ask. Start a new proxy session when you start a new browsing session, not partway through one.
  • Residential, not datacenter. Addresses from consumer internet providers score well; datacenter ranges score badly regardless of what you send.
  • Region matches the site and the headers. Pick a proxy in the site’s home market and set Accept-Language to match. A US proxy with en-US,en;q=0.9 is the usual pairing, and the language you send Roolink should name the same language; a tag or the full header value both work.
To confirm the proxy holds, request https://api.ipify.org through the client twice, a minute apart. Same IP both times, and not your own.

One client per identity

A browser is one thing: one User-Agent, one handshake, one IP, one set of cookies. Keep that true in your code.
  • Create a client per session and never share a cookie jar between sessions.
  • Send the same User-Agent to the site and to Roolink, and keep the sec-ch-ua* headers in agreement with it. Supported browsers has the details.
  • Release the client when the session ends. In Node call destroySession() on the session client and terminate() on the module client at shutdown; in Python call site.close(); in Go let the client go out of scope.

Run it through powhttp

To compare your client with Chrome, point it at powhttp instead of your proxy for one run:
powhttp records the handshake and the headers your client sent, next to Chrome’s from the same site. Capture requests with powhttp shows what to compare. Switch the proxy back before a real run; while your client goes through powhttp the site sees your own IP.