需求:http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/这个网页会公布进口水产品境外生产企业注册名单,但公布日期不一定,所以想自动检查美国(2014年07月21日)这个条目是否更新了,如果更新了发邮件通知我。方法:获取网页,查看网页是否存在“美国(2014年07月21日)”若不存在则更新了。发邮件用PHPMailer的SMTP发送邮件很方便。
check.php
<?php ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*60*10;//单位是秒,每10小时执行一次 do{ $run = include 'config.php'; if(!$run) die('process abort'); $url = "http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,20); $content = curl_exec($ch); curl_close($ch); $hasAutime=strpos($content,'美国(2014年07月21日'); $hasAu=strpos($content,'美国');//防止没有下载到网页误触发,方法不可取 if (!$hasAutime && $hasAu){ require 'mail/mySendMail.php'; $subject="内容有更新"; $body="内容有更新,请访问<a href='http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/'>http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/</a>"; if(mySendMail("[email protected]","name",$subject,$body)){ echo "有更新,已发送邮件提醒"; } else { echo "有更新,邮件发送失败"; } die('process abort'); } else { echo "not modified"; } sleep($interval); }while(true); ?>
config.php是中止代码运行的,否则就永远执行下去了。将1改为0即可中止程序。
<?php return 1; ?>
PHPMailer的配置很简单,我用过gmail和163邮箱都没问题,mySendMail.php
<?php function mySendMail($recipient,$recipientName,$subject,$body){ require 'PHPMailerAutoload.php'; date_default_timezone_set("Asia/Shanghai");//设定时区东八区 $mail = new PHPMailer; $mail->CharSet ="UTF-8";//设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码 $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp.163.com'; // Specify main and backup server $mail->Port = 465; // SMTP服务器的端口号 $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'my163acc'; // SMTP username $mail->Password = 'my163pw'; // SMTP password $mail->SMTPSecure = 'ssl'; // Enable encryption, 'ssl' also accepted $mail->From = '[email protected]'; $mail->FromName = 'no-reply'; $mail->addAddress($recipient, $recipientName); // Add a recipient, Name is optional $mail->WordWrap = 50; // Set word wrap to 50 characters $mail->isHTML(true); // Set email format to HTML $mail->Subject = $subject; $mail->Body = $body; if(!$mail->send()) { return false; exit; } return true; } ?>
这个方法并不好,php周期执行任务比较危险。所以我后来使用了新浪的云服务SAE,用它的cron来定期执行检查就好多了。
用微博号登陆SAE,新建项目,我一看还支持python,就建了python的项目,结果SAE的python是2.7,我是按python3写的,就作罢了,不过还是贴一下python3的代码吧。
# encoding:UTF-8 import re,urllib.request,time,smtplib from email.mime.text import MIMEText from email.header import Header def check(): url = "http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/" request = urllib.request.Request(url) try: response = urllib.request.urlopen(request) except (urllib.error.HTTPError, socket.error,urllib.error.URLError) as e: print('Connection error occurred when inserting data.') else: r = response.read().decode('utf-8') patternAutime=re.compile("美国(2014年07月21日") matchAutime=patternAutime.search(r) patternAu=re.compile("美国") matchAu=patternAu.search(r) if (not matchAutime) and (matchAu): print("Modified!Modified!Modified!Modified!") sender = '[email protected]' receiver = '[email protected]' subject = '内容有更新' smtpserver = 'smtp.163.com' username = 'my163acc' password = 'pinwei4009988661' msg = MIMEText('内容有更新,请访问http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/','plain','utf-8') msg['Subject'] = Header(subject, 'utf-8') smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username,password) smtp.sendmail(sender,receiver,msg.as_string()) smtp.quit() return 0; else: print("no modify") return 1; i=1 flag=1 while flag:#6000秒检查一次,最多查看20次 st=check() time.sleep(6000) i+=1 if (i>20) or (st==0): flag=0 exit()
然后新建了一个php项目,由于要上传PHPMailer的代码,所以在线编辑不够用,按文档安装了TortoiseSVN,不用不知道,真是比命令行方便啊!然后修改index.php
<?php $url = "http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,20); $content = curl_exec($ch); curl_close($ch); $hasAutime=strpos($content,'美国(2014年07月21日'); $hasAu=strpos($content,'美国'); if (!$hasAutime && $hasAu){ require 'mail/mySendMail.php'; $subject="内容有更新"; $body="内容有更新,请访问<a href='http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/'>http://www.cnca.gov.cn/ywzl/gjgnhz/jkzl/</a>"; if(mySendMail("[email protected]","name",$subject,$body)){ echo "有更新,已发送邮件提醒"; } else { echo "有更新,邮件发送失败"; } echo "有更新,已发送邮件提醒"; } else { echo "not modified"; } ?>
编辑config.yaml,cron字段设置每12小时执行一次
name: YOURPROJNAME version: 1 cron: - description: cron check url: /index.php schedule: "* */12 * * *" timezone: Beijing