1. 程式人生 > >用Python實現阿裏釘釘機器人讀取數據庫內容自動發群通知

用Python實現阿裏釘釘機器人讀取數據庫內容自動發群通知

media rep sql查詢 docs ken 由於 false n! 效果

最近想把一些預警數據信息按照一定的要求自動發送到移動端APP,最終把目標放在了騰訊的微信和阿裏的釘釘軟件上,由於剛開始學習python,於是編程工具想用python來實現。微信使用群體最廣,通過一天的研究用itchat庫已經實現,但由於itchat需要用web微信方式登錄,發現微信對新註冊的用戶關閉了web微信功能,於是考慮用備選方案阿裏釘釘來實現,其實阿裏釘釘雖然沒有微信用戶群體龐大,但是在企業應用方面比微信強大了太多,很多企業已經開始開始用釘釘作為內部溝通工具。

一、工作準備

1、Python工作環境搭建(略)

需要用到兩個模塊

# pip install apscheduler
# pip install pymysql

2、申請阿裏釘釘webhok,首先在群設置裏面添加自定義機器人

技術分享圖片

找到webhook地址復制備用。

技術分享圖片

二、編寫代碼如下

from datetime import datetime
import json
import urllib.request
import pymysql as pms
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
import time
import os
#Mac下關閉ssl驗證用到以下模塊 import ssl ‘‘‘ ---------------------------------------------- # 需要CMD命令下安裝以下支持庫: # pip install apscheduler # pip install pymysql # By wzy 2018-9-28 ---------------------------------------------- ‘‘‘ #Mac下關閉ssl驗證,不然會報錯 ssl._create_default_https_context = ssl._create_unverified_context
#你的釘釘機器人url global myurl my_url = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXX" def send_request(url, datas): #傳入url和內容發送請求 # 構建一下請求頭部 header = { "Content-Type": "application/json", "Charset": "UTF-8" } sendData = json.dumps(datas) # 將字典類型數據轉化為json格式 sendDatas = sendData.encode("utf-8") # python3的Request要求data為byte類型 # 發送請求 request = urllib.request.Request(url=url, data=sendDatas, headers=header) # 將請求發回的數據構建成為文件格式 opener = urllib.request.urlopen(request) # 打印返回的結果 print(opener.read()) def get_mysqldatas(sql): # 一個傳入sql導出數據的函數,實例為MySQL需要先安裝pymysql庫,cmd窗口命令:pip install pymysql # 跟數據庫建立連接 conn = pms.connect(host=服務器地址, user=用戶名, passwd=密碼, database=數據庫, port=3306, charset="utf8") # 使用 cursor() 方法創建一個遊標對象 cur = conn.cursor() # 使用 execute() 方法執行 SQL cur.execute(sql) # 獲取所需要的數據 datas = cur.fetchall() # 關閉連接 cur.close() # 返回所需的數據 return datas def get_ddmodel_datas(type): #返回釘釘模型數據,1:文本;2:markdown所有人;3:markdown帶圖片,@接收人;4:link類型 if type == 1: my_data = { "msgtype": "text", "text": { "content": " " }, "at": { "atMobiles": [ "188XXXXXXX" ], "isAtAll": False } } elif type == 2: my_data = { "msgtype": "markdown", "markdown": {"title": " ", "text": " " }, "at": { "isAtAll": True } } elif type == 3: my_data = { "msgtype": "markdown", "markdown": {"title":" ", "text":" " }, "at": { "atMobiles": [ "188XXXXXXXX" ], "isAtAll": False } } elif type == 4: my_data = { "msgtype": "link", "link": { "text":" ", "title": " ", "picUrl": "", "messageUrl": " " } } return my_data def main(): print(Main! The time is: %s % datetime.now()) #按照釘釘給的數據格式設計請求內容 鏈接https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.p7hJKp&treeId=257&articleId=105735&docType=1 #調用釘釘機器人全局變量myurl global myurl #1.Text類型群發消息 #合並標題和數據 My_content = "hello, @188XXXXXXXX 這是一個測試消息" my_data = get_ddmodel_datas(1) #把文本內容寫入請求格式中 my_data["text"]["content"] = My_content send_request(my_url, my_data) #2.Markdown類型群發消息(MySQL查詢結果發送) #獲取sql數據 sql = "SELECT branch_no,count(*) from wzy_customer_user group by branch_no order by branch_no" my_mydata = get_mysqldatas(sql) str1 = \t\n\r seq = [] for i in range(len(my_mydata)): seq.append(str(my_mydata[i])) data = str1.join(seq) data = data.replace(\‘,‘‘) data = data.replace((,‘‘) data = data.replace(),‘‘) data = data.replace(,,\t) print(data) Mytitle = "#### XXX報表\r\n單位\t數量\t\n\r %s" my_Mytitle = Mytitle.join(\t\n) % data my_data = get_ddmodel_datas(2) my_data["markdown"]["title"] ="XXXX 通報" my_data["markdown"]["text"] = my_Mytitle send_request(my_url, my_data) #3.Markdown(帶圖片@對象) my_data = get_ddmodel_datas(3) my_data["markdown"]["title"] = "系統預警" my_data["markdown"]["text"] = "#### 系統預警內容 \n > @188XXXXXXXX \n\n > ![screenshot](http://i01.lw.aliimg.com/media/lALPBbCc1ZhJGIvNAkzNBLA_1200_588.png)\n > ###### 20點00分發布 [詳情](http://www.baidu.cn/)" send_request(my_url, my_data) #4.Link類型群發消息 my_data = get_ddmodel_datas(4) my_data["link"]["text"] = "群機器人是釘釘群的高級擴展功能。群機器人可以將第三方服務的信息聚合到群聊中,實現自動化的信息同步。 " my_data["link"]["title"] = "自定義機器人協議" my_data["link"]["messageUrl"] = "https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.Rqyvqo&treeId=257&articleId=105735&docType=1" send_request(my_url, my_data) if __name__ == "__main__": #定時執行任務,需要先安裝apscheduler庫,cmd窗口命令:pip install apscheduler #隨腳本執行 #scheduler = BlockingScheduler() #後臺執行 scheduler = BackgroundScheduler() #每隔20秒執行一次 scheduler.add_job(main, interval, seconds=20) ‘‘‘ ***定時執行示例*** #固定時間執行一次 #sched.add_job(main, ‘cron‘, year=2018, month=9, day=28, hour=15, minute=40, second=30) #表示2017年3月22日17時19分07秒執行該程序 scheduler.add_job(my_job, ‘cron‘, year=2017,month = 03,day = 22,hour = 17,minute = 19,second = 07) #表示任務在6,7,8,11,12月份的第三個星期五的00:00,01:00,02:00,03:00 執行該程序 scheduler.add_job(my_job, ‘cron‘, month=‘6-8,11-12‘, day=‘3rd fri‘, hour=‘0-3‘) #表示從星期一到星期五5:30(AM)直到2014-05-30 00:00:00 scheduler.add_job(my_job(), ‘cron‘, day_of_week=‘mon-fri‘, hour=5, minute=30,end_date=‘2014-05-30‘) #表示每5秒執行該程序一次,相當於interval 間隔調度中seconds = 5 scheduler.add_job(my_job, ‘cron‘,second = ‘*/5‘) ‘‘‘ scheduler.start() print(Press Ctrl+{0} to exit.format(Break if os.name == nt else C)) try: # 其他任務是獨立的線程執行 while True: pass #time.sleep(60) #print(‘進程正在執行!‘) except (KeyboardInterrupt, SystemExit): #終止任務 scheduler.shutdown() print(Exit The Job!)

三、測試運行效果

技術分享圖片

用Python實現阿裏釘釘機器人讀取數據庫內容自動發群通知