Featured image of post PureVPN WireGuard 自动化:用 Python 登录并生成配置(curl_cffi 实战)

PureVPN WireGuard 自动化:用 Python 登录并生成配置(curl_cffi 实战)

实战记录:用 Python 与 curl_cffi 处理 Cloudflare 指纹校验,登录 PureVPN 并调用 API 自动生成 WireGuard 配置;包含参数来源、地区选择示例。

省流,如果不想看思路直接翻到最下面

前言

前两天有个130%返现的这玩意

上车了以后发现wireguard只能用15分钟,要延长时间还要交钱,交钱了还没完,还不是永久,只是一个小时

这你能忍?反正我忍不了

我直接爬虫启动,简要思路参考如下

  • 分析http请求
  • 被cloudflare403要求轮询登陆了,看了一眼也没有什么比较可疑的请求头,猜测是浏览器指纹导致的轮询,开curl_cffi绕cloudflare的指纹爬虫检查完成登陆
  • 有个参数需要逆向js,稍微逆向了一下,看半天js结果其实就是wireguard生成的公钥私钥
  • 调接口生成wireguard配置,下班

爬虫原神启动

登陆

https://auth.purevpn.com/oauth2/authorize -> 302 跳转两次 -> https://my.purevpn.com/v2/api/fusionauth/login 返回关键参数 fa_token, 填入autorization和cookie完成登陆

这里单纯用requests库会卡cloudflare指纹验证,我就换成了curl_cffi.request, 秒绕过

爬虫业务逻辑

api base为 https://my.purevpn.com

接口 请求方法 content-type 关键参数 作用
/v2/api/wireguard/get-encrypt-password POST application/x-www-form-urlencoded username 生成一个临时password供请求下面接口
/v2/api/wireguard/get-wg-server POST application/x-www-form-urlencoded sUsername,sPassword,sClientPublicKey 根据sClientPublicKey正式生成wireguard配置并激活服务端wireguard的peer

第一个接口分析,这个username是固定的,可以post /v2/api/on-boarding返回的json可以获得[“body”][“subscriptions”][0][“vpnusernames”][0]

可以拿到get-wg-server接口需要的password

关键数据获取如下

  • sid 还是/v2/api/on-boarding 返回json的数据中 [“body”][“subscriptions”][0][“id”]
  • spassword和susername, 都是get-encrypt-password已知的参数
  • sClientPublicKey, 可以根据wg的公私钥生成算法获取
  • iCityId和sCountrySlug都是对应的地区固定的,可以GET https://my.purevpn.com/v2/api/manual/configuration 获得一个json然后自己找对应地区

返回数据,我们关心的就是body.wireguard_configuration, 把{clientPrivatekey}替换成刚才生成的就完事了

给gpt5 pro提供思路,让gpt5拧螺丝吧,自己懒得写了,不得不说gpt5pro还是有点东西的,重生之我是python爬虫大神

用法

使用需要用到的库:git python3 python3-venv python3-pip

用法示例,代码在debian12测试使用通过(默认香港地区,其他地区请见仓库说明)

1
2
3
4
5
6
7
8
apt install git python3 python3-venv python3-pip
git clone https://github.com/twoonefour/purevpn-wg-auto-conf.git
cd purevpn-wg-auto-conf
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
export PUREVPN_USERNAME=xxx@example.com # 这里修改你的purevpn登陆账号
export PUREVPN_PASSWORD=xxxxx # 这里修改你的purevpn登陆密码
.venv/bin/python main.py

变量说明如下

1
2
3
4
5
6
| 名称               | 说明         | 必须项 |
|------------------|------------|-----|
| PUREVPN_USERNAME | purevpn的账号 | 是   |
| PUREVPN_PASSWORD | purevpn的密码 | 是   |
|PUREVPN_COUNTRY_SLUG| vpn地区      | 否,默认香港地区   |
|     PUREVPN_CITY_ID             | VPN地区代号    | 否,默认香港地区   |

代码是gpt写的也不是我写的,我只是改了一下比较奇怪的地方,就不贴了,自己去仓库看吧

声明

本脚本是爬虫项目,请自行承担有可能来自purevpn的封号风险

后记

可能你要说,主播主播,怎么不直接开个docker opvn客户端映射一个sock端口出来,不比这方便?

有一说一,还真是

珍惜时间,远离爬虫