飞书配置及frp反代过程记录

环境及需求

  1. 公网服务器A,假设为 1.1.1.1;内网服务器B,假设为2.2.2.2;目的是公网服务器A暴露端口(23333)给飞书API,然后通过frp反代给内网服务器B的nonebot(1234端口);

飞书及机器人配置流程

  1. 安装需要的环境,注意python3版本大于3.8;

    1. pipx及nb-cli安装:

      1
      2
      3
      4
      python -m pip install --user pipx
      python -m pipx ensurepath
      # 重开一个窗口
      pipx install nb-cli
    2. 使用脚手架创建项目:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      nb 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可以运行基本的机器人;

    3. 在项目下的.env.prod中增加内容类似下面的代码:

      1
      2
      3
      4
      5
      DRIVER=~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
    4. 创建目录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)

      @help.handle()
      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”

    5. 在项目下创建bot.py:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      import 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部分基本完成;

  2. 配置飞书: 这块的流程是,在开发者平台开发应用,获得必要的配置,填到nonebot的.env中;

    1. 登录飞书开发者平台
    2. 点进开发者后台,创建企业自建应用,假设叫测试bot;
      !!!注意需要添加机器人功能,不然会在后面的步骤中python3 bot.py的时候出错
    3. 在开发者后台的测试bot的凭证与基础信息可以获得App ID和App Secret;可以在事件订阅获得Verification Token;
  3. 联动飞书api和nonebot:

    1. 把2中获得的信息填入到env.prod中
    2. python3 bot.py启动机器人
    3. 在飞书的事件订阅的请求地址配置中输入:http://$HOST:$PORT/feishu/$app_id;案例中为http://1.1.1.1:23333/feishu/$app_id app_id来自于第2步;如果需要反代的话参考下面的章节做好配置
    4. 如果成功的话第3步可以配置好;
    5. 记得创建版本;然后飞书开个群,加个机器人,搜对应的名字即可;

frp反代配置流程

上述第3步中的请求地址需要公网服务器的地址,通过frp可以在内网服务器开发,然后暴露公网服务器地址和端口并转发内网服务器的服务;

  1. 预备工作:在公网服务器和内网服务器都下载对应的frp release;

  2. 需要配置三个地方并且相互对应:

    1. 公网服务器的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
    2. 内网服务器的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
    3. 飞书的事件订阅的请求地址配置:http://1.1.1.1:23333/feishu/$app_id

    4. 大概原理是公网服务器通过frpc监听和使用自己的4321端口和内网服务器通信;同时公网服务器对外暴露vhost_http_port也就是23333;可以在9999端口进入frp的后台界面;

  3. frp非后台运行:

    1. 服务端 :

      1
      ./frps -c frps.ini
    2. 客户端:

      1
      ./frpc -c ./frpc.ini
  4. frp后台运行:

    1. 服务端:

      1
      nohup ./frps -c frps.ini >/dev/null 2>&1 &
    2. 客户端:

      1
      nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
  1. 关闭:

    1
    2
    3
    ps -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

参考博客

  1. NoneBot对接机器人
  2. frp内网穿透配置
  3. nonebot官方文档
  4. frp官方文档
  5. nonebot飞书适配器官网文档