省流:10元永久asp伺服器 + quicker + python 實現訊息響應
背景:工作中,有少部分頻次較高的系統事務項,費時又費力。比如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