作為一個 `coder` 我們每天都在看一些書七咧,博客或者大牛的公眾號和措,生怕被技術(shù)淘汰. 但是訂閱多個公眾號钮热,每天看公眾號是否有新消息,也要浪費大量的時間和精力窘问,如果公眾號文章出現(xiàn)更新辆童,能自動發(fā)送到郵件宜咒,這樣既可以在一個環(huán)境中查看多個公眾號的文章惠赫,也可以省去我們查看多個公眾號浪費的時間.
作為一個技術(shù)人員,在給他人提供便利的同時故黑,也要給自己提供遍歷儿咱,那就寫一個腳本就好了
# 用到的庫
- wechatsogou(https://github.com/Chyroc/WechatSogou)
>**wechatsogou** 基于搜狗微信搜索的微信公眾號爬蟲接口,可以擴展成基于搜狗搜索的爬蟲
**代碼**
注釋是在寫文章的時候加上的场晶,不一定符合 pep 標(biāo)準(zhǔn)混埠,還請諒解
```python
import os
import pickle
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import requests
import wechatsogou
# 發(fā)件人地址
from_address = 'zyndev@163.com'
# 發(fā)件人郵箱密碼
password = ''
# 郵箱服務(wù)器
smtp_server = 'smtp.163.com'
fail_count = 0
fail_list = []
sent_list = []
# 添加一個文件,將已經(jīng)發(fā)送成功的文章標(biāo)題序列化到文件诗轻,防止多次運行導(dǎo)致重復(fù)發(fā)送郵件
file_path = 'sent_articles_file'
# 一些敏感詞钳宪,簡單過濾一下
sensitive_words = ['鄙視鏈', '中獎名單', '成功說一口流利英語', '婚姻', '戀愛']
ws_api = wechatsogou.WechatSogouAPI()
# 獲取公眾號文章信息
def get_article(gzh):
? ? articles = ws_api.get_gzh_article_by_history(gzh)
? ? print(len(articles['article']))
? ? return articles['article']
# 設(shè)置下編碼
def _format_addr(s):
? ? name, addr = parseaddr(s)
? ? return formataddr((Header(name, 'utf-8').encode(), addr))
# 發(fā)送郵件
def send_mail(to_address, subject, msg_html):
? ? server = smtplib.SMTP(smtp_server, 25)
? ? # server.set_debuglevel(1)
? ? server.login(from_address, password)
? ? # msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
? ? msg = MIMEText(msg_html, 'html', 'utf-8')
? ? msg['From'] = _format_addr('張瑀楠 <%s>' % from_address)
? ? msg['To'] = _format_addr(' Dear ')
? ? msg['Subject'] = Header(subject, 'utf-8').encode()
? ? try:
? ? ? ? server.sendmail(from_address, to_address, msg.as_string())
? ? except:
? ? ? ? global fail_count
? ? ? ? fail_count += 1
? ? ? ? fail_list.append(subject)
if '__main__' == __name__:
? ? # 定義一個公眾號列表
? ? gzh_list = ['全棧布道士', '編程人生', 'importNew', 'Python開發(fā)者', '非著名程序員',
? ? ? ? ? ? ? ? 'Python之美', '機器學(xué)習(xí)研究會', '程序員大咖', '51CTO', '純潔的微笑']
? ? # 指定郵箱列表,這里有個建議扳炬,請郵件列表中將發(fā)件人添加到白名單吏颖,降低發(fā)送的失敗率
? ? mail_list = ['hbyunan@yeah.net', '913396132@qq.com', 'zyndev@gmail.com', '935855148@qq.com']
? ? for gzh in gzh_list:
? ? ? ? # 查找公眾號之前,先從文件中反序列化出已經(jīng)成功發(fā)送的文章列表
? ? ? ? if os.path.exists(file_path):
? ? ? ? ? ? f = open(file_path, 'rb')
? ? ? ? ? ? sent_list = pickle.load(f)
? ? ? ? ? ? f.close()
? ? ? ? articles = get_article(gzh)
? ? ? ? for article in articles:
? ? ? ? ? ? print(article['title'],'\n\t' ,article['content_url'])
? ? ? ? ? ? fileid = str(article['send_id']) + '_' + str(article['fileid'])
? ? ? ? ? ? # 如果新文章不在文章列表中恨樟,則發(fā)送
? ? ? ? ? ? if fileid not in sent_list:
? ? ? ? ? ? ? ? response_text = requests.get(article['content_url']).text
? ? ? ? ? ? ? ? send_mail(mail_list, article['title'], response_text)
? ? ? ? ? ? ? ? sent_list.append(fileid)
? ? ? ? print('發(fā)布數(shù)量', len(articles), '失敗數(shù)量', fail_count)
? ? ? ? print('=' * 40)
? ? ? ? for subject in fail_list:
? ? ? ? ? ? print(subject)
? ? ? ? # 單個公眾號文章發(fā)送完畢后半醉,將新的已發(fā)送文章列表序列化,防止出現(xiàn)中途退出劝术,造成重復(fù)發(fā)送
? ? ? ? f = open(file_path, 'wb')
? ? ? ? pickle.dump(sent_list, f)
? ? ? ? f.close()
```
# 小結(jié)
主要用到了 `wechatsogou` 這個庫來獲取公眾號的文章信息缩多,關(guān)于這個庫的使用可以訪問 github(https://github.com/Chyroc/WechatSogou)
可以結(jié)合`windows` 或者 `linux` 的定時任務(wù)來設(shè)置每天運行一次
windows10 設(shè)置定時任務(wù)方法(https://jingyan.baidu.com/article/f79b7cb313f13a9145023e4a.html)
**推薦幾個公眾號**
- 全棧布道士? (我自己在寫)
- 編程人生
- importNew (基本每天都有一些java相關(guān)文章發(fā)布)
- Python開發(fā)者
- Python之美 (豆瓣大佬董偉明的公眾號呆奕,干活多)
- 51CTO
- 純潔的微笑(對于 Spring Cloud 和 Spring Boot 有疑惑可以多看看)