<?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: KENNY</title>
    <description>The latest articles on DEV Community by KENNY (@akashmark8cloud).</description>
    <link>https://dev.to/akashmark8cloud</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4078276%2Ff367eb14-6089-4a6c-b165-7c901c4b9bd7.jpg</url>
      <title>DEV Community: KENNY</title>
      <link>https://dev.to/akashmark8cloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akashmark8cloud"/>
    <language>en</language>
    <item>
      <title>SkipLink: A Python Tool That Bypasses Ad-Driven URL Shorteners in One Click</title>
      <dc:creator>KENNY</dc:creator>
      <pubDate>Fri, 14 Aug 2026 22:57:33 +0000</pubDate>
      <link>https://dev.to/akashmark8cloud/skiplink-a-python-tool-that-bypasses-ad-driven-url-shorteners-in-one-click-111f</link>
      <guid>https://dev.to/akashmark8cloud/skiplink-a-python-tool-that-bypasses-ad-driven-url-shorteners-in-one-click-111f</guid>
      <description>&lt;h1&gt;
  
  
  SkipLink: Bypass ad-driven URL shorteners in one click
&lt;/h1&gt;

&lt;p&gt;We've all been there: someone sends you &lt;code&gt;adf.ly/xyz&lt;/code&gt; or &lt;code&gt;earn4link.in/FLf1Y1&lt;/code&gt;,&lt;br&gt;
and instead of a link you get a 5-second countdown, a popup asking you to&lt;br&gt;
enable notifications, and a fake "Top 10 hospitals" article stuffed with ads —&lt;br&gt;
&lt;em&gt;before&lt;/em&gt; you reach the actual destination. That's the &lt;strong&gt;"shorten-and-earn"&lt;/strong&gt;&lt;br&gt;
business model: the person who made the link gets paid per click, and &lt;em&gt;you&lt;/em&gt;&lt;br&gt;
pay with your time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SkipLink&lt;/strong&gt; is a free, open-source tool that unwraps those links straight to&lt;br&gt;
the real destination. No ads rendered, no timers, no fake pages.&lt;/p&gt;
&lt;h2&gt;
  
  
  What SkipLink does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Follows HTTP redirect chains &lt;em&gt;and&lt;/em&gt; interstitial pages — a shortener pointing
at another shortener keeps resolving.&lt;/li&gt;
&lt;li&gt;Recognizes &lt;strong&gt;1,537 shortener domains&lt;/strong&gt; out of the box.&lt;/li&gt;
&lt;li&gt;Decodes the usual tricks shortener pages use to hide the real link.&lt;/li&gt;
&lt;li&gt;Detects the walls it &lt;em&gt;can't&lt;/em&gt; climb — Google reCAPTCHA gates, safelink
verification pages, and ad-farm "money pages" — and says so honestly,
instead of guessing.&lt;/li&gt;
&lt;li&gt;Ships as a one-click GUI, a CLI, and prebuilt executables for Windows + Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How the engine works
&lt;/h2&gt;

&lt;p&gt;The core is 100% Python standard library — zero dependencies.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Follow redirects manually
&lt;/h3&gt;

&lt;p&gt;SkipLink sends one HTTP request with a real-browser User-Agent (cookies kept&lt;br&gt;
across hops), but &lt;strong&gt;does not follow redirects automatically&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp_headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp_headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;303&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;307&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;308&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;urljoin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;_clean_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Extract the destination from interstitial pages
&lt;/h3&gt;

&lt;p&gt;If the response is an HTML/JSON page instead of a redirect, the engine scans it&lt;br&gt;
for the embedded destination. It handles, among others:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;meta http-equiv="refresh"&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;location.href = "..."&lt;/code&gt; / &lt;code&gt;window.open("...")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;var link = "..."&lt;/code&gt; / &lt;code&gt;var url = "..."&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atob("...")&lt;/code&gt; (base64) and &lt;code&gt;unescape("...")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Skip/continue button anchors, &lt;code&gt;data-*&lt;/code&gt; attributes, iframes&lt;/li&gt;
&lt;li&gt;JSON APIs (&lt;code&gt;{"destination": "..."}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A bare URL in a plain-text response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every extracted candidate is filtered against a blocklist of ad/tracker CDNs&lt;br&gt;
(doubleclick, taboola, adsterra, ...) so ads are never followed.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Stop at the real destination — or report the wall
&lt;/h3&gt;

&lt;p&gt;The resolver stops when a page has no further redirect and no embedded link.&lt;br&gt;
Then it classifies what that page is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Captcha gate&lt;/strong&gt; — Google reCAPTCHA / "human verification" → &lt;em&gt;can't be
auto-bypassed; only a real human in a real browser gets the link.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safelink gate&lt;/strong&gt; — wp-safelink "click to continue" locks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money page&lt;/strong&gt; — a big filler article whose only purpose is showing ads, with
no real off-site content links.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;protection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_protection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;protection_note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;protection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Optional: real-browser mode
&lt;/h2&gt;

&lt;p&gt;Some hardened shorteners only reveal the destination when JavaScript runs.&lt;br&gt;
SkipLink can drive a headless Chromium via Playwright, wait out countdowns,&lt;br&gt;
and auto-click skip/continue/get-link buttons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-browser.txt
playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
skiplink &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"https://ouo.io/xyz"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python main.py &lt;span class="s2"&gt;"https://adf.ly/AbCdEf"&lt;/span&gt;          &lt;span class="c"&gt;# one link&lt;/span&gt;
python main.py &lt;span class="nt"&gt;-f&lt;/span&gt; links.txt                     &lt;span class="c"&gt;# a file of links&lt;/span&gt;
python main.py &lt;span class="nt"&gt;-j&lt;/span&gt; url1 url2                     &lt;span class="c"&gt;# JSON output for scripting&lt;/span&gt;
python main.py &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"https://ouo.io/xyz"&lt;/span&gt;          &lt;span class="c"&gt;# browser mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  As a library
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;skiplink&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;resolve&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://adf.ly/AbCdEf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;final&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# the destination URL
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOTE:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# e.g. "Captcha-gated ..."
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GUI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python gui.py   &lt;span class="c"&gt;# or double-click the prebuilt app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste a link, press Enter, and the chain is resolved in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo + releases: &lt;a href="https://github.com/akashmark8-cloud/skiplink" rel="noopener noreferrer"&gt;https://github.com/akashmark8-cloud/skiplink&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Prebuilt Windows/Linux binaries in the Releases page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it saves you time and ad-hassle, a star or a sponsor keeps the coffee&lt;br&gt;
flowing: &lt;a href="https://github.com/sponsors/akashmark8-cloud" rel="noopener noreferrer"&gt;https://github.com/sponsors/akashmark8-cloud&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MIT licensed, 20 unit tests, core runs with zero dependencies.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tools</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
