用python给说说点赞的人群发新年祝福邮件
博主的github链接,欢迎大家来访问~:https://github.com/Sh-Zh-7
强化学习经典算法实现地址:https://github.com/Sh-Zh-7/reinforce-learning-impl
不久之前突发奇想想要用python给大家群发新年祝福,于是就有了下面的这段过程。
一. 大致思路
- 取得连接:首先我们要获得qq空间首页的连接,这里要解决的一个问题就是qq空间的权限问题。
- 网页爬虫:然后我们要获取给说说点赞的列表,我们都知道qq邮箱的格式是【qq号 + @qq.com】,所以说列表的内容必须是qq号。
- 发送邮件:在获取列表后,我们要做的就是给列表中的每一位好友发送邮件,当然这个邮件不应该是简单的一句话,他应该是富文本的。
二. “取得连接”的一些问题
很显然如果要获得连接就要向Web服务器发送HTTP请求,在这里我使用的是urllib3的模块(虽然现在网上教程中使用的较多的是urllib模块)。用它来获取我们页面的静态HTML文件,然后我们就可以使用爬虫工具来分析了。urllib3的用法也十分简单,创建PoolManage实例,用于管理连接池,然后通过request方法发送GET请求,最后用使用返回数据的data属性即可。整个过程只有三步,让我们先来看看会出什么问题。
from urllib3 import *
disable_warnings()
http = PoolManager()
url = 'https://user.qzone.qq.com/1234567' #这里1234567替换为你自己的qq号
response = http.request("GET", url,)
with open("qq_html.txt", 'w') as file:file.write(response.data.decode('utf-8'))
这里我把获得的HTML文档放在一个叫做qq_html.txt的文本文档中了,下面我们看看这个文档中究竟有什么东西:
然后我们用开发者工具再看看实际我们的HTML页面 (这里我用的是Edge)
好吧,其实是完全不同的,其本质原因是因为我们没有设置cookie,导致服务器无法识别用户。细心的读者可能就会发现,我们获得的HTML文件的内容其实是qq空间登陆页面的内容。如果没有设置cookie的话设置一下就好了,大家可以从Devtool中将cookie全部复制下来,不过这个方法比较麻烦,下面我们来看看一个更好的方法。
三. 模拟用户登陆
我们平时在使用qq空间的时候,一般是不需要用到cookie的知识的,只要用鼠标随便点点就好了,那么我们不妨使用能模拟用户点击的模块来取得我们页面的连接。这里我是用的是著名的selenium模块,selenium其实是一套完整的web应用程序测试系统。使用selenium时我们还需要了解webdriver的知识:webdriver是一个开源工具,用于许多浏览器上自动测试webapps。Webdriver是selenium和browser通信的桥梁,selenium实质上是相关协议的底层封装,同时提供对外部webdriver的上层调用。
在写代码时,chromedriver由于不可抗的未知因素无法下载,所以我选择了firefox,这个浏览器所对应的webdriver叫做geckodriver,注意将geckodriver放在python的PATH下(放到系统环境变量中的PATH也不行),不然会出现以下错误:
下面我们就可以用这个模块来模拟用户的各种行为了,由于在这边selenium官网的连接总是超时,所以我对它的了解也不深,想要进一步了解的请自行去官网查看。下面的代码可以帮助你登陆到你自己的qq空间。
# Initialize
browser = webdriver.Firefox()
browser.get('https://user.qzone.qq.com')
username = "1234567" # 这里填你自己的qq号
password = "abcdefg" # 这里填你自己的密码# Login
browser.switch_to.frame('login_frame')
log = browser.find_element_by_id("switcher_plogin")
log.click()
time.sleep(0.5)
uname = browser.find_element_by_id('u')
uname.send_keys(username)
ps = browser.find_element_by_id('p')
ps.send_keys(password)
btn = browser.find_element_by_id('login_button')
time.sleep(0.5)
btn.click()
time.sleep(0.5)
这段代码简单地来说就是利用DOM取得和操作相应的元素(表单和按钮),然后模拟事件(就是按按钮的那个事件)登入。可以看到selenium不仅解决(其实是避开)了网页的连接问题,顺便还把网络爬虫的问题给解决了。有一点要注意的是在iframe中的内容是无法爬取的,必须使用switch_to_frame方法,或者使用xpath,后者在chromium上取得比较方便,大家可以自己寻找教程。
四. 获得第一条说说中点赞好友的qq号列表
既然已经登陆了,接下来要做的就是网页爬虫了,了解到selenium也有爬虫的功能,我们将继续使用这个模块,首先检查我们点赞好友的元素:
这里我们比较感兴趣的是这个iframe和列表子元素中的属性href,如果我们抓到所有子元素的href属性,就可以获得点赞好友的qq空间地址,最后用正则表达式处理一下就可以获得qq号列表了。
这里有用到一个小技巧:那就是用find_element系列方法获得的是第一元素,这个跟很多爬虫模块都很像,比如beautifulsoup。有了这个技巧以后我们就可以很简单地获取第一条说说的信息了。
def get_qq(element):"""Return qq number in element's attribute."""return re.search('\d+', element.get_attribute('href')).group()# Get the so-called like list
qq_list = []
browser.get("https://user.qzone.qq.com/123456/main") # 还是要换成自己的qq号
browser.switch_to.frame('QM_Feeds_Iframe')
# Get first list
li = browser.find_element_by_class_name('user-list')
user_list = li.find_elements_by_tag_name('a')
for user in user_list:qq_list.append(get_qq(user))
五. 群发邮件
下面的事情就比较简单了,就是利用SMTP发送邮件,这个邮件的内容最好不要只是一句简单的新年祝福, 应该是富文本的,比如说应该带一张图片,这里所到的知识是所谓的“电子邮件风格”的代码(说白了还是HTML的内容),由于SMTP的内容是在是纷繁复杂,这里不过多展开,下面贴出代码:
def mail(to):""":param to: The parameter 'to' is each one's qq mail's address.:return: The function has no return. Sending email is its work."""msg = MIMEMultipart("related")msg['From'] = sender # 发送者msg['To'] = to # 接收方msg['Subject'] = "Happy New Year!" #邮件主题msgAlternative = MIMEMultipart("alternative") # 富文本模式# 下面的就是邮件的内容,采用电子邮件风格的代码mail_content = """<p>HappyNewYear!</p><br/><img src='cid:image1'></img>"""msgAlternative.attach(MIMEText(mail_content, 'html', 'utf-8'))msg.attach(msgAlternative)# 取得图片的位置,并获取它with open(r'C:\Users\24312\Desktop\NewYear.jpg', 'rb') as file:img = MIMEImage(file.read())img.add_header('Content-ID', '<image1>')msg.attach(img)server = smtplib.SMTP_SSL("smtp.qq.com", 465)server.login(sender, t_password)server.sendmail(sender, [to, ], msg.as_string())server.quit()# Send mail to everyone
sender = '1234567@qq.com' # 自己的邮箱
# It was the third party password
t_password = 'deep♂dark♂fantasy' # 第三方软件的登陆码,下面会讲
for qq in qq_list:mail(qq + '@qq.com')
这里有个东西叫做第三方软件的登陆码,不同人,不同的协议是不一样的,下面我简单地介绍一下如何获取这个登陆码。
首先进入邮箱——点击设置——进入账号——下翻直到找到上述页面——开启POP3/SMTP服务。这里选择SMTP服务是因为我们所用的就是SMTP协议,接下来按它的指示操作就可以获得第三方应用的登陆码了。注意这个登陆码不同于邮箱的密码,使用邮箱的密码是无法成功的。
六. 完善
由于是新年的邮件,所以一般这种邮件都会在凌晨发,考虑到能够完全自动化,我们可以在程序的一开始就设置一个while循环(不断地进行判断),再使用time模块中的time.localtime获取本地时间;判断是否进入新年,来决定程序是否执行 。为了防止邮件的重复发送,在程序最后要加一个break。
邮件发送完成的通告:整个过程耗时比较长,尤其是点赞人数比较多的时候,所以最好能够再程序结束时提醒我们以下,我这里使用了一个print,再发送完毕后会显示All done!
七. 成果展示以及源码地址
成果:
源码地址 :https://github.com/Greg7shen/HappyNewYear-E-mail
在我提示可能会有bug(我最害怕的还是垃圾邮件的发送,而不是什么语法错误),还有这么多人支持我,真的很开心,最后祝大家新年快乐,万事如意。
用python给说说点赞的人群发新年祝福邮件相关推荐
- 用Python 给财务写了个“群发工资条”,效果不错
作者 | 黄伟呢 来源 | 数据分析与统计学之美(ID:gh_21c25c7e71d0) 本文介绍 这是一个很好的 Python 自动化的案例.对于小公司,采用手动方式一个个发送邮件还是可以的.如果一 ...
- 分享3个好用到爆的 Python 模块,点赞收藏
作者 | 俊欣 来源 | 关于数据分析与可视化 今天给大家介绍3个特别好用的Python模块,知道的人可能不多,但是特别的好用. Psutil Pendulum Pyfiglet Psutil Pyt ...
- python有趣小程序春节祝福-教你用python群发微信新年祝福
逢年过节发新年祝福成为新时代的新习俗,近年来微信的出现令人们从传统的电话祝福.短信祝福升级为微信祝福,文字,图片,视频应有尽有,但是随着网络时代的兴起,朋友圈逐渐扩大,没法对所有人都一一发送,所以群发 ...
- 使用python和tornado实现多人网页聊天程序--界面
标题使用python和tornado实现多人网页聊天程序 上一个文章给出了后端python的全部代码,那现在就到所有的页面处理了. 上面提到的几个页面分别有: 1.登录页面 2.注册页面 3.聊天室首 ...
- 【干货】教你用python给你的微信朋友群发私人订制的藏头诗
(图片来源于互联网:http://img.xiazaizhijia.com/uploads/2018/0123/20180123093158149.jpg) 具体想实现的事情是:向微信朋友列表中的朋友 ...
- python公众号点赞_python点赞
书籍:Learning Python for Forensics 2nd Edition - 2019.pdf 简介 使用Python设计,开发和部署创新的取证解决方案 参考资料 下载:https:/ ...
- 好想学python公众号怎么猜人_你要偷偷的学Python,然后惊呆所有人(第六天)
标题无意冒犯,就是觉得这个广告挺好玩的 文章目录 前言 邮件群发 代码参考 伪代码1:发送一个空壳邮件 伪代码2:构建邮件内容 群发邮件 提高代码可复用性与可用性 告白气球 我画了个圈,欢迎大家来我们 ...
- Python入门教程:很多人推荐学 Python 入 IT ,如果学完 Python 找不到工作怎么办...
Python入门教程:很多人推荐学 Python 入 IT ,但是如果学完 Python 找不到工作怎么办,这也是很多人担心的问题. 很多人推荐通过学习 Python 入行 IT 一是因为 Pytho ...
- python是基于什么语言开发-python是哪个国家的人开发的语言
python是Google的吉多·范罗苏姆设计的,Python是一种跨平台的计算机程序设计语言.作为一种面向对象的动态类型语言,它最初设计用于编写自动化脚本. 是Google的吉多·范罗苏姆设计的. ...
最新文章
- PHP性能调优---PHP-FPM配置及使用总结
- C语言之通过指针变量访问整型变量
- AmazeUI基本样式
- vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期
- java面试编程面试题_完美的编程面试问题
- 发布会不用开了?三星Galaxy Note 10 Plus完整规格泄露
- MAVEN(一)中的Scope
- 【axure教程】产品流程图的制作方法详解
- 程序 卡塔_卡塔斯码
- arcgis自动完成面怎么用_ArcGIS 自动生成线或者面
- Staring....
- RPG Maker MV 遇敌对战
- jQuery的addClass、siblings、removeClass、each、html、eq、show/hide用法
- Python3.6笔记之腌制泡菜(pickle模块的用法)
- 成为软件行业的福尔摩斯,还是苏格兰场?
- Android各种大内存脚本对比(app2sd,a2sd,a2sd+,d2sd,CronMod,Mound2SD)
- 成功之路散文连载之伪君子岳不群
- 机器学习中,什么是线性和非线性?
- 74160ENT引脚设计法+同步置数法接成60进制加法计数电路(设计方案2)
- 用AE做Unity UI动画
热门文章
- JS 异步编程的解决方案,以及回调地狱的解决方案
- 为什么很多人工作都不开心
- 华为路由hilink_友猫:华为路由器的 Hi 按键功能(HiLink 智联和WPS)
- 今日头条2018 坐标
- AST反混淆实战-高级难度
- app后端设计(6)-- LBS
- Gitosis不能拉取代码,报错 ERROR:gitosis.serve.main:Repository read access denied fatal
- jvm调优二:jvm内存模型剖析和参数设置
- 解决“你当前无权访问该文件夹”问题的8种方法
- windows输入法输入英文字母中间有空格