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.pip install requests typing_extensions git+https://github.com/Nintendocustom/Python-Tls-Client.git@dc08ba51b747511b56d3a418896b7504453d7c27. It downloads the shared library it wraps on first use. The pin is updated here when a newer Chrome profile is needed.
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.: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-Languageto match. A US proxy withen-US,en;q=0.9is the usual pairing, and thelanguageyou send Roolink should name the same language; a tag or the full header value both work.
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 andterminate()on the module client at shutdown; in Python callsite.close(); in Go let the client go out of scope.