部落格園向粉絲群發郵件功能測試
一、前言
還有不到十天就是農曆新年了,看到一年來有許多的小夥伴關注我,尤其是下半年粉絲數增長了不少,博主還是很有成就感的,所以想為每一位粉絲髮上一份郵件表示感謝。
園子的使用者賬號都是繫結郵箱的,但沒有顯式的給出每個使用者的郵箱,那麼想要為每個粉絲髮送郵件,只能一個個的發嘍,這當然不符合我們程式設計師的作風,我就想著能不能用程式批處理髮送郵件。
二、獲取message介面
我們首先來看一下部落格園官方的OpenAPI https://api.cnblogs.com/help看看有沒有傳送郵件相關的介面說明,額......雖然其他的介面都給出了詳細的說明,但並沒有找到我想要的傳送郵件介面,那隻能通過瀏覽器親自動手查詢嘍。
博主是火狐黨,這裡就直接使用Firefox來檢視吧。在傳送短訊息介面下,也就是上面的頁面下按F12進入開發者模式選擇網路—XHR,就能找到當前向部落格園伺服器傳送的請求。
關於XHR(XMLHttpRequest)這裡給出w3cschool對其的說明https://www.w3cschool.cn/ajax/ajax-xmlhttprequest-send.html
這裡我就先向自己的一個小號傳送一條資訊,看一下會產生一個什麼樣的請求。
哦,原來是一個POST請求,請求地址是https://msg.cnblogs.com/api/message,那這樣就好辦的,我們再來有哪些引數。
三個引數正好對應收件人(name)、標題(title)和內容(content)。介面找到了我們的工作基本上就算是完成一半了。
三、爬取粉絲使用者名稱
第一個引數便是收件人的使用者名稱,這當然需要爬蟲來爬取,我們先來分析一下粉絲頁面。
以博主自己的粉絲頁為例,第一頁的URL為
https://home.cnblogs.com/u/wkfvawl/followers/
第二頁
https://home.cnblogs.com/u/wkfvawl/followers/?page=2
第三頁
https://home.cnblogs.com/u/wkfvawl/followers/?page=3
看到了吧,這個URL就是單純的page遞增,那麼直接遍歷一下就可以了。
針對具體的一頁,檢視HTML原始碼
<li id="1fa4c2be-9d08-493d-e713-08d79458b333"> <a href="/u/1923713" title="鍾老師"> <div class="avatar_pic"> <img src="//pic.cnblogs.com/face/sample_face.gif" /> </div> <div class="avatar_name"> 鍾老師 </div> </a> <a class="edit hide" href="javascript:void(0)" onclick="delFollower('1fa4c2be-9d08-493d-e713-08d79458b333','鍾老師')">刪除粉絲</a> </li> <li id="0dc4b50d-5238-429c-04a0-08d704f23d44"> <a href="/u/MilkoSilver" title="星野妙"> <div class="avatar_pic"> <img src="//pic.cnblogs.com/face/1739984/20190711193403.png" /> </div> <div class="avatar_name"> 星野妙 </div> </a> <a class="edit hide" href="javascript:void(0)" onclick="delFollower('0dc4b50d-5238-429c-04a0-08d704f23d44','星野妙')">刪除粉絲</a> </li> <li id="bab9893e-b854-4ae3-4086-08d765b211a6"> <a href="/u/1870144" title="姚bing"> <div class="avatar_pic"> <img src="//pic.cnblogs.com/face/1870144/20200114195537.png" /> </div> <div class="avatar_name"> 姚bing </div> </a> <a class="edit hide" href="javascript:void(0)" onclick="delFollower('bab9893e-b854-4ae3-4086-08d765b211a6','姚bing')">刪除粉絲</a> </li> <li id="07d8642b-86b3-45fc-e4f5-08d79458b333"> <a href="/u/1922704" title="釋懷believe"> <div class="avatar_pic"> <img src="//pic.cnblogs.com/face/sample_face.gif" /> </div> <div class="avatar_name"> 釋懷believe </div> </a> <a class="edit hide" href="javascript:void(0)" onclick="delFollower('07d8642b-86b3-45fc-e4f5-08d79458b333','釋懷believe')">刪除粉絲</a> </li>
粉絲的使用者名稱是在 <div class="avatar_name">下,這裡由於這個指令碼是Python編寫,方便起見直接使用BeautifulSoup庫的find_all方法了,相信寫過Python爬蟲的朋友對這個解析工具應該是很熟悉了。
soup.find_all('div', attrs={'class': 'avatar_name'})
四、獲取Cookie
部落格園是需要登入的,為了讓我們的程式被部落格園識別,需要獲得當前頁面的Cookie。而Cookie其實就藏在請求頭中。
五、Python實現
至此所有的準備都已經做好了,接下就是寫程式碼了,主要就是requests庫的使用,這是Python的最為簡單易用的HTTP庫了,我們要做的工作就是先獲取使用者名稱接著構造請求引數,最後使用其的post方法傳送請求。測試通過後會附上原始碼。
# coding=utf-8 import time import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0', # 你登入的cookies 'Cookie': '********' } jsonDict = {"name": "test", "title": "部落格園郵件群發功能測試", "content": "親愛的園友抱歉打擾了,博主正在進行部落格園郵件群發功能的測試,該郵件權當做垃圾郵件,具體內容請見https://www.cnblogs.com/wkfvawl/p/12202859.html" } # 收件人名字,標題,內容 cnt = 1 urlSample = "https://home.cnblogs.com/followers/?page=" for page in range(1, 8): url = urlSample + str(page) # 構造新的url requests.packages.urllib3.disable_warnings() # 解決警告問題 html = requests.get(url, headers=headers, verify=False) soup = BeautifulSoup(html.content, 'lxml') links = soup.find_all('div', attrs={'class': 'avatar_name'}) for link in links: strings = link.string jsonDict['name'] = strings.replace(' ', '').replace('\n', '') res = requests.post('https://msg.cnblogs.com/api/message', json=jsonDict, headers=headers, verify=False) # post請求 print(res) time.sleep(60)#間隔60秒 print('第' + str(cnt) + '位粉絲') print(jsonDict) cnt = cnt + 1
剛才測試了一下將時間限制到10s傳送一次請求還不行.....差不多1分鐘一個倒是可以