Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Filter List Update

DeGrabify

Provides an up-to-date list of Grabify domains, for use by adblockers.
The goal of this project is to reduce the risk of being doxxed by unknowingly clicking on IP logger links.
This project is not associated with Grabify.

This project is made up of two parts:

  • A client which periodically retrieves a list of domains offered by the IP Logger service Grabify
  • A webserver which provides this list of domains to adblock clients

Compatible with uBlock Origin / AdBlockPlus (ABP), uBlacklist, and Hosts files
Easily self-hosted with Docker or compatible virtualization
Uses Flask, Python requests, and TinyDB

Pre-built filters

The client/server are run daily by CI, and the updated lists are pushed to this gist. If you only want the current filter list, without running your own server, use this. Note that the filter lists in this gist will not preserve historical changes over time, only the domains that are currently in-use.

Setup

You can run this project in Docker or locally. Docker is recommended.

TLDR: git clone, edit .docker/single-container-compose.yml, ./.docker/single-build.sh. For a reverse proxy, forward the server through nginx/caddy/etc, get the forwarded URL. In the compose file, set the base proxied domain, set the proxy level -p, disable the exposed port, and connect the server to your bridge network.

Docker

Server

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Consider using a reverse proxy as described below
  • Configure the container in .docker/single-container-compose.yml (or .docker/dual-container-compose.yml)
  • ./.docker/single-build.sh (or ./.docker/dual-build.sh)
  • Continue to the Client section

Updating

  • git fetch
  • git pull
    • You may need to git stash if you've made changes to the config, then merge your stashed changes into main
  • ./.docker/single-build.sh (or ./.docker/single-build.sh)

Run behind a reverse proxy

  • Change the -p value in the commands section of the server config from 0 to 1
  • Uncomment both networks: sections in the compose file. Change the name: default value to the name of your bridge network
    • This will ensure that the server is connected to the same external bridge network that your reverse proxy is running on.
  • Comment out the ports: section
  • Change the -s option in server/server.py from http://127.0.0.1:5000 to the base domain your server will be hosted on (e.g. https://degrab.example.com). If this is set incorrectly, the "Subscribe" buttons won't work but nothing else will be affected.
  • Configure your reverse proxy
    • scheme: http
    • domain: degrabify-aio-1 (or degrabify-server-1)
    • port: 5000

Development

  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • Rebuild the container with ./.docker/single-build.sh (or ./.docker/single-build.sh)
  • It may be helpful to convert the db volume to a bind mount if you need visibility into the sites.json
  • To make changes with docker compose, reference the current compose file. E.g.: docker compose -f .docker/dual-container-compose.yml --project-directory . logs --follow to view compose logs when running the dual-compose container. If using single-compose it may be easier to reference the container by name instead of using docker compose

Client

To install with your adblock or Hosts file:

  • Navigate to the webserver address in a browser
  • Click the relevant subscribe link, or follow the instructions in uBlockOrigin-HUGE-AI-Blocklist for the provided URLs.
  • Most likely you'll go to uBlock or uBlacklist and import a filter, passing it the URL
  • Don't copy-paste the list of domains into your filter list- it won't auto-update as the grabify domains change

Run locally (no Docker)

  • Install python and the pip packages flask and tinydb
  • Clone this repository
    • git clone https://github.com/JonasLong/DeGrabify
    • cd DeGrabify
  • In the console, run
    • python crawler/crawler.py -d database/sites.json
    • python server/server.py -d database/sites.json
  • If you'd like crawler.py to run on a schedule, install cron and run
    • chmod 700 crawler/cron-install.sh
    • ./crawler/cron-install.sh $(pwd)/crawler.py '0 12 * * *' $(pwd)/database/sites.json
      • The cronjob will be written to /etc/cron.d/crawl-cron. Logs will be saved in /var/log/crawl.log.
    • cron
  • Open http://127.0.0.1:5000 in a browser

Roadmap

  • Abstract list formatting into the config/.env
  • Make a ghcr build
  • Double check header specs for ublock and ublacklist
    • any missing fields?
    • figure out if "access time" field ruins caching
  • Use Flask in production
  • Pretty up the homepage
  • Better disguise crawler
  • See if the "r" param in the URL changes over time as a revision #
  • Better naming for the containers(?)

Acknowledgements

Inspired by the following projects, check them out as well:

About

Up-to-date filter lists of in-use Grabify domains, to block IP grabbing

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages