前言
前几天晚上洗澡的时候,洗头洗到一半,居然停水了!泡沫都没冲掉!
后来才知道原来校园网在停水前一天已经发布通知了,但是由于平时很少关注校园网通知,加上班长也没有转发通知,所以导致这个事情发生。
于是就想写一个定时任务,推送一下新通知~
执行流程
- 利用
sunra/php-simple-html-dom-parser
拓展,分析校园网通知页面源码,发现新通知时,通过公众号推送消息(也可以是邮箱等等) - 利用
cron
作定时任务
详细步骤
- 首先利用composer安装
sunra/php-simple-html-dom-parser
- 然后可以在vender目录看到 sunra ,在使用文件中直接 use 使用
use Sunra\PhpSimple\HtmlDomParser;
- 接下来对拓展的操作可以在官方文档查找
官方文档 - 在获取网站源码的时候,利用 file_get_html(‘http://xxxx’)时,报错了!
file_get_contents() stream does not support seeking
后来查找资料才知道,远程文件不支持寻求(偏移)。尝试寻找非本地文件可能会使用较小的偏移量,但这是不可预测的,因为它适用于缓冲流。
您可以执行的操作是substr在您检索页面内容后使用:
name, 849, 32);
不过后来我是直接 curl 源码之后再利用 str_get_html($str);。。。。
- 一开始写的是第一次爬取通知列表时,爬取第一条通知,然后写入文件,并推送。 接下来每次爬取第一条之后都和写入文件的比较是否一致, 不一致就推送消息,然后更新文件。。
后来发现有的通知会被置顶!而且置顶之后有可能又取消置顶,总之不能只判断第一条。
根据观察之后,发现每天最多只会发两条通知,加上置顶位的话,循环爬去前四条通知应该是可以的了。
然后将爬取和文件比对一下,是否已经存在,存在的话就跳过,未存在就追加写入文件,然后推送通知。
use APP\Untis\WeChatSDK;
use Sunra\PhpSimple\HtmlDomParser;
/**
* 分析源码
*
* @return int|string
*/
public function school() {
$url = "http://xxxx";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //保存在变量中,而不是直接输出
$html = curl_exec($ch);
if(curl_errno($ch)) {
return curl_errno($ch);
}
curl_close($ch);
$dom = HtmlDomParser::str_get_html($html);
$path = base_path().'/config/school.txt';
$oldLinks = file_get_contents($path);
for($i=0; $i<4; $i++) {
$link = $dom->find('ul', 2)->find('li', $i)->find('a', 0)->href;
$title = $dom->find('ul',2)->find('li', $i)->find('a', 0)->title;
if(!strstr($oldLinks, $link)) {
$oldLinks = $oldLinks.','.$link;
file_put_contents($path, $oldLinks);
$link = 'http://xxx/'.$link;
$this->schoolPush($link, $title);
}
}
$dom->clear();
}
/**
* 推送新通知
*
* @param $link
* @param $title
* @return mixed
*/
private function schoolPush($link, $title)
{
$data = config('school_account'); //待推送人的openid
foreach ($data as $datum) {
if(!empty($datum)) {
$sdk = new WeChatSDK(); //封装好的sdk,我这里直接调用了
$openid = $datum;
$tplMask = 'xxxx';
$url = $link;
$arr = [
'first' => array(
'value' => '校园网新通知来啦~',
'color' => '#FF0000'
),
'keyword1' => array(
'value' => $title,
'color' => '#3CB371'
),
'keyword2' => array(
'value' => $link,
'color' => '#FF0000'
),
'keyword3' => array(
'value' => '? ? ? ?',
'color' => '#FF0000'
),
'remark' => array(
'value' => '点击跳转到校园网该通知噢~',
'color' => '#FF0000'
)
];
$result = $sdk->sendTplMessage($openid, $tplMask, $arr, $url);
}
}
return $result;
}
- 设置定时访问该任务
//进入cron编写状态
crontab -e
//下面这里的五个星号分别代表了分、时、日、月、周,具体请百度相关的语法;后面的url链接更换为相应的链接即可。
//我这里设置了 每15 分钟执行一次
*/15 * * * * /usr/bin/curl http:// www.xxx.cn/school
保存即可,保存后需要service crond restart
重启任务
crontab -l
查看任务,crontab -r
删除任务
7.推送结果