input_163.class.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. /**
  3. * @author:王刚涛
  4. * 用于获取历史数据各种指数
  5. * http://hq.sinajs.cn/list=s_sz000002
  6. */
  7. class Input_163
  8. {
  9. const GLOBAL_URL_0 = "http://quotes.money.163.com/service/chddata.html?code=";
  10. const GLOBAL_URL_1 = "&start=";
  11. const GLOBAL_URL_2 = "&end=";
  12. const GLOBAL_URL_3 = "&fields=TOPEN;HIGH;LOW;TCLOSE;VATURNOVER;VOTURNOVER;CHG;PCHG";
  13. static private function curl_get_data($url){
  14. $curlHandle = curl_init();
  15. curl_setopt($curlHandle, CURLOPT_URL, $url);
  16. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  18. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  19. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  20. $content = curl_exec($curlHandle);
  21. curl_close($curlHandle);
  22. $content1 = explode("\n", $content);//以换行符进行分割字符串
  23. return $content1;
  24. }
  25. //接口使用的编码,深圳加1,上海加0
  26. static private function getCodeForURL($code)
  27. {
  28. $preNum = '0';
  29. $index = Index::getInfoByCode($code);
  30. if ($index['exchange'] == STOCK_EXCHANGE_SZ) {
  31. $preNum = '1';
  32. }
  33. return $preNum.$code;
  34. }
  35. //深市返回的成交量以个为单位,需转换为以手为单位
  36. static private function getAmountForIndexDayK($code, $amount)
  37. {
  38. $newAmount = $amount;
  39. $index = Index::getInfoByCode($code);
  40. if ($index['exchange'] == STOCK_EXCHANGE_SZ) {
  41. $newAmount = round($amount / 100);
  42. }
  43. return $newAmount;
  44. }
  45. //获取指定时间段指数的历史数据
  46. static private function getPartIndexDayK($code, $start_date, $end_date)
  47. {
  48. $urlCode = self::getCodeForURL($code);
  49. $url = self::GLOBAL_URL_0.$urlCode.self::GLOBAL_URL_1.$start_date.self::GLOBAL_URL_2.$end_date.self::GLOBAL_URL_3;
  50. $contentList = self::curl_get_data($url);
  51. if (empty($contentList[1])) { //只有标题,没有内容
  52. return;
  53. }
  54. for ($i = count($contentList) - 1; $i > 0; $i--) { //倒叙遍历,日期是倒叙的,不遍历标题
  55. $content = trim($contentList[$i]);
  56. if (empty($content)) {
  57. continue;
  58. }
  59. $item = explode(",", iconv("gbk", "utf-8", $content));
  60. $data['code'] = explode("'",$item[1])[1];
  61. $data['date'] = ConverseDate($item[0]);
  62. $data['name'] = trim($item[2]);
  63. $data['timestamp'] = strtotime($item[0]); //当日零点的时间戳
  64. $data['open_price'] = floatval(EmptyToZero($item[3]));
  65. $data['highest_price'] = floatval(EmptyToZero($item[4]));
  66. $data['lowest_price'] = floatval(EmptyToZero($item[5]));
  67. $data['close_price'] = floatval(EmptyToZero($item[6]));
  68. $data['value'] = floatval($item[7]);
  69. $data['amount'] = self::getAmountForIndexDayK($data['code'],floatval($item[8]));
  70. $data['increase_price'] = floatval(EmptyToZero($item[9]));
  71. $data['increase_ratio'] = floatval(EmptyToZero($item[10]));
  72. if ($data['close_price'] == 0) { //当收盘价为0的时候,表示此时的基于9-15点,所以不存储
  73. continue;
  74. }
  75. if (!empty($data['name'])) { //判断非法股票代码
  76. Index_day_k::addOrUpdateByCodeDate($data);
  77. }
  78. }
  79. return;
  80. }
  81. //获取自20140101到前一天的指定的指数数据
  82. static public function getIndexDayK()
  83. {
  84. $indexList = Index::getAllList();
  85. $end_date = (int)date('Ymd', time());
  86. $end_year = (int)($end_date / 10000);
  87. for($year = GLOBAL_BEGIN_YEAR; $year < $end_year; $year++) {
  88. foreach($indexList as $item) {
  89. self::getPartIndexDayK($item['code'], $year.'0101', $year.'1231');
  90. }
  91. }
  92. foreach($indexList as $item) {
  93. self::getPartIndexDayK($item['code'], $end_year.'0101', $end_year.'1231');
  94. }
  95. return;
  96. }
  97. }
  98. ?>