zoukankan      html  css  js  c++  java
  • 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( "&", "&", 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

  • 相关阅读:
    Servlet页面跳转实现方法的区别
    谈JSP与XML的交互
    xml可以用做什么?
    Struts1.2入门知识
    做java web 开发的简单项目必须具备的知识
    Web工程师必备的18款工具
    css的四种调用方式
    jQuery Utilities
    历年考研数学常考题型考试必备
    。net思维导图
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9979035.html
Copyright © 2011-2022 走看看