分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;

发布时间:2023-09-06 02:22责任编辑:苏小强关键词:PHP前端
<?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 爬取网站信息后, 向指定用户发送指定短信;

原文地址:https://www.cnblogs.com/lalalagq/p/9979035.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved