若是大家公司的內部通信工具使用的是釘釘的話,那你必定用過釘釘羣機器人去作很多事情,好比監控告警、好比
issue
的自動同步通知,好比tag
的通知等等操做,羣機器人也就是咱們常說的incoming
模式,今天咱們要講的是釘釘企業機器人,就是今天要說的outgoing
模式,它能實現的功能就是根據你後端的定義來進行交互式機器人的一種實現,若是你用過微信機器人或開發過微信公衆號,相信你對這個並不陌生。python
兩個概念
在剛開始的時候,釘釘機器人只支持incoming
方式,也就是被動接收通知,在19年下半年釘釘的outgoing
就開始內測,可是一直沒放出來,大約是在今年過年的時候才正式推出來outgoing的功能
,也就是今天咱們要說的企業機器人。json
羣機器人 (incoming模式)
來自官方的描述: "羣機器人是釘釘羣的高級擴展功能。羣機器人能夠將第三方服務的信息聚合到羣聊中,實現自動化的信息同步。目前,大部分機器人在添加後,還須要進行 Webhook
配置,纔可正常使用(配置說明詳見操做流程中的幫助連接)"。flask
企業機器人 (outgoing模式)
來自官方的描述: "企業機器人是釘釘爲用戶提供的組織內部使用的機器人,爲組織數字化轉型業務服務。開發者可經過本文所描述步驟進行機器人的自主開發和上架,組織內其它成員可經過方便快捷地在羣內添加企業機器人,並使用機器人的能力"。後端
使用釘釘企業機器人的先決條件
一、一個認證的釘釘組織(能夠是公司的也能夠是我的的
)
二、一個公網IP(添加釘釘機器人的時候須要覈對)
三、一個消息推送接口(POST
方式的接口,須要公網能訪問)
四、python
五、flask
釘釘羣機器人建立
這裏爲了演示,我採用的是我的註冊的釘釘組織,若是你們在公司的話,能夠直接使用公司的,不用把時間浪費在這一步上面。安全
建立機器人
若是沒有認證會提示你進行認證操做

若是完成了認證,那就開始建立

填寫你建立機器人的相關描述,因爲業務需求,可能不僅僅會建立一個機器人,因此要有一個清晰的描述

填寫你的公網出口IP和接收消息的接口
須要注意的是,這裏的接口是臨時用Flask
寫了一個hello world
的POST
接收,要否則驗證不過去。記得這裏的路由跟你在頁面上填寫的接收消息的路徑確保是一致的。微信
# -- coding:UTF-8 --from flask import Flask, request
app = Flask(__name__)
@app.route('/call', methods=['POST'])def call(): if request.method == 'POST': return 'This is a POST request'
if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)

建立成功以後,須要保存key和secret,後面爲消息鑑權使用

最後須要確認機器人發佈


建立釘釘羣,添加企業機器人




須要注意事項
因爲咱們後端尚未任何的邏輯代碼,因此咱們在at羣機器人的時候是沒有任何響應的,那麼接下來咱們就來編寫後端代碼實現下域名過時的檢測。app
後端代碼邏輯的檢測
咱們把上面驗證接口的代碼稍微改下
確保路由信息一致,這裏咱們就把用戶請求的發送的信息加工返回,來看看效果。運維
代碼以下
# -- coding:UTF-8 --from flask import Flask, request
app = Flask(__name__)
@app.route('/call', methods=['POST'])def call(): if request.method == 'POST': content = request.get_json().get('text').get('content') msg = { "msgtype": "text", "text": { "content": "你說的是: {0}".format(content) }, "at": { "atMobiles": [
], "isAtAll": False } } return msg
if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)
效果以下

如何實現域名過時的檢測
既然咱們已經調通流程來,那麼咱們就來一個真正的實戰吧,畢竟咱們建立機器人也不是爲了好玩,是爲了幫咱們解決咱們實際的問題的,運維可能關注域名或證書的過時,那咱們就來實現下這塊的邏輯。dom
獲取域名信息使用來python-whois這個包,解析域名的時候並非百分之百都能解析,好比life後綴的域名
python-whoissocket
python-whois安裝
pip install python-whois
check domain expire 僞代碼
# -- coding:UTF-8 --
import sysimport whois
def expire_result(domain): domain_infos = whois.whois(domain) expire_date = domain_infos.expiration_date[1] return expire_date
和咱們入口程序集成來看下效果
# -- coding:UTF-8 --from flask import Flask, requestfrom check_domain_expire import expire_result
app = Flask(__name__)
@app.route('/call', methods=['POST'])def call(): if request.method == 'POST': content = request.get_json().get('text').get('content') domain_expire_date = expire_result(content.strip())
msg = { "msgtype": "text", "text": { "content": u"你查詢的域名是: {0}\n域名過時時間是: {1}\n".format(content, domain_expire_date) }, "at": { "atMobiles": [
], "isAtAll": False } } return msg
if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)
效果

站長之家查詢結果

如何檢測證書的過時時間
檢測ssl
證書過時這裏用到了pyopenssl
這個庫來進行解析結果。
pyopenssl
pyopenssl安裝
pip install pyopenssl
check ssl expire 僞代碼
# -- coding:UTF-8 --
import OpenSSLimport ssl, socket
def ssl_expire_result(domain): cert=ssl.get_server_certificate((domain, 443)) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) return x509.get_notAfter()
修改入口程序
# -- coding:UTF-8 --from flask import Flask, requestfrom check_ssl_expire import ssl_expire_result
app = Flask(__name__)
@app.route('/call', methods=['POST'])def call(): if request.method == 'POST': content = request.get_json().get('text').get('content') ssl_expire_date = ssl_expire_result(content.strip())
msg = { "msgtype": "text", "text": { "content": u"你查詢的域名是: {0}\n域名對應證書過時時間是: {1}\n".format(content, ssl_expire_date) }, "at": { "atMobiles": [
], "isAtAll": False } } return msg
效果

站長之家查詢結果

更復雜的場景
通過上面的兩個實際案例,咱們能看出來,釘釘企業機器人能實現什麼功能取決於咱們後端邏輯能提供什麼樣的功能,可能有的小夥伴就會說了,若是我想把你上面兩個功能給合併下應該怎麼辦呢?那也好說,制訂好規則就行了,好比咱們要求輸入的格式是這種的域名|xxx.com
, 證書|xxx.com
, 後端解析的時候按照關鍵字進行篩選執行不一樣的邏輯便可,固然你也可使用數字來表明,好比1表明域名查詢,2表明證書查詢。那麼接下來咱們來實現下
定義默認返回
# 默認返回信息,當用戶沒有任何輸入的時候 msg = { "msgtype": "text", "text": { "content": u"查詢格式: \n一、域名過時查詢: 域名|xxxx.com\n二、證書過時查詢: 證書|xxx.com", }, "at": { "atMobiles": [
], "isAtAll": False } }
修改以後的效果以下

工做中真正的實用場景
一、對接CMDB實現對話式信息獲取(某服務對應的域名和監控列表等)
二、對接監控程序,實現對話式操做(執行日誌壓縮等等信息)
三、對接日誌系統,實現實時的日誌流信息返回
四、排班系統安排(at機器人:我這周工做安排,便可按需分配)
五、平常運維開發雜事
中間碰到的問題
一、釘釘羣機器人的調試羣裏機器人返回的body數據並不全,沒法正常獲取userid, 剛開始也是折騰了很久
二、官方文檔裏提到的簽名認證不用也不要緊
官方文檔
釘釘企業機器人
釘釘羣機器人
信息被淹沒了怎麼辦?
若是是在一個大羣裏的話,人數比較多,你at機器人提了一個問題,機器人回覆你了,可是因爲羣內人員比較多,聊天信息過多,可能會把你想要的信息給淹沒,這個時候應該咋辦呢?
這個時候你須要有讀取用戶通信錄的權限,經過返回的body
信息裏的請求的userid
去調用釘釘通信錄的接口來實現對應用戶的電話,經過電話來進行機器人對你的at的操做,這樣就能保障信息不容易被遺漏的操做了
有了通信錄的權限的話,就要防範代碼泄露等方面的安全事宜,由於你代碼裏有key
和secret
, 因此萬事都是相通的,安全無小事,萬事須謹慎~
後記
若是你們玩過圖靈機器人的話,相信對上面的一幕並不會感到陌生,其實簡單的邏輯實現起來並不複雜,複雜的是如何根據用戶輸入實現智能回覆,也就是所謂的語料庫的豐富程度決定了功能的多少,我也是拋磚引玉,具體在公司場景裏如何實現要看你的需求如何,我當前作的主要是針對CMDB
的對接,由於老有人喜歡問,我服務對應的信息是啥,這個時候安排上這個工具對接CMDB
信息,全部的都一目瞭然,真香哈~
做者:追馬Linux,十年運維老鳥,喜歡探索Kubernetes、DevOps等方向的技術,歡迎來撩~
歡迎關注個人公衆號「追馬Linux」,原創技術文章第一時間推送。

本文分享自微信公衆號 - 追馬Linux(zhuima_k8s)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。