天天看點

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

在進行Python截取網絡報表并發送釘釘群過程中,碰到一些問題,也用到一些工具,在這裡做一下簡單總結。整個過程歸納如圖:

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

1 版本配置

windows 10

Google Chrome 74.0.3729.131(正式版本) (64 位)

python 3.7.1

selenium:3.141.0

2 打開浏覽器

2.1 打開浏覽器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('log-level=3')  # suppress selenium logging to stdout
options.add_argument('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36')

driver = webdriver.Chrome(options=options)                

執行上面的代碼,會出現以下錯誤:

WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

這是因為沒有找到 chromedriver.exe 可執行檔案,兩種解決方案如下:

1.找到 chromedriver.exe 的路徑,并将其作為參數添加(注意,不是 chrome.exe 的路徑)

2.安裝 webdriver_manager 子產品,并設定參數

from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)                

3.浏覽器有時打不開,可能是由于 Google Chrome 版本自動更新之後,chromedriver.exe 版本不再對其支援,是以需要及時更新版本,或者停止 Google Chrome 自動更新。

2.2 浏覽器無界面模式最大化(headless)

options.add_argument('--headless') 

driver = webdriver.Chrome(ChromeDriverManager().install(), options = options)                

在浏覽器使用 headless 模式時,如果調整視窗大小,需要使用如下方法:

driver.set_window_position(0, 0)
driver.set_window_size(1366, 768)  # 分辨率為 1366 X 768                

如果浏覽器不使用 headless 模式, 則也可以用如下兩種方法,下面兩種方法在 headless 模式下不會執行(原因不确定):

options.add_argument('--start-maximized')

# 或者
driver.maximize_window()                

3 查找節點

Selenium 提供了一系列查找節點的方法,還可以查找單個節點和多個節點。具體文法為 find_element_by_...(),如果有多個節點,用這種方法查找,隻能得到第一個節點,這時候可以使用 find_elements_by_...() 方法。

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料
from selenium import webdriver

driver  = webdriver.Chrome()  # 假設可以正常打開浏覽器
driver.get('https://www.taobao.com')

# 根據 id 查找
driver.find_element_by_id('q')

# 根據 CSS 選擇器查找
driver.find_element_by_css_selector('#q')

# 根據 XPath 查找
driver.find_element_by_xpath('//*[@id="q"]')

# 兩個類 ng-star-inserted 和 caption
driver.find_elements_by_css_selector("div.ng-star-inserted.caption")  

# 通過兩級類名查找
driver.find_elements_by_xpath("//div[contains(@class, 'chart-title-wrap')]/ancestor::div[contains(@class,'smartchart-box')]")

# 通過兩個類查找
driver.find_elements_by_xpath("//input[@name='login' and @type='submit']")

# 其它方法
find_element_by_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_tag_name()
find_element_by_class_name()                

4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)

我在報表制作過程中,主要是進行網頁截圖和本地代碼作圖,并将它們儲存到本地,然後将這些圖像上傳到阿裡雲對象存儲空間擷取圖像外鍊,最後将外鍊嵌入到要發送釘釘的 Markdown 消息中。

注:直接将本地圖檔連結嵌入到 Markdown 消息中未取得成功,不知道有沒有解決方法。

使用 OSS 管理控制台來完成 OSS 基本操作步驟如下:

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

還可以通過使用圖形化管理工具 ossbrowser、指令行管理工具 ossutil,和 API/SDK 的方式來完成基本操作。

幾個概念

  • 存儲空間(Bucket):存儲空間是您用于存儲對象(Object)的容器,所有的對象都必須隸屬于某個存儲空間
  • 對象/檔案(Object):對象是 OSS 存儲資料的基本單元,也被稱為 OSS 的檔案。對象由元資訊(Object Meta)、使用者資料(Data)和檔案名(Key)組成。對象由存儲空間内部唯一的 Key 來辨別。
  • 通路密鑰(AccessKey):AccessKey,簡稱 AK,指的是通路身份驗證中用到的 AccessKeyId 和 AccessKeySecret。

下面以 Python SDK 的方式來完成整個過程:

建立存儲空間

import oss2

# 阿裡雲主賬号AccessKey擁有所有API的通路權限,風險很高。強烈建議您建立并使用RAM賬号進行API通路或日常運維
auth = oss2.Auth('<yourAccessKeyId>',  '<yourAccessKeySecret>')

# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth,  'http://oss-cn-hangzhou.aliyuncs.com',  '<yourBucketName>')

# 設定存儲空間為私有讀寫權限。
bucket.create_bucket(oss2.models.BUCKET_ACL_PRIVATE)                

上傳檔案

# <yourObjectName>為檔案上傳到bucket後的名稱
# <yourLocalFile>由本地檔案路徑加檔案名包括字尾組成,例如/users/local/myfile.txt
bucket.put_object_from_file('<yourObjectName>',  '<yourLocalFile>')                

下載下傳檔案

# <yourLocalFile>由本地檔案路徑加檔案名包括字尾組成,例如/users/local/myfile.txt
bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>')                

列舉檔案

from itertools import islice

# oss2.ObjectIteratorr用于周遊檔案,制定存儲空間下的10個檔案
for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)                

删除檔案

# <yourObjectNmae> 為存儲空間上的制定檔案
bucket.delete_object('<yourObjectName>')                

上傳本地圖像至存儲空間,并獲得其外鍊

5 釘釘群發送報表

首先在釘釘 “群設定“ 中點選 “群機器人”,然後點選 “添加機器人”,點選 “自定義”,出現如下頁面,其中 webhook 就是後面要用到推送報表至釘釘的連結。

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

下面以推送 markdown 類型消息為例,列出解決方法。

5.1 使用 Python 子產品 requests 發送

headers = {"Content-Type": "application/json"}

# 消息類型和資料格式參照釘釘開發文檔
data = {
    "msgtype": "markdown",
    "markdown": {
        "title": "首屏會話透出的展示内容",
        "text": "# 這是支援markdown的文本 \n## 标題2  \n* 清單1 \n ![alt 啊](https://gw.alipayobjects.com/zos/skylark-tools/public/files/b424a1af2f0766f39d4a7df52ebe0083.png)"
    }
}

r = requests.post(webhook, data=json.dumps(data), headers=headers)                

5.2 使用 Python 子產品 DingtalkChatbot 發送

import dingtalkchatbot.chatbot as cb

robot = cb.DingtalkChatbot(webhook)
robot.send_markdown(title='首屏會話透出的展示内容', 
text="# 這是支援markdown的文本 \n## 标題2  \n* 清單1 \n ![alt 啊](https://gw.alipayobjects.com/zos/skylark-tools/public/files/b424a1af2f0766f39d4a7df52ebe0083.png)")                

6 定時發送消息

windows 10 找到 任務計劃程式,然後選擇建立基本任務或者建立任務。

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

設定自己的選項,主要是紅色方框裡面的内容一定要填寫,這裡啟動的是 .bat 檔案。

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

下面是 .bat 檔案的内容,由于 timeReport.py 檔案路徑和 .bat 檔案路徑一緻,是以不需要再加上 timeReport.py 檔案路徑。

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

在運作上面的定時任務時,會自動跳出指令行視窗,這樣有可能會影響我們的工作,也有可能我們不小心影響到定時任務的運作。是以,如果能隐藏指令行視窗的話,那絕對是很妙的。設定如下:

Python 自動化發送釘釘消息1 版本配置2 打開浏覽器3 查找節點4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)5 釘釘群發送報表6 定時發送消息參考資料

後面我們在 任務計劃程式 中運作 timeReport.vbs 檔案就可以了,當然也要注意路徑的設定。

參考資料

  1. Error message: “'chromedriver' executable needs to be available in the path”
  2. How to Maximize window in chrome using webDriver (python)
  3. Not able to maximize Chrome Window in headless mode
  4. 阿裡雲對象存儲 OSS
  5. 阿裡雲圖檔處理
  6. 釘釘開發文檔:消息類型與資料格式
  7. Python 子產品 DingtalkChatbot
  8. 怎麼隐藏任務計劃運作bat批處理的黑框?

轉載于:https://www.cnblogs.com/shaocf/p/10898790.html