今天准备给师傅一块去应急响应,票都定好了,发现忘带身份证了,MDZZ…所以我就这样错失了一次宝贵的机会…更™可恶的是我去退票,竟然给我说没有身份证退不了。。。我特么的要是有身份证,我还退你大爷啊。。。
所以想搞它,一想,算了,凭我这本事搞12306还是别装逼,所以就有了这个脚本。。。
源代码如下:
测试结果:
说明:
脚本分为三部分:
- 记录日志
- 发送邮件
- 车票信息捕捉
记录日志会在脚本目录下生成一个watch.log
文件,这个主要是得结合实时捕捉数据,你可以定时也可以使用crontab
,这里我就没在加了(还有十个网站没测呢,政府网站真是尼玛啊,谁有比较好的经验望大牛们不吝分享,不说了都是泪…)
发送邮件部分主要用了smtplib和email
库,具体代码为:
|
|
第一个参数就是邮件正文,第二个参数是MIME的subtype,传入’plain’,最终的MIME就是’text/plain’,最后设置编码为gb2312,不过为了兼容性,你可以使用utf-8
,具体的过程函数我就不解释了。
信息抓取部分,很简单就是把数据变为数组,从数组中匹配信息。这里我遇到一个问题:urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
这个错误信息主要是因为:SSL: CERTIFICATE_VERIFY_FAILED
Python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书。而当目标网站使用的是自签名的证书时就会抛出一个 urllib2.URLError: 的错误消息.
解决方案:
附:
smtp协议的基本命令包括:
SMTP会话的流程:
- ehlo
- auth login
- mail from
- rcpt to
- data
- quit
上面说的是最普通的情况,但是现在好多企业邮件都是安全邮件的,就是通过SSL发送的邮件,这个怎么发呢?SMTP对SSL安全邮件的支持有两种方案,一种老的是专门开启一个465端口来接收ssl邮件,另一种更新的做法是在标准的25端口的smtp上增加一个starttls
的命令来支持。
这个很简单,smtplib
里就有这个方法,叫smtplib.starttls()
。当然,不是所有的邮件系统都支持安全邮件的,这个需要从ehlo
的返回值里来确认,如果里面有starttls
,才表示支持。
注意:
以上的代码为了方便我都没有判断返回值,严格说来,是应该判断一下返回的代码的,在smtp协议中,只有返回代码是2xx或者3xx才能继续下一步,返回4xx或5xx的,都是出错了。