PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;
<?php
/**
* Description
* @authors Your Name (you@example.org)
* # 根据时时彩的最新一期的号码, 判断如果为首尾同号则发送短信
* - phpQuery 分析网页, 获得网页数据, 获得html数据
* - curl_init 模拟真实浏览器访问, 配合 PHPquery
* - 根据手机号, 结合前端 get与post 请求发送短信通知
* - 使用的 php 的正则, 替换字符串
* - 使用 sleep 与 while 反复执行代码
* - 反复执行代码的同时, 还可以在浏览器输出
* # 只有刷新 wamp 才能终止进程`
* # 实际在云服务中会报错: FastCGI 进程超过了配置的活动超时时限的解决方法
* - 无解
* - 所以只能在本机使用wamp开启
* @date 2018-07-26 17:13:39
* @version 1.0.0
*/
header("Content-Type: text/html;charset=utf-8");
require('phpQuery/phpQuery.php');
// $eg1=phpQuery::newDocumentFile("http://www.whu.edu.cn/tzgg.htm");
// $eg2=phpQuery::newDocumentFile("https://www.baidu.com/");
// $eg3=phpQuery::newDocumentFile("http://caipiao.163.com/award/cqssc/");
// echo pq("title",$eg1->getDocumentID())->html()."<br>";//$eg1与$eg1->getDocumentID()效果等同
// echo pq("title")->html()."<br>";//就近匹配 $eg2
// phpQuery::selectDocument($eg1); //默认会使用选定的文档
// $mes=pq("ul")->html();//获取所有的ul标签中的html内容
// $mes=pq("ul,li")->html();//获取所有的ul以及li标签中的html内容
// $t=pq("ul[class='article']")->html();//获取ul class="article"的html内容
/***
* 根据 手机号, 第几期, 当期号码 发送短信通知
*/
function fnSendMessageNotifications($mobile, $lotteryNumber1, $lotteryNumber2)
{
echo '<br>****[' . $mobile . ']****<br>' ;
echo '<br>****[' . $lotteryNumber1 . ']****<br>' ;
echo '<br>****[' . $lotteryNumber2 . ']****<br>' ;
$host = "http://cowsms.market.alicloudapi.com";
$path = "/intf/smsapi";
$method = "GET";
$appcode = "你的appcode";
$headers = array();
array_push($headers, "Authorization:APPCODE " . $appcode);
$querys = "mobile=" . $mobile . "&paras=" . $lotteryNumber1 . "%2C" . $lotteryNumber2 . "&sign=%E6%B6%88%E6%81%AF%E9%80%9A&tpid=155";
echo '<br>****[' . $querys . ']****<br>' ;
$bodys = "";
$url = $host . $path . "?" . $querys;
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
if (1 == strpos("$".$host, "https://"))
{
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
}
var_dump(curl_exec($curl));
}
/**
* 添加 USERAGENT , 模拟真实浏览器访问
* */
function get_fcontent($url, $timeout = 5 ) {
$url = str_replace( "&amp;", "&", urldecode(trim($url)) );
$cookie = tempnam ("/tmp", "CURLCOOKIE");
$ch = curl_init();
curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt( $ch, CURLOPT_URL, $url);//需要获取的URL地址,也可以在 curl_init()函数中设置。
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );//连接结束后保存cookie信息的文件。
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );//启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
curl_setopt( $ch, CURLOPT_ENCODING, "" );//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。在cURL 7.10中被加入。
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );//将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );//当根据Location:重定向时,自动设置header中的Referer:信息。
//禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); // # required for https urls, 在发起连接前等待的时间,如果设置为0,则无限等待。
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout ); // 设置cURL允许执行的最长秒数。
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 ); //指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。
$content = curl_exec( $ch );
curl_close ( $ch );
return $content;
}
// set_time_limit(0); // Maximum execution time , 设置成0的话,就是永不过期。
$lastQi = ''; // foreach保存的最后一个 期号
$lastNumber = ''; // foreach保存的最后一个 号码
$nTheLastTraversalPeriod = ''; // 缓存上一个foreach的首尾相同的期号, 用以比对是否为最新一期, 也用来当做最后一个符合条件的期号
$nTheLastTraversalNumber = '';
$sessionStorage_cacheQi = ''; // 缓存上一个发送了短信的期号
/**
* 获得最新一期期号, 获得最新一期号码
* */
function fnGetTheLatestPhase(){
//详细每个curlopt意思.转http://www.jb51.net/article/39331.htm
global $lastQi;
global $lastNumber;
global $nTheLastTraversalPeriod;
global $nTheLastTraversalNumber;
global $sessionStorage_cacheQi;
$url = 'http://caipiao.163.com/award/cqssc/';
$content = get_fcontent($url);
phpQuery::newDocumentHTML($content);
// $main = pq('title')->html();
// $table = pq('.award-winNum')->html();
$table_tr = pq('tr');
$nCurrentTerm = '';
foreach( pq(".award-winNum") as $table_tr ) {
$nCurrentTerm = pq($table_tr) -> prev()-> html(); // 当前的期号
$nCurrentNumber = pq($table_tr) -> html();// 当前号码
if($nCurrentNumber[0] === $nCurrentNumber[strlen($nCurrentNumber)-1] && intval($nTheLastTraversalPeriod)<intval($nCurrentTerm)){ // 假设当前号码的首尾相同, 且上一个遍历的首尾相同的期号小于当前期号(是foreach最后一个遍历的最大的期号)
$nTheLastTraversalPeriod = $nCurrentTerm;
$nTheLastTraversalNumber = $nCurrentNumber;
echo '<br>****[' . $nTheLastTraversalPeriod . ']****<br>' ;
}
if($nCurrentTerm === '001' && !is_numeric(preg_replace('/ /', '', $nCurrentNumber))){
// 假设重新开始, 每天新一期, 旧的还在缓存, 如何办?
// 假设当前的期号为001, 表示的时时彩从头开始, 此时需要:
// - 删除缓存的上一个发送短信的期号
// - 删除缓存的上一个首尾相同的期号
$nTheLastTraversalPeriod = '';
$sessionStorage_cacheQi = '';
}
// // echo pq($table_tr);
// $text = pq($table_tr) -> html();// 号码
// $_lastQi = pq($table_tr) -> prev()-> html(); // 当前元素的上一个元素
// echo '<br>****[' . $nTheLastTraversalPeriod . ']****<br>' ;
// if($text[0] === $text[strlen($text)-1] && intval($sessionStorage_cacheQi||'')<intval($_lastQi) && intval($nTheLastTraversalPeriod)<intval($_lastQi) ){
// if($text[0] === $text[strlen($text)-1] && intval($nTheLastTraversalPeriod)<intval($_lastQi) ){
echo '<br>';
}
echo '<hr>';
if($nTheLastTraversalPeriod !== $sessionStorage_cacheQi){
// 假设没有值得发送的期号, 假设当前发送的期号与之前发送的期号不同(不能相同), 则不执行相关代码(发送短信)
$sessionStorage_cacheQi = $nTheLastTraversalPeriod;
$object = (object) [
'nPeriodNumber' => $nTheLastTraversalPeriod,
'nNumber' => preg_replace('/ /', '', $nTheLastTraversalNumber),
];
return $object;
}else{
$object = (object) [
'nPeriodNumber' => '',
'nNumber' => '',
];
return $object;
}
}
// var_dump(fnGetTheLatestPhase());
// $options = fnGetTheLatestPhase();
// fnSendMessageNotifications('185********', $options->nPeriodNumber, $options->nNumber);
while (1) {
$options = fnGetTheLatestPhase();
// 两者必须同时使用来刷新输出缓冲
ob_flush(); //将数据从php的buffer中释放出来
flush(); //将释放出来的数据发送给浏览器, 要是没有 flush 和 ob_flush , 浏览器就会陷入一种假卡死的状态
var_dump($options);
if($options->nPeriodNumber){
fnSendMessageNotifications('185****', $options->nPeriodNumber, $options->nNumber);
}
sleep(5);
}
原文地址:https://segmentfault.com/a/1190000015798666
PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;的更多相关文章
- 使用ajax爬取网站图片()
以下内容转载自:https://www.makcyun.top/web_scraping_withpython4.html 文章关于网站使用Ajaxj技术加载页面数据,进行爬取讲的很详细 大致步骤如下 ...
- 使用HtmlAgilityPack爬取网站信息并存储到mysql
前言:打算做一个药材价格查询的功能,但刚开始一点数据都没有靠自己找信息录入的话很麻烦的,所以只有先到其它网站抓取存到数据库再开始做这个了. HtmlAgilityPack在c#里应该很多人用吧,简单又 ...
- java爬取网站信息和url实例
https://blog.csdn.net/weixin_38409425/article/details/78616688(出自此為博主) 具體代碼如下: import java.io.Buffer ...
- python爬取网站页面时,部分标签无指定属性而报错
在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下: 百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一 ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】
[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...
- 使用scrapy爬取网站的商品数据
目标是爬取网站http://www.muyingzhijia.com/上全部的商品数据信息,包括商品的一级类别,二级类别,商品title,品牌,价格. 搜索了一下,python的scrapy是一个不错 ...
- Python 利用 BeautifulSoup 爬取网站获取新闻流
0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup: ...
- Python爬取招聘信息,并且存储到MySQL数据库中
前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...
- python 实现爬取网站下所有URL
python3 实现爬取网站下所有URL 获取首页元素信息: 首页的URL链接获取: 遍历第一次返回的结果: 递归循环遍历: 全部代码如下: 小结: python3.6 requests && ...
随机推荐
- 【T^T】【周赛】第一周周赛——欢迎16级的新同学
借光光,YZC的福气(今天拿到Rank1),本来还可以更好的,前面吃M去了,ABC都很晚切,而且异常兴奋,结果WA了好多发,但还是由于水题看题不清,分析不清导致的 A Home W的数学 Descri ...
- hdoj--2187--悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
悼念512汶川大地震遇难同胞--老人是真饿了 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- IDEA 单元测试
下载所需的两个 jar 包,下载地址:Download and Install · junit-team/junit4 Wiki · GitHub junit-4.12.jar hamcrest-co ...
- 并不对劲的[noi2006]网络收费
题目略长,就从大视野上复制了. 听上去好像费用流,然而…… ***************************表示略长的题目的分界线************************ 1495: [ ...
- django 数据库连接模块解析及简单长连接改造
django 数据库连接模块解析及简单长连接改造工作中纯服务端的项目用到了线程池和django的ORM部分.django 的数据库连接在每一个线程中开启一份,并在查询完毕后自动关闭连接. 线程池处理任 ...
- Python不兼容问题
今天遇到了一个Python2与3不兼容的坑. ride是基于robot框架的python自动化ui,但它只支持python2,而我电脑环境只有python3,想跑别人基于ride编写的测试用例,折腾了 ...
- Ural 1382 2SAT
ural1382 直接套用 2SAT模板 缩点 拓扑排序... #include<iostream> #include<cstdio> #include<cstdlib& ...
- POJ1743 Musical Theme 最长重复子串 利用后缀数组
POJ1743 题目意思是求不重叠的最长相同变化的子串,输出该长度 比如1 2 3 4 5 6 7 8 9 10,最长长度为5,因为子串1 2 3 4 5 和 6 7 8 9 10变化都一样的 思路: ...
- Java应用程序中的声音播放
声音可以创造意境,触发遐想,当与虚拟图像相结合时,更加可以让整个世界充满幻觉,声音是多媒体技术的基础. 播放声音是Java对多媒体的支持一个重要部分,它支持的声音文件类型主要有: AU - (扩展名为 ...
- NTFS中的ADS的一些问题
有关ADS的简单说明请看http://www.xfocus.net/articles/200212/466.html 可以看到ADS在很久以前就被一些安全人员所关注,并且也提出了一些经典的利用,比如隐 ...