设为首页 收藏本站
查看: 896|回复: 0

[经验分享] php实现查询火车票

[复制链接]

尚未签到

发表于 2017-12-29 18:45:58 | 显示全部楼层 |阅读模式
1 <?php  

2  
  3 /**
  
  4  * author: NickBai
  
  5  * createTime: 2016/12/26 0026 上午 9:11
  
  6  *
  
  7  */

  
  8>  
  9 {
  
10     public $fromStation = null;
  
11     public $toStation = null;
  
12     public $date = null;
  
13
  
14     public function __construct($fromStation = null, $toStation = null, $date = null)
  
15     {
  
16         if (!file_exists(ROOT_PATH . '/data/station.json')) {
  
17             $this->parseStation();
  
18         }
  
19
  
20         $this->fromStation = $fromStation;
  
21         $this->toStation = $toStation;
  
22         $this->date = $date;
  
23     }
  
24
  
25     /**
  
26      * 入口函数
  
27      */
  
28     public function run()
  
29     {
  
30         if (is_null($this->fromStation) || is_null($this->toStation))
  
31             throw new Exception('起始站不能为空!');
  
32         is_null($this->date) && $date = date('Y-m-d');
  
33
  
34         $url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=' . $this->date . '&from_station=';
  
35         $url .= $this->fromStation . '&to_station=' . $this->toStation;
  
36
  
37         $ticketInfo = $this->curlGet($url);
  
38         return $ticketInfo;
  
39     }
  
40
  
41     /**
  
42      * 解析火车站信息
  
43      */
  
44     private function parseStation()
  
45     {
  
46         $url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8992';
  
47         $station = $this->curlGet($url, false);
  
48
  
49         if (empty($station)) {
  
50             throw new Exception('获取站点信息失败!');
  
51         }
  
52
  
53         $delStr = "var station_names ='"; //需要截断的字符
  
54         $station = substr($station, strlen($delStr), strlen($station));
  
55
  
56         $station = explode('@', $station);
  
57         $json = [
  
58             'message' => ''
  
59         ];
  
60
  
61         foreach ($station as $key => $vo) {
  
62             if (empty($vo)) continue;
  
63
  
64             $st = explode('|', $vo);
  
65             $json['value'][] = [
  
66                 'stationName' => $st['1'],
  
67                 'shortName' => $st['3'],
  
68                 'stationFlag' => $st['2']
  
69             ];
  
70         }
  
71         unset($station);
  
72
  
73         file_put_contents(ROOT_PATH . '/data/station.json', json_encode($json));
  
74     }
  
75
  
76     /**
  
77      * 采集数据
  
78      * @param $url
  
79      * @param $decode
  
80      */
  
81     private function curlGet($url, $decode = true)
  
82     {
  
83         $ch = curl_init();
  
84         $timeout = 5;
  
85         $header = [
  
86             'Accept:*/*',
  
87             'Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3',
  
88             'Accept-Encoding:gzip,deflate,sdch',
  
89             'Accept-Language:zh-CN,zh;q=0.8,ja;q=0.6,en;q=0.4',
  
90             'Connection:keep-alive',
  
91             'Host:kyfw.12306.cn',
  
92             'Referer:https://kyfw.12306.cn/otn/lcxxcx/init',
  
93         ];
  
94         curl_setopt($ch, CURLOPT_URL, $url);
  
95         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  
96         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  
97         curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩
  
98         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
  
99         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在
  
100         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  
101         $result = curl_exec($ch);
  
102         curl_close($ch);
  
103
  
104         $decode && $result = json_decode($result, true);
  
105
  
106         return $result;
  
107     }
  
108
  
109 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429455-1-1.html 上篇帖子: PHP实现RTX发送消息提醒 下篇帖子: php中try catch捕获异常实例详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表