FPW: Fast Python Worker / Feieryun PHP Worker
本程序使用了 HTTP 长轮询技术 连接到 飞儿云平台,将本地的 WEB 服务传输到公网,从而实现远程访问本地服务。
默认传输到本地服务 http://127.0.0.1/<url>
,如果你想修改这个默认的地址,可以修改代码实现。
你可以自定义转发的域名前缀,例如:xxxxx
,这样就可以通过 xxxxx.28820.com
来访问本地的服务。如果未设置环境变量 FPW_HOST
,则默认自动生成作为域名前缀,如:moon-flower-snake-red-apple.28820.com
。
服务特点:
-
每个用户每天没有使用次数和流量限制
-
可以自定义域名前缀
-
目前支持 HTTP 协议中的多种请求方式
- 包括但不限于:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、TRACE
- websocket 协议等暂不支持
-
支持 HTTPS 协议
-
目前使用 Cloudflare CDN 加速,将来可能会使用其他的 CDN 加速
-
安装 python
-
安装 requests 库
pip install requests
-
【可选】修改 环境变量
FPW_HOST = 'xxxxx.28820.com' # xxxxx为自定义域名前缀
-
运行 main.py ~~
python main.py
-
访问你的域名 ~~
下面是本程序的工作原理,如果你想自己实现一个类似的程序,可以参考这个原理。
代码使用的是 Python,但是原理是通用的。
-
发起 POST 请求到飞儿云的API,创建失败将返回错误信息,创建成功将会保持连接,直到有访客访问这个域名。
-
POST请求的内容为:
url = 'https://' + FPW_HOST + '/' header = { 'fpw-host': FPW_HOST, 'fpw-token': FPW_TOKEN, 'user-agent': 'php-worker-v1', 'content-type': 'application/octet-stream' } body = ''
-
发起请求
r = requests.post(url, headers=header, data=body)
-
如果此时有访客访问这个域名,刚才发起的 POST 请求将会返回访客的请求信息,包括请求头和请求体。
-
访客的请求头将会以json格式在飞儿云响应头
fpw-header
中返回forward_header = json.loads(r.headers["fpw-header"])
-
访客的请求体将会以二进制数据在飞儿云响应体中返回
forward_body = r.content
-
访客的请求将被分配一个唯一的
fpw-id
,这个fpw-id
将会在后续的回复请求中被使用,用于标识这个请求fpw_id = r.headers["fpw-id"]
-
访客请求的IP地址,请求地址和请求方法将会在飞儿云响应头
fpw-ip
,fpw-url
和fpw-method
中返回user_ip = r.headers["fpw-ip"] forward_url = r.headers["fpw-url"] forward_method = r.headers["fpw-method"]
-
-
将访客的请求信息转发到本地的服务
r = requests.request(forward_method, forward_url, headers=fpw_header, data=fpw_body)
-
将本地服务的响应信息转发到飞儿云 将本地服务的响应头和响应体分别放到飞儿云的请求头和请求体中,发送给飞儿云
url = 'https://' + FPW_HOST + '/' header = { 'fpw-host': FPW_HOST, 'fpw-token': FPW_TOKEN, 'fpw-id': fpw_id, # 用于标识这个请求 'fpw-status' = r.status_code, # 本地服务的响应状态码 'fpw-header' = r.headers, # 本地服务的响应头 'user-agent': 'php-worker-v1', 'content-type': 'application/octet-stream' } body = r.content # 本地服务的响应体
-
飞儿云将会将这个请求的响应信息发送给访客,并且这个请求将被挂起,直到有新的访客访问这个域名。
-
重复 1.3 - 4 步骤,直到程序退出。
注意:发起的 POST 请求连接可能会被断开,这时候需要重新发起 POST 请求。如果没有在线的 Worker,访问域名将返回默认的飞儿云页面。