Skip to content

Latest commit

 

History

History
263 lines (209 loc) · 7.28 KB

README.md

File metadata and controls

263 lines (209 loc) · 7.28 KB

fpp (free proxy pool)免费代理池

介绍

这是一个基于Golang开发的免费HTTP代理池。定时采集网上发布的免费代理验证并入库,同时你也可以在extractors下扩展代码来增加代理IP池的数量。

新特性与未来规划

(最近在忙其他项目,此暂停维护一段时间,有能力可以clone仓库改改,欢迎Pr呦~2022/04/02) 比较仓促,代码未优化

  • 抓取校验:自动抓取公开代理网站并校验入库
  • 集成代理自动切换IP(实验):其他需要代理IP的项目再也不用主动维护代理池啦,所有请求设置这个fpp代理池的代理服务器后,fpp会自动为每个请求随机切换IP。让您倾注于数据业务的开发。
  • 全球IP扫描模块:自动扫描可用代理并验证入库
  • 付费代理集成或自有代理导入:在自动切换IP的基础上集成付费代理或导入自有代理,美滋滋,需要使用代理的程序只需要请求时设置fpp的代理后就可以直接使用高可用的代理了。

下载与运行

下载

前往https://github.com/HaliComing/fpp/releases,下载适用于您目标机器操作系统、CPU架构的主程序,解压直接运行即可。

运行

# 解压程序包
tar -zxvf fpp_VERSION_OS_ARCH.tar.gz

# 赋予执行权限
chmod +x ./fpp

# 启动 fpp
./fpp

配置

首次直接运行会生成conf.ini配置文件,首次请勿自己创建。

[System]
; 是否Debug运行,默认false
; Debug = false
; api的HTTP监听端口,默认9826
Listen = :9826
; 代理服务器的HTTP监听端口,默认9827。建议关闭此端口的防火墙。
ProxyListen = :9827
; 检测线程数,默认50
NumberOfThreads = 70
; Token 默认会随机生成
Token = STO64ysaLOte9J732YF1aw1Gf17xsnTV
; IP提取时间间隔,单位分钟,默认60
ExtractionInterval = 45
; 检测时间间隔,单位分钟,默认15
CheckInterval = 10

[Database]
; 数据库类型,支持memory和sqlite3,默认sqlite3
; 由于memory类型会导致no such table,暂时不推荐,如果您能解决欢迎issue讨论。
Type = sqlite3
; Type为sqlite3时启用此字段,数据库名称
DBFile = fpp.db

[SSL]
; api的HTTPS监听端口
Listen = :443
; 证书位置
CertPath = cert
; key位置
KeyPath = key

接口

简单的接口文档,详情请运行fpp后打开/即可查看。例如:http://localhost:9826/

api method Description
/ GET api介绍和文档
/api/v1/site/ping GET 服务连通测试
/api/v1/site/count GET 统计接口
/api/v1/proxy/random GET 随机获取一个IP接口
/api/v1/proxy/all GET 分页查询全部IP的接口
/api/v1/proxy/delete GET 删除指定IP

构建

自行构建前需要拥有 Go >= 1.13 必要依赖。

克隆代码

git clone https://github.com/HaliComing/fpp.git

嵌入静态资源

# 回到项目主目录
# 将静态资源copy在assets/build/目录下

# 安装 statik, 用于嵌入静态资源
go get github.com/rakyll/statik

# 开始嵌入
statik -src=assets/build/  -include=*.html,*.ico,*.icon -f

编译项目

您可以选择在Releases界面下载已编译好的二进制文件。手动编译如下:

# 开始编译
# 必须开启CGO_ENABLED
SET CGO_ENABLED=1

go build -a -o fpp.exe -ldflags "-s"

提取器目录

不分先后顺序,如果您有更好的代理网站欢迎提交issue

代理名称 代理网址 提取器包名
齐云代理 www.7yip.cn yip7
66免费代理 www.66ip.cn ip66
89免费代理 www.89ip.cn ip89
全网代理IP www.goubanjia.com goubanjia
IP3366云代理 www.ip3366.net ip3366
高可用全球免费代理IP库 ip.jiangxianli.com jiangxianli
快代理 www.kuaidaili.com kuaidaili
ProxyList+ list.proxylistplus.com proxylistplus
方法SEO代理 seofangfa.com seofangfa
速代理 www.sudaili.com sudaili
西拉免费代理IP www.xiladaili.com xiladaili

添加自定义提取器

首先download代码后,在extractors文件夹中创建需要抓取的代理网站文件夹和go文件,并实现Extract接口,以下以example.com举例。

目录
extractors  #提取器文件夹
|--example  #示例提取器
|--|--example.go  #示例提取器代码
|--|--example_test.go #示例提取器测试代码
|--extractors.go #提取者

example.go,只需要修改Key接口和Extract接口即可。

package example

import (
	"github.com/HaliComing/fpp/extractors/types"
	"github.com/HaliComing/fpp/models"
	"github.com/HaliComing/fpp/pkg/request"
	"github.com/PuerkitoBio/goquery"
	"net/http"
	"regexp"
	"strings"
)

type extractor struct{}

// New returns a extractor. 
func New() types.Extractor {
	return &extractor{}
}

// 修改此方法
func (e *extractor) Key() string {
    // 改为代理网站的域名,不带http前缀
	return "www.example.com"
}

// Extract is the main function to extract the data.
func (e *extractor) Extract() ([]*models.ProxyIP, error) {
	var proxyIPs []*models.ProxyIP
	// 抓取数据的代码,可参考其他提取器代码,代码很简陋,有更好的可以提issue或pr
    // ...
    // proxyIP := &models.ProxyIP{
	//		IP:   ip, //只需要填充IP和Port,其他勿填
	//		Port: port,//只需要填充IP和Port,其他勿填
	//	}
    //proxyIPs = append(proxyIPs, proxyIP)
	return proxyIPs, nil
}

example_test.go别忘了测试类,如无其他情况测试类无需改动。

package example

import (
	"fmt"
	"testing"
)

// 测试提取
func TestExtract(t *testing.T) {
	extract, err := New().Extract()
	if err != nil {
		fmt.Println(err)
	} else {
		for _, ip := range extract {
            // 打印出提取出来的代理
			fmt.Printf("%s:%s\n", ip.IP, ip.Port)
		}
	}
}

extractors.goinit方法添加示例提取器。

func init() {
	extractors = []types.Extractor{
		yip7.New(),
		ip66.New(),
		ip89.New(),
		goubanjia.New(),
		ip3366.New(),
		jiangxianli.New(),
		kuaidaili.New(),
		proxylistplus.New(),
		seofangfa.New(),
		sudaili.New(),
		xiladaili.New(),
		example.New(),// 添加示例提取器,注意后面的逗号
	}
}

代理服务自动切换IP(实验)

这是一个模拟请求的python脚本。api.ipify.org是一个获取本机IP地址的接口,使用代理池的代理服务器请求会为每次请求随机切换代理IP。

import requests

def test():
    rsp = requests.get("http://api.ipify.org/",proxies={"http": "localhost:9827"})
    return rsp.text

print(test())
print(test())
print(test())

终端执行后结果如下。可以看到每次请求返回结果都会显示不同的IP地址。

>$ python main.py
223.96.90.216
151.106.18.124
120.133.231.92

>$ 

最后

  • 首先感谢您的使用,如果喜欢本程序,不妨给个star
  • 若您发现bug或者建议,欢迎提交issue
  • 若您愿意贡献代码那就更棒啦,欢迎提交Pr