- 将钉钉(dingtalk)webhook代理成websocket
- 企业自建应用不用创建公网的回调地址,直接本地使用websocket客户端连上这个转发地址
设计
- 使用nchan维护websocket的连接
- 将钉钉的回调消息,抽取钉钉相关的头信息,外面包一层json,使用X-Request-Id作为唯一ID,推送给对应的channel
- 客户端自己保存钉钉的密钥信息,从转发服务走的消息都是加密的。
- 客户端调用钉钉其他接口,直接走自己的网络
安全性
- 钉钉回调消息都是加密的,只能由websocket客户端自己解密,转发服务是透明的。
- 如何确保自己的channel不会被别人恶意使用?
使用nginx basic auth,nchan支持auth_request,在对应的request里面使用basic auth就能做校验
实现
organization
使用一个organization对当前组织下面的所有bot进行管理
这样所有的消息可以通过org_<name>
一个channel推送,这种模式下启动服务的时候可以不用提前注册所有的bot,可以动态的加入新的bot进去
client = Client(bot1, bot2, org_name='org_lloyd', org_passwd='passwd')
使用
python sdk
使用装饰器可以更简洁的通过一个回调函数处理消息
pip install ca-dingtalk-websocket
from connectai.dingtalk.websocket import Client
client = Client()
@client.on_bot_message(app_id='dingxxx', app_secret='xxx', agent_id='xxx', msgtype='text')
def on_message_callback1(bot, sessionwebhook, content, **kwargs):
text = content['content']
bot.reply(sessionWebhook, DingtalkTextMessage("reply: " + text))
client.start()