即時通訊接入
# 即時通訊接入
企業GPT目前支援微信、Line等即時通訊的接入。
# 1. 微信公眾號
設定微信公眾號的大語言模型服務,需要先設定微信公眾號的開發資訊。開發的公眾號要求為經過微信認證的微信公眾號,認證型別為服務號,需使用到客服介面。
# 1.1. 獲取開發者金鑰
進入微信公眾號的後臺管理界面,點選功能表欄的設定與開發-基本配置
。可以看到有公眾號的開發資訊,請點選 重置
以重置開發者密碼,並記錄好開發者ID (AppID) 與 開發者密碼(AppSecret),在後續專案中會使用到。
# 1.2. 設定IP白名單
獲取服務端本機的公網IP地址,新增至公眾號開發資訊的IP白名單中。
# 1.3. 本地部署服務需注意的事項
如果需要本地部署服務的,需要注意的事項如下:
- 微信公眾號服務僅支援訪問帶有開放80埠的伺服器,所以本地部署的需要使用反向代理服務(Nginx)將本地的服務埠通過Nginx實現轉發。
- 微信公眾號token獲取的指令僅支援白名單IP的訪問,所以本地服務在運行時,需使用代理服務將發送的IP地址轉為白名單中的伺服器IP地址。
# 1.4. 修改本機配置檔案
修改本機配置檔案 config.ini
中 [WeChat_Server]
的WECHAT_REMOTE_SERVER
,修改爲預設的外網服務地址。
[WeChat_MP]
中先修改 APP_ID
、APP_SECRET
,同時在微信公眾號後臺修改伺服器配置(位於基本配置頁面中),修改伺服器地址為 WECHAT_REMOTE_SERVER
中設定的URL,在伺服器配置中設定好令牌(Token)與訊息加解密金鑰(EncodingAESKey),設定訊息加解密方式為安全模式,同步修改本機配置檔案 [WeChat_MP]
專案中的 TOKEN
、ENCODING_AES_KEY
,與伺服器配置中的令牌與訊息加解密金鑰保持一致。先保持微信公眾號後臺的設定界面不動,首先使用 python wechat_service.py
運行服務。
# 1.5. 反向代理服務設定
本機的環境訪問外部網路時,使用的是帶有公網IP的網路,使用云伺服器的反向代理服務,實現微信公眾號的公網服務訪問功能。Nginx的反向代理設定如下:
location /robot {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# 以下專案請修改爲本機動態域名解析可訪問的地址
proxy_pass http://xxxxx:8080/robot;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
儲存設定並重啟nginx /etc/init.d/nginx restart
,可打開公網域名的地址測試一下是否能正常訪問。
# 1.6. 儲存伺服器配置
返回至微信公眾號後臺,點選儲存伺服器配置以驗證伺服器是否可以訪問,如伺服器配置儲存成功,則說明伺服器已經可以訪問。點選伺服器配置的 啟用
按鈕以啟用伺服器配置。
# 1.7. FastWeb管理
在本機的命令列後臺停止現有的服務,然後在FastWeb中就可以使用通訊服務來管理微信公眾號服務的啟動與停止
# 1.8. 代理連線
本模組適合部署在具有固定公網IP地址的伺服器中,微信公眾號獲取授權令牌需配置在白名單中的IP地址才可使用。如果服務部署在非固定公網IP地址的伺服器中,可設定代理連線,將白名單設定為固定IP的代理伺服器地址。接下來將介紹使用方法。目前僅支援http代理的模式。
# 1.8.1. 修改配置檔案
配置檔案中 WeChat_Server
中有以下選項
wechat_proxy = True
wechat_proxy_server = xxxx
wechat_proxy_port = xxxx
wechat_proxy_username = xxxx
wechat_proxy_password = xxxx
2
3
4
5
設定 wechat_proxy
為 True時表示啟用代理功能。目前代理功能僅在獲取token 時啟用,其餘功能均不使用代理連線。
# 1.8.2. 代理服務端設定
在代理服務端建立python 檔案實現代理連線的功能:
# 代獲取微信公眾號 token
import requests
import logging
import json
from aiohttp import web
from logging.handlers import TimedRotatingFileHandler
# 配置日誌
log_filename = 'wechat_grant_token.log'
log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
log_handler = TimedRotatingFileHandler(log_filename, when="D", interval=1, backupCount=7)
log_handler.setFormatter(log_formatter)
# 建立日誌記錄器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(log_handler)
# RestAPI使用Agent
async def token_handler(request):
try:
grant_type = request.query.get('grant_type')
appid = request.query.get('appid')
secret = request.query.get('secret')
if grant_type == 'client_credential':
url="https://api.weixin.qq.com/cgi-bin/token"
params={
"grant_type": grant_type,
"appid": appid,
"secret": secret
}
response = requests.get(url=url,params=params)
logger.info(f'{appid} 已請求token')
return web.Response(text=json.dumps(response.json()))
except Exception as e:
logger.error(f'請求出錯:{e}')
return web.Response(text=json.dumps({'error':e}))
app = web.Application(client_max_size=1024**3)
# 新增路由
app.router.add_get('/cgi-bin/token', token_handler)
if __name__ == "__main__":
web.run_app(app, host='0.0.0.0', port=10316)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
將上述檔案命名為 wechat_grant_token.py
,使用nohup python wechat_grant_token.py
運行命令,繼續填寫以下內容。
wechat_proxy = True
wechat_proxy_restserver = http://xxxx.xxx.xx.xx:10316
2
# 2. Line
Line 服務需建立一個機器人,將相關的設定填寫到其中。
# 2.1. 取得 Line Token
- 登錄 Line Developer (opens new window)
- 建立機器人:
- 建立 Provider -> 按下 Create
- 建立 Channel -> 選擇 Create a Messaging API channel
- 輸入完必填的基本數據
- 輸入完成後,在 Basic Settings 下方,有一個 Channel Secret -> 按下 Issue,產生後即為
CHANNEL_SECRET
(同時修改專案檔案config.ini
中[Line_Bot]
CHANNEL_SECRET
) - 在 Messaging API 下方,有一個 Channel access token -> 按下 Issue,產生後即為
CHANNEL_ACCESS_TOKEN
(同時修改專案檔案config.ini
中[Line_Bot]
CHANNEL_ACCESS_TOKEN
)
# 2.2. 新增Webhook URL
在Line網頁設定 Webhook settings
中,先設定 Webhook URL
,與 config.ini
中 [Line_Bot]
的 LINE_REMOTE_SERVER
保持一致。同時設定 Use Webhook
為勾選狀態。
# 2.3. 設定反向代理
本機的環境訪問外部網路時,使用的是帶有公網IP的網路,使用云伺服器的反向代理服務,實現Line的公網服務訪問功能。在命令列中首先運行 python line_service.py
,在遠端伺服器中設定反向代理資訊。以下以nginx為例:
location /callback {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# 以下專案請修改爲本機動態域名解析可訪問的地址
proxy_pass http://xxxxx:5000/callback;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
儲存設定並重啟nginx /etc/init.d/nginx restart
,可打開公網域名的地址測試一下是否能正常訪問。然後在 Line 控制檯的 Messaging API 中點選 Webhook URL 中的 Verify
按鈕,如果出現Success 的提示按鈕,則說明運行正常。可開展後續的服務。