<?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( "&", "&", 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 爬取网站信息后, 向指定用户发送指定短信;的更多相关文章

  1. 使用ajax爬取网站图片()

    以下内容转载自:https://www.makcyun.top/web_scraping_withpython4.html 文章关于网站使用Ajaxj技术加载页面数据,进行爬取讲的很详细 大致步骤如下 ...

  2. 使用HtmlAgilityPack爬取网站信息并存储到mysql

    前言:打算做一个药材价格查询的功能,但刚开始一点数据都没有靠自己找信息录入的话很麻烦的,所以只有先到其它网站抓取存到数据库再开始做这个了. HtmlAgilityPack在c#里应该很多人用吧,简单又 ...

  3. java爬取网站信息和url实例

    https://blog.csdn.net/weixin_38409425/article/details/78616688(出自此為博主) 具體代碼如下: import java.io.Buffer ...

  4. python爬取网站页面时,部分标签无指定属性而报错

    在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下: 百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一 ...

  5. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  6. 使用scrapy爬取网站的商品数据

    目标是爬取网站http://www.muyingzhijia.com/上全部的商品数据信息,包括商品的一级类别,二级类别,商品title,品牌,价格. 搜索了一下,python的scrapy是一个不错 ...

  7. Python 利用 BeautifulSoup 爬取网站获取新闻流

    0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup:   ...

  8. Python爬取招聘信息,并且存储到MySQL数据库中

    前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...

  9. python 实现爬取网站下所有URL

    python3 实现爬取网站下所有URL 获取首页元素信息: 首页的URL链接获取: 遍历第一次返回的结果: 递归循环遍历: 全部代码如下: 小结: python3.6 requests && ...

随机推荐

  1. pandas 绘图 机器学习看特征相关性

    pandas 绘图 import numpy as np import tflearn from tflearn.layers.core import dropout from tflearn.lay ...

  2. 类型配置命名空间 —— XML schema

    对于基于 XML 的配置,Spring 2.0 以后告别 DTD 格式(Document Type Definition)的配置文件,开始采用 Schema 格式,Schema 的突出亮点即是可让不同 ...

  3. [APIO2018]Circle selection

    https://www.zybuluo.com/ysner/note/1257597 题面 在平面上,有\(n\)个圆,记为\(c_1,c_2,...,c_n\).我们尝试对这些圆运行这个算法: 找到 ...

  4. NOI.AC #31 MST —— Kruskal+点集DP

    题目:http://noi.ac/problem/31 好题啊! 题意很明白,对于有关最小生成树(MST)的题,一般是要模拟 Kruskal 过程了: 模拟 Kruskal,也就是把给出的 n-1 条 ...

  5. 15_传智播客iOS视频教程_OC语言完全兼容C语言

    OC支持C语言所有的运算符并且效果是一样的.C语言中所有的运算符OC都支持.这些所有的运算符OC当中全部都支持. 包括C语言的结构体.枚举全部都可以写在OC当中,没有任何问题,并且效果是一样的. 比如 ...

  6. bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成树】

    有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 #include<iostream> #include ...

  7. python re的使用

    re 正则表达式操作  本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用 ...

  8. SpringMVC实现Action的两种方式以及与Struts2的区别

    4.程序员写的Action可采用哪两种方式? 第一.实现Controller接口第二.继承自AbstractCommandController接口 5.springmvc与struts2的区别? 第一 ...

  9. 向Linus学习,让代码具有good taste

    在最近关于 Linus Torvalds 的一个采访中,这位 Linux 的创始人,在采访过程中大约 14:20 的时候,提及了关于代码的 “good taste”.good taste?采访者请他展 ...

  10. es6之iterator,for...of

    遍历器(Iterator)是一种统一的接口机制,来处理所有不同的数据结构. JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和 ...