How to build a chaturbate bot

cristid9

Newbie
Joined
Dec 10, 2022
Messages
4
Reaction score
3
Hello,

I've been trying for a while to code a chaturbate viewers bot in python. I was successful and it was preatty easy with selenium headless to generate ~25-50 anonymous viewers, but this approach is not scalable.

I was trying to reverse engineer/crack the api calls that chaturbate does in order to record a new viewer. Like copying the cURL request from the network console in chrome and reproducing it in postman. It didn't work. Even exporting all the calls that chaturbatte is making when accessing a model page in to a HAR file and then manually executing that file from python didn't work.

They must create some sort of cookie that differentiate each user such that the request cannot be duplicated. I couldn't figure it out. If there's anyone who done this before can you help me with a hint?
 
Do views from the embedded video players/chat (provided for affiliates) not increase the view count?
 
Hello,

I've been trying for a while to code a chaturbate viewers bot in python. I was successful and it was preatty easy with selenium headless to generate ~25-50 anonymous viewers, but this approach is not scalable.

I was trying to reverse engineer/crack the api calls that chaturbate does in order to record a new viewer. Like copying the cURL request from the network console in chrome and reproducing it in postman. It didn't work. Even exporting all the calls that chaturbatte is making when accessing a model page in to a HAR file and then manually executing that file from python didn't work.

They must create some sort of cookie that differentiate each user such that the request cannot be duplicated. I couldn't figure it out. If there's anyone who done this before can you help me with a hint?
It sounds like Chaturbate is using fingerprinting techniques beyond just cookies, possibly WebSockets, unique session tokens, or behavioral tracking. You might need to analyze JavaScript execution to see how they generate those identifiers. Have you tried using a headless browser with a pool of residential proxies and randomized fingerprints (e.g., Puppeteer with stealth mode or Playwright)?
 
Have you tried using a bot detection service? That might help you identify and bypass any anti-bot measures that Chaturbate may have in place.
 
You might be able to spoof the user agent and play around with timing to avoid detection, this method can work in some cases
 
I think they are using logged in verified users

I believe it counts anonymous viewers as well.

Screen Shot 2025-06-24 at 2.58.02 PM.png
 
class AntiBan:
def __init__(self):
self.ultimo_msj_time: Dict[int, float] = {}
self.proxies: List[str] = self._cargar_proxies()

def _cargar_proxies(self) -> List[str]:
try:
with open("proxies.txt", "r") as f:
return [line.strip() for line in f if line.strip() and not line.startswith("#")]
except:
return []

def get_chrome_args(self, idx_persona: int) -> List[str]:
args = CHROME_ARGS_BASE.copy()
args.append(f"--user-agent={random.choice(USER_AGENTS)}")

if self.proxies:
proxy = self.proxies[idx_persona % len(self.proxies)]
args.append(f"--proxy-server={proxy}")

return args

def get_stealth_scripts(self) -> List[str]:
scripts = STEALTH_SCRIPTS.copy()
scripts.extend(CANVAS_SCRIPTS)
scripts.extend(WEBGL_SCRIPTS)
return scripts

def delay_humano(self, min_ms: int = 100, max_ms: int = 800):
time.sleep(random.uniform(min_ms, max_ms) / 1000)

def delay_entre_mensajes(self, idx_persona: int):
config = get_config()

if idx_persona not in self.ultimo_msj_time:
self.ultimo_msj_time[idx_persona] = 0

ahora = time.time()
tiempo_transcurrido = ahora - self.ultimo_msj_time[idx_persona]

if tiempo_transcurrido < config.tiempo_min_msj:
espera = random.uniform(config.tiempo_min_msj, config.tiempo_max_msj)
time.sleep(espera)

self.ultimo_msj_time[idx_persona] = time.time()

def debe_hacer_scroll(self) -> bool:
config = get_config()
return random.random() < config.probabilidad_scroll

def debe_callar(self) -> bool:
config = get_config()
return random.random() < config.probabilidad_callar

def get_viewport(self) -> Dict:
viewports = [
{"width": 1920, "height": 1080},
{"width": 1366, "height": 768},
{"width": 1536, "height": 864},
{"width": 1440, "height": 900},
{"width": 1280, "height": 720},
]
return random.choice(viewports)

def get_timezone(self) -> str:
timezones = [
"Europe/Madrid",
"Europe/Paris",
"Europe/London",
"Europe/Berlin",
]
return random.choice(timezones)

def verificar_salud(self, page) -> bool:
try:
page.title()
return True
except:
return False

def reiniciar_contador(self, idx_persona: int):
self.ultimo_msj_time[idx_persona] = 0

ANTIBAN = AntiBan()

def get_anti_ban() -> AntiBan:
return ANTIBAN
 
Back
Top