真实场景分享:人工智障的诞生—0成本实现飞书机器人,解放打工人
省流:python + quicker 实现消息响应
背景:工作中,有少部分频次较高的系统事务项,费时又费力。比如A\B\C\D\E\F 同时有同类的支持需求。
由于公司内部沟通软件是飞书,所以就基于飞书做了机器人。期望向机器人按格式发送口令消息,即可触发相应的操作。
消息类型形如【天气.成都】、【天气.省份=四川.城市=成都】,类似于【前缀.**参数】的形式。
这种形式本质是对原有的系统功能做补充,类似插件作用。
还可借助飞书的多维表格,实现灵活的权限配置。
可以拓展口令,实现丰富的功能,就使用者而言,不会有系统的切换,体验极佳。
由于我不专业,处理流程可能比较繁琐,希望各位路过的大佬不吝赐教优化,权当提供一点思路,抛砖引玉。
实现路径大逻辑:
1.用户向飞书机器人发送消息(单聊则直接向机器人发消息,群聊则需在群内@机器人)
飞书开放平台open.feishu.cn创建机器人,联系企业管理员开通相应权限。开发文档主要参照使用服务端文档
2.飞书POST事件到提前配置的URL(机器人需要订阅[接收消息],注意取消勾选接收全部群消息;)
我服务器用的free.3v.do,ASP格式,10元200M,无时长限制,四舍五入免费。配置方法放文后。
3.服务器接受请求,并处理转发到本地电脑(使用quicker推送服务,我的推荐码:606468-8096)
asp服务器收到消息后,解析后GET至quicker的长链接,可推送到在本地电脑,自动调起运行py。
需要提前在本地电脑上安装quicker,使用其推送服务,可调起运行py文件
4.本地电脑运行py,处理/回复
为避免不可预计的bug、及时响应用户,接收到消息后,应立刻在原消息回复表情
py运行结束后,将处理结果回复给用户
权限控制、日志记录,可直接使用多维表格
关键代码之—ASP服务器代码:
由于这个服务器asp版本out,并且限制了库使用,网上ASP的相关代码也比较少,所以我有部分代码是抄GPT
以下代码主要实现:解析飞书发过的POST请求体(忽略所有中文,试了很多办法,暂时没找到方法),提取参数推送给quicker
<%
'先响应飞书服务器,飞书若未检测到消息200,则会安排重发,神烦 Response.Write "200" ' Read binary data from HTTP request ——抄GPT Dim bytes, text, byteCount bytes = Request.BinaryRead(Request.TotalBytes) byteCount = LenB(bytes) ' bytes -> string —— 抄GPT Dim byte1, byte2, byte3 Dim charCode, charCount text = "" charCount = 0 '根据GPT改写的,只保留数字、英文、常用符号,把ansi128以上的全部丢弃(中文丢弃)
'无奈之举,试了很多办法仍然不能正确解析出中文 For i = 1 to byteCount byte1 = AscB(MidB(bytes, i, 1)) If (byte1 < 128) Then text = text & Chr(byte1) End If charCount = charCount + 1 Next
' 试了下面的库,有的不能用,果然免费是有代价的 ' Set jsonObj = Server.CreateObject("MSXML2.DOMDocument.6.0") 不支持 ' Set jsonObj = Server.CreateObject("JSON") 不支持 ' Set data = Server.CreateObject("Scripting.Dictionary") 不支持 ' JSON.stringify 不支持 ' stext = Server.HTMLEncode(text) 可用,将{"a":1}转为 {"a": 1} ' 创建json对象 将str转成 json,可以正常使用,解析json文档,非常好
' 处理飞书消息,提取出必要参数。为什么要这么多参数?可能是为了减少向飞书服务器发送消息查询请求,忘记了。 Dim json Set json = Server.CreateObject("ScriptControl") json.Language = "JScript" json.AddCode("var obj = " & text ) message_id = json.Eval("obj.event.message.message_id") user_id = json.Eval("obj.event.sender.sender_id.user_id") chat_type = json.Eval("obj.event.message.chat_type") message_type = json.Eval("obj.event.message.message_type") sender_ou_id = json.Eval("obj.event.sender.sender_id.open_id") chat_id = json.Eval("obj.event.message.chat_id") On Error Resume Next parent_id = json.Eval("obj.event.message.parent_id") If Err.Number <> 0 Then parent_id = "" End If On Error GoTo 0 ' 这里好像是为了判断是否是消息转发,转发的消息不处理 Dim mentions_dt,mentions_ls,count On Error Resume Next Set mentions_dt = json.Eval("obj.event.message.mentions") mentions_ls = "" For Each item In mentions_dt mentions_ls = mentions_ls & item.id.union_id &"." Next If Err.Number <> 0 Then mentions_ls = "only_all" End If On Error GoTo 0 On Error Resume Next text = message_id & "," & user_id & "," & sender_ou_id & "," & chat_type & "," & message_type & "," & parent_id & "," & chat_id &","& mentions_ls If Err.Number <> 0 Then text = "text合并错误" End If On Error GoTo 0
' 创建请求 Dim xhr Set xhr = Server.CreateObject("MSXML2.XMLHTTP") Dim url, postData
' GET形式的quicker长连接 url = "https://push.getquicker.cn/to/quicker?toUser=邮箱&code=推送密码&operation=action&action=动作ID&data="&参数text xhr.open "GET", url, False xhr.send
' 我用的是iphone,配置了bark同步通知,方便调试 url = "https://api.day.app/bark码/asp程序正确执行"&参数text xhr.open "GET", url, False xhr.send %>
关键代码之—quicker动作(组合动作里,仅1个动作,参照配置即可)
关键代码之—python代码
# 以下代码并不能运行,仅呈现主要处理思路
# coder能力点渣,勿喷
if __name__=='__main__': #处理asp传入参数 path = sys.argv #读取传入的所有参数['c:\...py','msg_id,aaa,xxx,yyy'] #测试path # path = ['C:\\Users\\aircoder\\OneDrive\\git\\magic.py', 'om_af1dd73694e5078657f1af5f89f1c137,76f4c1ec,ou_b86b8d376ec40468080882d3d37b986d,p2p,text,,'] # input(path) #显示传入的所有参数 #提取path path = path[1] #若群场景下,确保收到的消息有@机器人 if (path.split(',')[3] == 'group') and ('on_126b7dabb6f0ef09a68db9189c7a9ad1' not in path.split(',')[7]): #若无@机器人,则无任何回复并退出 sys.exit() #传入path参数,实例化magic对象 magic_msg = Magic(path) #声明消息已发送至服务器 magic_msg.set_s()#设置飞书请求属性 magic_msg.re_emoji('连接成功')#回复表格,声明消息已经传到服务器 #白名单模块===========start #仅调试模式的时候用,仅响应管理员的消息 # magic_msg._assert_boss() #白名单模块===========end #限制使用时段 magic_msg._time_limit() #检查是否单条文本消息 magic_msg._check_only_txt() #检查发送者当天有效发送次数 magic_msg._check_total_times() #获取消息文本内容(已还原为txt) @所有人@张三xxx.xx.xx msg_txt = magic_msg.get_msg() #解析魔法文本 magic_msg._un_msg(msg_txt) #检查魔法限制使用上限 magic_msg._check_magic_times() #检查魔法限制群 magic_msg._check_magic_only_group() #鉴权 magic_msg._check_power() #运行程序 magic_msg._run(magic_msg)
问题点:ASP服务器解析写得太差劲了,希望有大神能指点一二;quicker方案可能不够理想,需要待机;
抛砖引玉,希望能帮到同病相怜的打工人
以上
本文来自博客园,作者:airgeek,转载请注明原文链接:https://www.cnblogs.com/airgeek/p/17469199.html