DEV Community

SkipLink: A Python Tool That Bypasses Ad-Driven URL Shorteners in One Click

SkipLink: Bypass ad-driven URL shorteners in one click We've all been there: someone sends you adf.ly/xyz or earn4link.in/FLf1Y1 , and instead of a link you get a 5-second countdown, a popup asking you to enable notifications, and a fake "Top 10 hospitals" article stuffed with ads - before you reach the actual destination. That's the "shorten-and-earn" business model: the person who made the link gets paid per click, and you pay with your time. SkipLink is a free, open-source tool that unwraps those links straight to the real destination. No ads rendered, no timers, no fake pages. What SkipLink does - Follows HTTP redirect chains and interstitial pages - a shortener pointing at another shortener keeps resolving. - Recognizes 1,537 shortener domains out of the box. - Decodes the usual tricks shortener pages use to hide the real link. - Detects the walls it can't climb - Google reCAPTCHA gates, safelink verification pages, and ad-farm "money pages" - and says so honestly, instead of guessing. - Ships as a one-click GUI, a CLI, and prebuilt executables for Windows + Linux. How the engine works The core is 100% Python standard library - zero dependencies. 1. Follow redirects manually SkipLink sends one HTTP request with a real-browser User-Agent (cookies kept across hops), but does not follow redirects automatically: status, resp_headers, body = _fetch(opener, current, timeout, headers) location = resp_headers.get("Location") if status in {300, 301, 302, 303, 307, 308} and location: current = urljoin(current, _clean_url(location)) 2. Extract the destination from interstitial pages If the response is an HTML/JSON page instead of a redirect, the engine scans it for the embedded destination. It handles, among others: - location.href = "..." /window.open("...") - var link = "..." /var url = "..." - atob("...") (base64) andunescape("...") - Skip/continue button anchors, data-* attributes, iframes - JSON APIs ( {"destination": "..."} ) - A bare URL in a plain-text response Every extracted candidate is filtered against a blocklist of ad/tracker CDNs (doubleclick, taboola, adsterra, ...) so ads are never followed. 3. Stop at the real destination - or report the wall The resolver stops when a page has no further redirect and no embedded link. Then it classifies what that page is: - Captcha gate - Google reCAPTCHA / "human verification" โ†’ can't be auto-bypassed; only a real human in a real browser gets the link. - Safelink gate - wp-safelink "click to continue" locks. - Money page - a big filler article whose only purpose is showing ads, with no real off-site content links. result["protection"] = detect_protection(text, current) result["note"] = protection_note(result["protection"]) Optional: real-browser mode Some hardened shorteners only reveal the destination when JavaScript runs. SkipLink can drive a headless Chromium via Playwright, wait out countdowns, and auto-click skip/continue/get-link buttons: pip install -r requirements-browser.txt playwright install chromium skiplink -b "https://ouo.io/xyz" Using it CLI python main.py "https://adf.ly/AbCdEf" # one link python main.py -f links.txt # a file of links python main.py -j url1 url2 # JSON output for scripting python main.py -b "https://ouo.io/xyz" # browser mode As a library from skiplink import resolve result = resolve("https://adf.ly/AbCdEf") print(result["final"]) # the destination URL if result["note"]: print("NOTE:", result["note"]) # e.g. "Captcha-gated ..." GUI python gui.py # or double-click the prebuilt app Paste a link, press Enter, and the chain is resolved in seconds. Try it - Repo + releases: https://github.com/akashmark8-cloud/skiplink - Prebuilt Windows/Linux binaries in the Releases page. If it saves you time and ad-hassle, a star or a sponsor keeps the coffee flowing: https://github.com/sponsors/akashmark8-cloud MIT licensed, 20 unit tests, core runs with zero dependencies. Top comments (0)

Read on DEV Community ↗ ← Back to News

Comments

No comments yet. Start the discussion.