<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mahdi Hasan Shuvo</title>
    <description>The latest articles on DEV Community by Mahdi Hasan Shuvo (@mahdi-hasan-shuvo).</description>
    <link>https://dev.to/mahdi-hasan-shuvo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3939483%2F9788ec36-a68d-4515-bbde-716e881ce7ea.gif</url>
      <title>DEV Community: Mahdi Hasan Shuvo</title>
      <link>https://dev.to/mahdi-hasan-shuvo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahdi-hasan-shuvo"/>
    <language>en</language>
    <item>
      <title>What Is Browser Fingerprinting? How Sites Identify Your Browser Without Cookies</title>
      <dc:creator>Mahdi Hasan Shuvo</dc:creator>
      <pubDate>Wed, 21 Oct 2026 09:06:16 +0000</pubDate>
      <link>https://dev.to/mahdi-hasan-shuvo/what-is-browser-fingerprinting-how-sites-identify-your-browser-without-cookies-45c6</link>
      <guid>https://dev.to/mahdi-hasan-shuvo/what-is-browser-fingerprinting-how-sites-identify-your-browser-without-cookies-45c6</guid>
      <description>&lt;p&gt;Delete your cookies and a website can still recognise your browser when you come back. Not by magic, and not by your IP address alone — by reading dozens of small, ordinary details your browser happily reports to every page you visit, and combining them into a pattern that is very likely to be &lt;em&gt;yours&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That pattern is a &lt;strong&gt;browser fingerprint&lt;/strong&gt;. This guide explains what goes into one, why sites collect it, why the &lt;em&gt;consistency&lt;/em&gt; of the signals matters more than any single value, and how you can see your own fingerprint today.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fingerprint is a combination, not a single setting
&lt;/h2&gt;

&lt;p&gt;No single browser property identifies you. Your screen resolution is shared by millions of people. Your timezone is shared by a whole region. Fingerprinting works because the &lt;strong&gt;combination&lt;/strong&gt; is rare.&lt;/p&gt;

&lt;p&gt;The Electronic Frontier Foundation demonstrated this in 2010 with its Panopticlick study (now continued as Cover Your Tracks): from hundreds of thousands of visitors, the combination of browser-reported details was unique for the large majority of them. The more unusual your setup — rare fonts, an uncommon screen size, a niche GPU — the more you stand out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signals a page can read
&lt;/h2&gt;

&lt;p&gt;A website does not need special permission to read most of these. They are exposed by normal web APIs that legitimate features depend on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device and browser identity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User-Agent and Client Hints&lt;/strong&gt; — browser name and version, operating system, device model class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen properties&lt;/strong&gt; — resolution, available window area, colour depth, device pixel ratio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware hints&lt;/strong&gt; — CPU core count (&lt;code&gt;hardwareConcurrency&lt;/code&gt;) and device memory class.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Graphics stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canvas fingerprinting&lt;/strong&gt; — the page draws an invisible image and reads back the exact pixels. Different GPUs, drivers and font-rendering stacks produce slightly different results, so the pixel hash acts as a device signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebGL fingerprinting&lt;/strong&gt; — renderer and vendor strings (for example, the exact GPU model reported by ANGLE/Direct3D or Metal), plus supported extensions and rendering parameters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;System configuration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installed fonts&lt;/strong&gt; — historically enumerable directly; today usually inferred by measuring rendered text. A font list says a lot about your OS, language packs and installed software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timezone and locale&lt;/strong&gt; — the JavaScript timezone, language list, date/number formatting. These should match where your connection appears to come from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio context&lt;/strong&gt; — subtle differences in how the audio stack processes a test signal (&lt;code&gt;AudioContext&lt;/code&gt; fingerprinting).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Network and behaviour-adjacent signals&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IP address and connection type&lt;/strong&gt; — not part of the browser fingerprint itself, but sites correlate the two. A fingerprint that says "Berlin desktop" arriving from an IP in another country, with a mismatched timezone, is exactly the kind of contradiction risk systems look for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebRTC&lt;/strong&gt; — can expose local/network addresses in some configurations if not handled carefully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why websites collect fingerprints
&lt;/h2&gt;

&lt;p&gt;Fingerprinting has legitimate uses, and it is worth being honest about that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fraud and account security&lt;/strong&gt; — a bank noticing your account suddenly logging in from a fingerprint it has never seen is protecting you, not just tracking you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bot and abuse detection&lt;/strong&gt; — automated traffic often has fingerprints that are internally impossible (more on that below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics and advertising&lt;/strong&gt; — the use most people object to: recognising visitors across sites and sessions without cookies, and therefore without a cookie banner to decline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not have to like the third use to understand the technology. And understanding it matters, because most "anti-fingerprinting" advice fails for one predictable reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The consistency problem: why random values make you &lt;em&gt;more&lt;/em&gt; visible
&lt;/h2&gt;

&lt;p&gt;The instinctive response to fingerprinting is "change everything" — randomise the canvas, spoof the GPU, fake the timezone. This usually backfires, because real devices are &lt;strong&gt;internally consistent&lt;/strong&gt;, and risk systems check for exactly that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A User-Agent claiming Windows paired with fonts that only ship on macOS.&lt;/li&gt;
&lt;li&gt;A WebGL renderer naming a mobile GPU inside a "desktop" profile with 32 CPU cores.&lt;/li&gt;
&lt;li&gt;A proxy exit in one country, a timezone in a second, and browser languages from a third.&lt;/li&gt;
&lt;li&gt;A canvas hash that changes on every page load — something no real device does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real phone or laptop is one coherent device: its GPU, screen, fonts, OS, language and timezone all belong together and stay stable over time. A profile whose signals contradict each other is not "private" — it is &lt;em&gt;implausible&lt;/em&gt;, and implausibility is itself a strong detection signal.&lt;/p&gt;

&lt;p&gt;That is why serious multi-profile tooling — including NullBrowser, the product behind this site — is built around coherent device records rather than random spoofing: each profile starts from a real device configuration (GPU, screen, font set, locale) and keeps every signal consistent with it, with its own separate cookies, storage and proxy. It is also why we are direct about limits: NullBrowser's current builds run a development engine and are detectable by design, and we publish that plainly in &lt;a href="https://nullbrowser.app/faq" rel="noopener noreferrer"&gt;our FAQ&lt;/a&gt; instead of promising invisibility. No browser tool can honestly guarantee “undetectability,” and any that does is telling you something about its marketing, not its engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to see your own fingerprint
&lt;/h2&gt;

&lt;p&gt;You can check what your current browser exposes in a few minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;EFF Cover Your Tracks&lt;/strong&gt; (coveryourtracks.eff.org) — shows your fingerprint's uniqueness against their dataset and explains each signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BrowserLeaks&lt;/strong&gt; (browserleaks.com) — separate testers for WebGL, canvas, fonts, WebRTC and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AmIUnique&lt;/strong&gt; (amiunique.org) — a research project showing how your fingerprint compares to others.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the same test twice, a day apart, in your normal browser. Real devices return the &lt;em&gt;same&lt;/em&gt; result. Then try a private window or a different browser and watch how many signals move together — that contrast is the whole lesson of this article in miniature.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to reduce fingerprinting exposure (realistically)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a mainstream browser, kept updated.&lt;/strong&gt; Being one of millions with the same version and defaults is real protection; exotic setups stand out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be careful with extensions.&lt;/strong&gt; Every extension that changes page behaviour or rendering can add distinguishing signals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer browsers with built-in fingerprinting resistance&lt;/strong&gt; for everyday browsing if tracking is your concern — for example, Firefox's Enhanced Tracking Protection or Tor Browser, which is designed to make all its users look alike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For legitimate multi-account work&lt;/strong&gt; (agencies managing client accounts, QA teams reproducing a customer's device and locale, social teams running one profile per brand), use isolated profiles with coherent device identities and separate proxies per profile, and work within the terms of the sites involved. The mechanics are covered in our guide to how antidetect browsers work and the &lt;a href="https://nullbrowser.app/docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;A browser fingerprint is the combination of ordinary signals — graphics, fonts, screen, timezone, language — that together make a browser recognisable without cookies. You cannot realistically turn those signals off; the web platform needs most of them to work. What you &lt;em&gt;can&lt;/em&gt; control is whether your signals are stable and coherent, like a real device, or contradictory and random, like a costume. Sites are very good at spotting costumes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;NullBrowser is a desktop app by Dvexo that runs isolated browser profiles — each one a coherent device with its own fingerprint and proxy — with a proxy manager, an automation studio, a local API and SDKs. See &lt;a href="https://nullbrowser.app/" rel="noopener noreferrer"&gt;how it works&lt;/a&gt; or check the &lt;a href="https://nullbrowser.app/pricing" rel="noopener noreferrer"&gt;free plan&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>browser</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>automation</category>
    </item>
    <item>
      <title>Bangladesh Railway Ticket Auto-Booking Bot</title>
      <dc:creator>Mahdi Hasan Shuvo</dc:creator>
      <pubDate>Tue, 19 May 2026 06:25:41 +0000</pubDate>
      <link>https://dev.to/mahdi-hasan-shuvo/bangladesh-railway-ticket-auto-booking-bot-alm</link>
      <guid>https://dev.to/mahdi-hasan-shuvo/bangladesh-railway-ticket-auto-booking-bot-alm</guid>
      <description>&lt;h1&gt;🚆 Bangladesh Railway Ticket Auto-Booking Bot&lt;/h1&gt;
&lt;br&gt;
  &lt;h3&gt;⚡ Lightning-Fast | 🧠 Smart Captcha | 🎯 Seat-Precise | 🔐 Secure OTP&lt;/h3&gt;
&lt;br&gt;
  &lt;p&gt;&lt;strong&gt;An extraordinary high-performance automation engine that books&lt;br&gt;
      Bangladesh Railway (eticket.railway.gov.bd / Shohoz) train tickets the&lt;br&gt;
      instant they go on sale — faster than any human can blink.&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;br&gt;
  &lt;blockquote&gt;
&lt;br&gt;
    &lt;p&gt;💡 &lt;em&gt;"Stop fighting the clock. Stop refreshing pages at 8 AM. Let&lt;br&gt;
        the bot win the seat war for you."&lt;/em&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;/blockquote&gt;

&lt;h2&gt;✨ Why This Bot Is Different&lt;/h2&gt;

&lt;p&gt;Most ticket bots break the moment Cloudflare Turnstile expires their token,
  or they crash when the server rate-limits them. &lt;strong&gt;This one
    doesn't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;Built for the real world&lt;/strong&gt; — every error message, every
  Cloudflare challenge, every "ticket not available" race condition
  has been hunted down and fixed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;🎯 Feature&lt;/th&gt;
      &lt;th&gt;🚀 What It Means For You&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Multi-threaded Turnstile Pool&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;3 background solvers keep 6 fresh tokens ready 24/7 — never wait,
        never expire&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Per-Seat Fresh Tokens&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Every reservation request gets its own unexpired token — zero
        &lt;code&gt;Invalid action token&lt;/code&gt; errors&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Smart Seat Preference Engine&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Prioritize &lt;em&gt;your&lt;/em&gt; favorite seat numbers, then fall back to any
        available seat&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Parallel Seat Reservation&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Reserves multiple seats in parallel using a thread pool — wins races
        against human clickers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Scheduled Run Time&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Set it once, walk away — the bot wakes up at the exact second tickets
        open&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Auto OTP Resend&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;If you miss the SMS, the bot re-requests OTP up to 3 times
        automatically&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Auto PDF Ticket Download&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;After payment, your ticket PDF is downloaded and saved with a smart
        filename&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Rate-Limit Auto-Recovery&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Detects "wait X minutes Y seconds" responses and politely
        waits — no IP bans&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;bKash / Card / Nagad Ready&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Whatever payment method your account uses, the bot opens the right
        gateway&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;





&lt;h2&gt;🎬 Live Demo — See It In Action&lt;/h2&gt;

&lt;h3&gt;🚀 Step 1 — Bot Boots &amp;amp; Locks Onto The Trip&lt;/h3&gt;

&lt;p&gt;The instant you launch, the bot identifies your train, route, boarding point,
  and counts available seats in real time.&lt;/p&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fiamge_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fiamge_1.png" alt="Bot Startup" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;&lt;em&gt;🟢 Seat class detected · Trip ID locked · Boarding point captured · 72&lt;br&gt;
      seats available&lt;/em&gt;&lt;/p&gt;





&lt;h3&gt;⚡ Step 2 — Parallel Seat Reservation (Faster Than Human Clicks)&lt;/h3&gt;

&lt;p&gt;The bot fires multiple reservation requests in parallel, claiming your
  preferred seats before anyone else can scroll.&lt;/p&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fiamge_3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fiamge_3.png" alt="Seats Reserved" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;&lt;em&gt;🔥 3 seats locked in milliseconds: &lt;strong&gt;KA-20&lt;/strong&gt;,&lt;br&gt;
      &lt;strong&gt;KA-21&lt;/strong&gt;, &lt;strong&gt;KA-22&lt;/strong&gt; — then waits for your&lt;br&gt;
      OTP&lt;/em&gt;&lt;/p&gt;





&lt;h3&gt;✅ Step 3 — OTP Verified → Ticket Booking Confirmed!&lt;/h3&gt;

&lt;p&gt;After OTP verification, the bot finalizes the booking and opens the
  &lt;strong&gt;bKash payment gateway&lt;/strong&gt; instantly.&lt;/p&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fimage_2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Image%2Fimage_2.png" alt="Booking Confirmed" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;&lt;em&gt;🎉 &lt;code&gt;"Ticket booking is confirmed!"&lt;/code&gt; —&lt;br&gt;
      Auto-redirects to bKash for payment&lt;/em&gt;&lt;/p&gt;





&lt;h3&gt;📄 Step 4 — PDF Ticket Auto-Downloaded&lt;/h3&gt;

&lt;p&gt;The moment payment clears, your official ticket PDF is downloaded and saved
  with a smart, organized filename.&lt;/p&gt;


&lt;p&gt;📥 &lt;strong&gt;&lt;a href="Image/ticket.pdf"&gt;View Sample Ticket PDF&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;





&lt;h3&gt;💻 Terminal Output Preview&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;╔════════════════════════════════════════════════════════════╗
║  Running from folder: AC_B-D-3                             ║
║  Captcha Balance: 12.94 | IP: 103.137.67.242               ║
║  Seat class: AC_B                                          ║
║  Version: 0.0.4                                            ║
║  Your Bot is ready to work ✅                              ║
║  Waiting... 14s remaining                                  ║
║                                                            ║
║  trip_id: 8566632  route: 57904643  boarding: 110759229    ║
║  Eligible: 23 | Preferred: 4 | Others: 19                  ║
║  [1] seat reserved - KHA-3                                 ║
║  [2] seat reserved - KHA-7                                 ║
║                                                            ║
║  Enter your OTP (press Enter to wait): 5957                ║
║  ✅ OTP received, stopping resend                          ║
║  💳 Opening bKash payment gateway...                       ║
║  📄 PDF downloaded: 16_Dec_2026_SUBORNO_AC_B_ticket.pdf    ║
╚════════════════════════════════════════════════════════════╝
&lt;/code&gt;&lt;/pre&gt;





&lt;h2&gt;🧠 How It Works (The Magic Inside)&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;flowchart LR
    A[⏰ Wait For Run Time] --&amp;gt; B[🔍 Search Trips]
    B --&amp;gt; C[🎫 Get Seat Layout]
    C --&amp;gt; D[🧠 Solve Turnstile Captcha]
    D --&amp;gt; E[⚡ Reserve Seats In Parallel]
    E --&amp;gt; F[📱 Trigger OTP]
    F --&amp;gt; G[✅ Verify OTP]
    G --&amp;gt; H[💳 Confirm Booking + Open Payment]
    H --&amp;gt; I[📄 Auto Download Ticket PDF]
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
  &lt;li&gt;
&lt;strong&gt;Pre-arm phase&lt;/strong&gt; — Bot launches early, builds a pool of
    fresh Cloudflare Turnstile tokens.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Countdown phase&lt;/strong&gt; — Idles until your exact scheduled
    &lt;code&gt;run_at&lt;/code&gt; time.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Strike phase&lt;/strong&gt; — The instant tickets open, it queries
    seat-layout, filters by your preferences, and fires parallel reservation
    requests with fresh tokens.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Lock phase&lt;/strong&gt; — Triggers passenger-details OTP, you enter
    the SMS code, bot verifies.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Pay phase&lt;/strong&gt; — Confirms booking, opens your payment gateway,
    polls purchase history, and downloads the PDF the moment payment completes.
  &lt;/li&gt;
&lt;/ol&gt;





&lt;h3&gt;3️⃣ Configure &lt;code&gt;user_data.json&lt;/code&gt;
&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;{
  "token": "YOUR_RAILWAY_ACCESS_TOKEN",
  "d_ID": "YOUR_DEVICE_ID",
  "api_key": "YOUR_2CAPTCHA_API_KEY",
  "from_city": "Dhaka",
  "to_city": "Chattogram",
  "date_of_journey": "20-Dec-2026",
  "seat_class": "AC_B",
  "trip_number": "SUBORNO EXPRESS",
  "Seats_to_reserve": 2,
  "set_start": 1,
  "floor_name": "",
  "preferred_seat_numbers": ["KHA-3", "KHA-7"],
  "payment_method": 1,
  "run_at": "2026-12-15 08:00:00.000000",
  "info_user": [
    { "Name": "Your Name", "gender": "male", "passengerType": "Adult" }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;4️⃣ Run It&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;python mian.py
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The bot will sit quietly, top up its captcha pool, then strike at
  &lt;code&gt;run_at&lt;/code&gt; time.&lt;/p&gt;





&lt;h2&gt;🎨 Smart Configuration&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;🔑 Key&lt;/th&gt;
      &lt;th&gt;📝 Description&lt;/th&gt;
      &lt;th&gt;💎 Example&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
&lt;code&gt;from_city&lt;/code&gt; / &lt;code&gt;to_city&lt;/code&gt;
&lt;/td&gt;
      &lt;td&gt;Origin and destination stations&lt;/td&gt;
      &lt;td&gt;
&lt;code&gt;"Dhaka"&lt;/code&gt; → &lt;code&gt;"Chattogram"&lt;/code&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;seat_class&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Class to book&lt;/td&gt;
      &lt;td&gt;
&lt;code&gt;AC_B&lt;/code&gt;, &lt;code&gt;SNIGDHA&lt;/code&gt;, &lt;code&gt;S_CHAIR&lt;/code&gt;,
        &lt;code&gt;SHOVAN&lt;/code&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;trip_number&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Train name keyword (partial match OK)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"SUBORNO"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Seats_to_reserve&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number of seats to lock&lt;/td&gt;
      &lt;td&gt;
&lt;code&gt;1&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;preferred_seat_numbers&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Priority list — bot grabs these first&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;["KHA-3", "KHA-7"]&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;set_start&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Skip seat numbers below this&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;floor_name&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Filter coaches by floor&lt;/td&gt;
      &lt;td&gt;
&lt;code&gt;"upper"&lt;/code&gt; or &lt;code&gt;""&lt;/code&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;payment_method&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Payment gateway selector&lt;/td&gt;
      &lt;td&gt;
&lt;code&gt;1&lt;/code&gt; = bKash&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;run_at&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Exact strike time (microsecond precision)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"2026-12-15 08:00:00.000000"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;





&lt;h2&gt;🚦 Status Codes Decoded&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;🔴 Error&lt;/th&gt;
      &lt;th&gt;🟢 What The Bot Does&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;TURNSTILE_VERIFICATION_FAILED&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Silently swaps in a fresh token and retries&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Invalid or expired action token&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Auto-rotates token from the pool&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Sorry! this ticket is not available&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Moves to the next seat instantly&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Maximum 4 seats already reserved&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Stops gracefully (server hard limit)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Server Error 403&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Backs off 2 seconds and retries&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Rate limited X minutes Y seconds&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Counts down precisely and resumes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;Invalid User Access Token&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Halts and asks you to refresh login&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;





&lt;h2&gt;⚙️ Architecture Highlights&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────┐
│  🧵 Thread 1-3:  Turnstile Solver Pool (always fresh)    │
│  🧵 Thread 4:    OTP Auto-Resender                       │
│  🧵 Thread 5+:   Parallel Seat Reservation Workers       │
│  🧵 Main:        Trip Search → Layout → Confirm → PDF    │
└──────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;strong&gt;TTL-bounded token pool&lt;/strong&gt; — every token is timestamped;
    anything older than 100s is dropped before use.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Thread-safe shared state&lt;/strong&gt; — all reservation lists
    protected by locks; no race condition can double-book.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Zero recursion&lt;/strong&gt; — flat &lt;code&gt;while True&lt;/code&gt; retry loops
    mean unlimited resilience without stack overflow.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Boundary-only error handling&lt;/strong&gt; — internal helpers stay
    clean; only network edges catch exceptions.&lt;/li&gt;
&lt;/ul&gt;





&lt;h2&gt;🔒 Safety &amp;amp; Compliance&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;⚠️ &lt;strong&gt;For personal use only.&lt;/strong&gt; This tool helps individuals
    reserve their own tickets faster — it does not bypass payment, security, or
    identity verification. You still pay through the official gateway. You still
    verify with your own phone's OTP. You still submit your real passenger
    details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;✅ Uses the &lt;strong&gt;official Bangladesh Railway / Shohoz API&lt;/strong&gt; — no
    scraping, no DOM hacks.&lt;/li&gt;
  &lt;li&gt;✅ Captchas solved through &lt;strong&gt;legitimate 2Captcha service&lt;/strong&gt;
    (you pay per solve).&lt;/li&gt;
  &lt;li&gt;✅ Respects server rate limits with intelligent backoff.&lt;/li&gt;
  &lt;li&gt;❌ Not affiliated with Bangladesh Railway or Shohoz.&lt;/li&gt;
&lt;/ul&gt;





&lt;h2&gt;📈 Roadmap&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt; Multi-threaded Turnstile
    token pool&lt;/li&gt;
  &lt;li&gt; Per-seat fresh token
    rotation&lt;/li&gt;
  &lt;li&gt; Auto OTP resend&lt;/li&gt;
  &lt;li&gt; PDF auto-download&lt;/li&gt;
  &lt;li&gt; Telegram bot notifications&lt;/li&gt;
  &lt;li&gt; GUI desktop app (Electron / PyQt)&lt;/li&gt;
  &lt;li&gt; Mobile companion app&lt;/li&gt;
  &lt;li&gt; Multi-account orchestration&lt;/li&gt;
  &lt;li&gt; Smart fare-class fallback&lt;/li&gt;
&lt;/ul&gt;





&lt;h2&gt;💬 Support &amp;amp; Contact&lt;/h2&gt;

&lt;p&gt;📧 &lt;strong&gt;Need help, custom build, or premium edition?&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="https://mahdi-hasan-shuvo.github.io/Mahdi-hasan-shuvo/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FPortfolio-Visit-2CA5E0%3Fstyle%3Dfor-the-badge%26logo%3Dgoogle-chrome%26logoColor%3Dwhite" alt="Portfolio" width="172" height="28"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="mailto:shuvobbhh@gmail.com"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FEmail-shuvobbhh%2540gmail.com-D14836%3Fstyle%3Dfor-the-badge%26logo%3Dgmail%26logoColor%3Dwhite" alt="Email" width="273" height="28"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://t.me/+8801616397082" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FTelegram-%252B8801616397082-2CA5E0%3Fstyle%3Dfor-the-badge%26logo%3Dtelegram%26logoColor%3Dwhite" alt="Telegram" width="247" height="28"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://wa.me/8801616397082" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FWhatsApp-%252B8801616397082-25D366%3Fstyle%3Dfor-the-badge%26logo%3Dwhatsapp%26logoColor%3Dwhite" alt="WhatsApp" width="249" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;💬 &lt;strong&gt;Telegram / WhatsApp:&lt;/strong&gt; &lt;a href="https://wa.me/8801616397082" rel="noopener noreferrer"&gt;+8801616397082&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;💼 &lt;strong&gt;Available for freelance &amp;amp; paid projects&lt;/strong&gt; — Let's&lt;br&gt;
    build something great together!&lt;/p&gt;





&lt;h2&gt;⭐ Show Some Love&lt;/h2&gt;

&lt;p&gt;If this bot saved you from the 8 AM ticket war, drop a ⭐ on the repo — it
  really helps!&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Built with ❤️ for Bangladeshi train travelers who refuse to lose&lt;br&gt;
      the seat war.&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;&lt;code&gt;Made in Bangladesh 🇧🇩&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;project :&lt;a href="https://github.com/Mahdi-hasan-shuvo/bangladesh-railway-ticket-booking-bot" rel="noopener noreferrer"&gt;https://github.com/Mahdi-hasan-shuvo/bangladesh-railway-ticket-booking-bot&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
