Script in python that can be used for creating a self-hosted proxy for NOT SAFE FOR WORK content filtering.
- Block images in all sites using AI for classification.
- Custom AI CLI Tool can be passed as argument to use it.
- Disable AI detection if you want.
- Blacklist with more than 28000 NSFW websites.
- All resources in blacklists websites are blocked (Video, images and gifs), no is needed analyze them.
- Buffering Video NSFW classification.
- Streaming video NSFW classification.
- Websockets NSFW classification.
- NSFW Text classification.
- Adding WhiteList in case someone doesn't wanted filter content on certain page.
- Adding compatibility with more classification NSFW tools
- Web user interface for configuration once service is started instead of only command line interface.
- User interface for start, stop and configure the service.
- Improve installation documentation.
- Adding How to configure it on a router / modem for all users in a same network. (This will work for public networks which wanted filter this content and for entire families).
- Adding How to configure it on a VPS for using out of the house. (In case someone doesn't wanted use it only locally but also when he is out).
Install it using docker is the easier way to have it running on your computer if you're not familiarized with python. You will found the docker repository here, you can access and select the tag you think better fits your needs.
I prepared two types of tags for you, one of them runs nsfw_proxy without CLI Classifier Image, the other one runs the proxy with BONK ans CLI Classifier Image.
I will be creating more images for more CLI Classifier tools when they were supported.
Here is how to run the last version of NSFW Proxy with and without bonks.
This is how you could do for run the image the first time. This will create a container with a configuration that you can reuse each time you want to run the container, so you probably will use this only the first time.
mkdir -p mitmproxy-certificates && docker run -p 13000:8080 --name nsfw_proxy_bonk -v `pwd`/mitmproxy-certificates:/root/.mitmproxy heliomarpena/nsfw_proxy:latest-bonk
mkdir -p mitmproxy-certificates && docker run -p 13000:8080 --name nsfw_proxy -v `pwd`/mitmproxy-certificates:/root/.mitmproxy heliomarpena/nsfw_proxy:latest
What the above commands does is:
mkdir mitmproxy-certificates
: Creates a new folder called mitmproxy-certificates.docker run
: Pull an image from dockerhub, creates a new container using that image and then run it with the provided configuration.heliomarpena/nsfw_proxy:latest
: Run the docker repository heliomarpena/nsfw_proxy:latest (or latest-bonk depending which one you choose)-p 13000:8080
: Bind the port 13000 of your computer with the port 8080 of the container, so you can use the port 13000 to connect to the proxy that is exposed on the port 8080 of the container.-v `pwd`/mitmproxy-certificates:/root/.mitmproxy
: Creates a volume on the foldermitmproxy-certificates
for the folder/root/.mitmproxy
of the container. This will save the mitmproxy certificates between versions, so you don't need reinstall them each time you deletes your container and creates a new one.--name nsfw_proxy
: Adds a name to the container for easy future references.
Once you have already pulled, configured and created a new container you can run it normally. If you added a name to your containers you would be able to run them using:
docker start nsfw_proxy
or
docker start nsfw_proxy_bonk
Respectively to the version you decided to install.
And that's all! If you already have your container running you can go directly to Connecting to the proxy section, where you will connect to the container and use it as a proxy for filtering NSFW content from your network.
The dependencies you'll need are only Python 3.12 or bigger and any CLI AI Classifier Tool from the list of supported cli classifiers.
Name | Website | Optional | Description |
---|---|---|---|
Python | Here | No | Used for install mitmproxy and the script you'll be running in this project is written in Python |
Classifier AI Tool | See supported list here | YES | Used for classifying all images no matter its origin. E.g if you are on instagram and appears a NSFW image it will be catched by the classifier tool. |
For cloning the project only run this command or download it as zip here.
git clone https://github.com/heliomar-pena/nsfw-proxy.git
Once cloned the repository, you can install the dependencies on the requirements.txt
file. For this you can follow any guide on internet like this or try with the next command:
pip install -r requirements.txt
In case you are seeing an error similar to this: 'error:externally-managed-environment', the recommended is that you install it using the virtual env feature of python
This will create an isolated space for saving the dependencies that you're installing, so avoiding breaking your system during the installation of new dependencies. You can check the doc for more information.
python3.12 -m venv nsfw_proxy
nsfw_proxy/bin/pip install -r requirements.txt
![WARNING] This method is highly unrecommended as it could break some of your system dependencies
In case you want to keep it simple you could install the dependencies directly on your system using the next command.
pip install -r requirements.txt --break-system-packages
To run it, you need to open the file using mitmdump, which allow us to interact with the HTTP requests using python.
You can run it on your terminal, and it's installed during the installing python's dependencies step when you run pip install -r requirements.txt
command.
At the moment of run mitmdump, you need to make a call to this file and also declare the arguments that will decide the behaviour of the proxy. Here is a basic example:
mitmdump -s ./nsfw.py --set command="bonk <dir>" --set level=0.1
If you have installed it using virtual envs (venv), your mitmdump binary would be on the virtual env bin folder. here the virtual env was nsfw_proxy
and the folder would be created on the same folder where you executed the command, so if you're still on that folder you just have to run:
./nsfw_proxy/bin/mitmdump -s ./nsfw.py --set command="bonk <dir>" --set level=0.1
And here is are we doing splitted for explanation:
mitmdump
: Calling mitmdump command which starts an HTTP proxy server and allow us to use a python script to interact with him.-s
: Short way to say script, allow insert a script as option./nsfw.py
: The path to thensfw.py
file that you cloned from this repo--set
: Allow you insert arguments that will be used for the script.command="bonk <dir>"
: First argument for the script, which says to the script what command to use. The<dir>
is a reserved key that will be replaced on the program for the path of the image, so the CLI Tool can use this path to get the image and analyze it.--set
: Allow you to insert another argument to the script.level=0.1
: NSFW Classifiers Tools as Bonk gives you a level of NSFW that can have an image. Here you can configure what is the min level for you to considerate an image NSFW.
![NOTE] In case you installed it on a virtual env, you probably should run it from your virtual env folder, if you only copied and pasted the script above, then it will be
nsfw_proxy
and will be on the same folder were you executed the command. For examplensfw_proxy/bin/python mitmdump -s ./nsfw.py --set command="bonk <dir>" --set level=0.1
As you can see above, you need to run the command:
mitmdump -s ./nsfw.py
Then you can modify the behaviour of the script using --set
to insert arguments and so define which CLI tool to use for analyzing images, what level of NSFW would you like to allow, etc...
In this section you will see all the commands that you can pass to --set
and its allowed values.
Name | Optional | Default value | Value Type | Example values | Note |
---|---|---|---|---|---|
command | ✅ | "" | str | bonk <dir> |
It should include <dir> which is the slot where the script will include the image's path |
level | ✅ | 0.3 | float | 0.1 | You can use a float or an integer: 0.1, 0.2, 1, 3 |
[!NOTE] https://docs.mitmproxy.org/stable/concepts-certificates/ Mitmproxy can decrypt encrypted traffic on the fly, as long as the client trusts mitmproxy’s built-in certificate authority. Usually this means that the mitmproxy CA certificate has to be installed on the client device.
Before start navigating using our proxy we need to install the certificates. At this moment, if you try to connect to the proxy and then navigate on the web probably you'll found a message rejecting the conection and some warnings, this is because your browser or your computer doesn't trust in the proxy and needs the certificates to trust in him.
As we are using a mitmproxy proxy, we will install its certificates. To do this, you will need to follow the next steps:
- Start the project as explained above
- Go to mitm.it, then download the certificates and follow the instructions for your device or browser.
- Check if connection works with pages like https://www.github.com or https://google.com.
This will vary depending of if you wants to install it on an Operative System as Android, iOs, Linux, Windows, Mac or on a browser like Safari, Firefox, Chrome, etc...
In all cases, you will need the proxy URL, which by default is localhost:8080
, where 8080
is the port where the proxy is running on your network. If you want change the port you can use the option --listen-port
, by example mitmdump -s ./nsfw.py --listen-port 8081
.
Then, you can follow the instructions on the web for the system you have:
If your system doesn't appear here just search it is just that there is too many variety of systems and versions to include all of them here. You can search your specific case in Google and I am sure you will found the solution.