Java教程

真实场景分享:人工智障的诞生—0成本实现飞书机器人,解放打工人

本文主要是介绍真实场景分享:人工智障的诞生—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}转为 {&quot;a&quot;: 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方案可能不够理想,需要待机;

抛砖引玉,希望能帮到同病相怜的打工人

以上

这篇关于真实场景分享:人工智障的诞生—0成本实现飞书机器人,解放打工人的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!