A crawler-focused forward proxy with fingerprint spoofing
Fingerproxy is a fully featured Golang-based forward proxy app with browser fingerprint spoofing. With just a few lines of code, you can enable powerful fingerprint proxy capabilities. It provides unified support for HTTP/1, HTTP/2, WebSockets protocols.
The fingerprints used in the project are generated from: fp
- Automatically switch the fingerprint based on the user-agent
- True forward proxy transmission, implemented no differently from an IP proxy server
- Simultaneous support for HTTP, HTTPS, and SOCKS5 proxy protocols on the same port
- Automatic upgrade to HTTP/2
- Simulate TLS fingerprints, HTTP/2 fingerprints, and Order headers fingerprints
- Parameter configuration via request headers, such as fingerprint settings and proxy settings
- TCP stream compression, supporting zstd, br, gzip, deflate, snappy, minlz, and other algorithms to reduce bandwidth usage
- Request body compression, enforcing server support for zstd, br, gzip, deflate, and other compressed responses to reduce bandwidth usage
| Flag | Description |
|---|---|
-mimt-root-cert string |
Path to the MITM root certificate file |
-mimt-root-key string |
Path to the MITM root key file |
| headers key | headers value | demo |
|---|---|---|
Gospider007-Fingerproxy-Spec |
Browser fingerprint with fp | |
Gospider007-Fingerproxy-Proxy |
IP Proxy | http://127.0.0.1:8080 |
Gospider007-Fingerproxy-Force-Http1 |
Force HTTP/1 protocol | true |
Gospider007-Fingerproxy-Force-Http3 |
Force HTTP/3 protocol | true |
pip install --force-reinstall git+https://github.com/gospider007/fingerproxy.gitpip install --force-reinstall git+https://gitee.com/gospider007/fingerproxy.gitfingerproxy
fingerproxy_stop
listening on: 127.0.0.1:8080
pip uninstall fingerproxyOnce the server is running on http://127.0.0.1:8080, you can make requests using any HTTP client:
curl -k "https://tools.scrapfly.io/api/fp/anything" \
-x "http://127.0.0.1:8080" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.4 Safari/537.36"import requests
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.4 Safari/537.36',
}
response = requests.get('https://tools.scrapfly.io/api/fp/anything', headers=headers, proxies=proxies, verify=False)
print(response.text)package main
import (
"crypto/tls"
"fmt"
"io"
"log"
"net/http"
"net/url"
)
func main() {
req, _ := http.NewRequest("GET", "https://tools.scrapfly.io/api/fp/anything", nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.4 Safari/537.36")
resp, err := (&http.Client{Transport: &http.Transport{
Proxy: func(r *http.Request) (*url.URL, error) {
return url.Parse("http://127.0.0.1:8080")
},
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}}).Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", bodyText)
}import axios from 'axios';
const response = await axios.get('https://tools.scrapfly.io/api/fp/anything', {
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.4 Safari/537.36'
},
proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 8080
}
});
console.log(response.data)<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://tools.scrapfly.io/api/fp/anything');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.4 Safari/537.36',
]);
curl_setopt($ch, CURLOPT_PROXY, 'http://127.0.0.1:8080');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
// 打印响应内容
if ($response === false) {
echo 'Curl error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);If you have a bug report or feature request, you can open an issue
If you have questions, feel free to reach out to us in the following ways:
If you like and it really helps you, feel free to reward me with a cup of coffee, and don't forget to mention your github id.
|
Alipay |
This project is licensed under the Mozilla Public License 2.0 (MPL-2.0) with additional author attribution requirements.
See the LICENSE file for details.


