飞书配置及frp反代过程记录
环境及需求
- 公网服务器A,假设为 1.1.1.1;内网服务器B,假设为2.2.2.2;目的是公网服务器A暴露端口(23333)给飞书API,然后通过frp反代给内网服务器B的nonebot(1234端口);
飞书及机器人配置流程
安装需要的环境,注意python3版本大于3.8;
pipx及nb-cli安装:
1
2
3
4python -m pip install --user pipx
python -m pipx ensurepath
# 重开一个窗口
pipx install nb-cli使用脚手架创建项目:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17nb create
bootstrap(初学者模式)按回车进入下一项
[?] Project Name:输入你的机器人项目名称后按回车进入下一项
[?] Witch driver(s) would you like to use? 使用上下方向键移动光标,空格键选择驱动器,可以多选。选中FastAPI(FastAPI驱动器)后按回车进入下一项
[?] Witch adapter(s) would you like to use? 选择方式同上,选择飞书(飞书协议)后按回车进入下一项
[?] Install dependencies now? (Y/n) 是否安装依赖,输入Y选择是,按回车进入下一项
[?] Create virtual enviroment? (Y/n) 是否创建虚拟环境,输入Y选择是,按回车进入下一项
[?] Which builtin plugin(s) would you like to use? 使用上下方向键移动光标,空格键选择内置插件,可以多选。选中echo后按回车完成创建
# 使用如下命令可以开启.venv中的python虚拟环境
source .venv/bin/activate这个时候该项目实际上啥都没有;使用nb run可以运行基本的机器人;
在项目下的.env.prod中增加内容类似下面的代码:
1
2
3
4
5DRIVER=~fastapi
FEISHU_BOTS=FEISHU_BOTS=[{"app_id":"<your app_id>","app_secret":"<your app_secret>","verification_token":"<your app_verification_token>","is_lark":false}]
HOST=0.0.0.0
PORT=1234
LOG_LEVEL=0创建目录
src/plugins
;在里面创建demo.py:需要pip3 install requests
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#-*- coding: utf-8 -*-
import json
import requests
from nonebot import on_command
from nonebot.rule import to_me
from nonebot.matcher import Matcher
from nonebot.adapters import Message
from nonebot.params import Arg, CommandArg, ArgPlainText
from nonebot.typing import T_State
from nonebot.adapters.feishu import Bot as FeishuBot, MessageEvent
from nonebot.adapters.feishu import MessageSegment
help = on_command("help", rule=to_me(), aliases={"help", "帮助"}, priority=5)
async def handle_func():
await help.send("你可以尝试对我说:XXXXXXXXX")
#await help.send(MessageSegment.image(image_key="img_v2_11xxxxx17-f751-4e86-8f2d-43fd4b231edg"))
#这里可以写关键词命中后的业务逻辑该插件正常表现情况是@test_bot /help返回”你可以尝试对我说:XXXXXXXXX”
在项目下创建bot.py:
1
2
3
4
5
6
7
8
9import nonebot
from nonebot.adapters.feishu import Adapter as FeishuAdapter
nonebot.init()
driver = nonebot.get_driver()
driver.register_adapter(FeishuAdapter)
nonebot.load_plugins("src/plugins/")
nonebot.run()到此为止 除了env.prod中的部分信息需要从下一步获得之外,demo的nonebot部分基本完成;
配置飞书: 这块的流程是,在开发者平台开发应用,获得必要的配置,填到nonebot的.env中;
- 登录飞书开发者平台
- 点进开发者后台,创建企业自建应用,假设叫测试bot;
!!!注意需要添加机器人功能,不然会在后面的步骤中python3 bot.py的时候出错 - 在开发者后台的测试bot的
凭证与基础信息
可以获得App ID和App Secret;可以在事件订阅
获得Verification Token;
联动飞书api和nonebot:
- 把2中获得的信息填入到env.prod中
- python3 bot.py启动机器人
- 在飞书的事件订阅的请求地址配置中输入:
http://$HOST:$PORT/feishu/$app_id
;案例中为http://1.1.1.1:23333/feishu/$app_id
app_id来自于第2步;如果需要反代的话参考下面的章节做好配置 - 如果成功的话第3步可以配置好;
- 记得创建版本;然后飞书开个群,加个机器人,搜对应的名字即可;
frp反代配置流程
上述第3步中的请求地址需要公网服务器的地址,通过frp可以在内网服务器开发,然后暴露公网服务器地址和端口并转发内网服务器的服务;
预备工作:在公网服务器和内网服务器都下载对应的frp release;
需要配置三个地方并且相互对应:
公网服务器的frps.ini:
1
2
3
4
5
6
7
8
9[common]
bind_port = 4321
vhost_http_port = 23333
dashboard_port = 9999
log_level = info
privilege_mode = true
privilege_token = 复杂的密码
privilege_allow_ports = 4000-50000
max_pool_count = 100内网服务器的frpc.ini:
1
2
3
4
5
6
7
8
9
10
11
12
13; 参考https://learnku.com/articles/73370
[common]
server_addr = 1.1.1.1
server_port = 4321
log_level = info
privilege_token = 复杂的密码
[bagubot]
type = http
custom_domains = 1.1.1.1
local_ip = 127.0.0.1
local_port = 1234
; remote_port = 6000飞书的事件订阅的请求地址配置:
http://1.1.1.1:23333/feishu/$app_id
大概原理是公网服务器通过frpc监听和使用自己的4321端口和内网服务器通信;同时公网服务器对外暴露vhost_http_port也就是23333;可以在9999端口进入frp的后台界面;
frp非后台运行:
服务端 :
1
./frps -c frps.ini
客户端:
1
./frpc -c ./frpc.ini
frp后台运行:
服务端:
1
nohup ./frps -c frps.ini >/dev/null 2>&1 &
客户端:
1
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
关闭:
1
2
3ps -aux|grep frp| grep -v grep
root 3600 0.1 0.1 110188 9484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
kill -9 3600