sina.class.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. /**
  3. * @author:王刚涛
  4. * 用于获取 当天的股票数据并存入数据库,通过$url,可以设置需要获取的时间段
  5. */
  6. error_reporting(E_ALL & ~E_NOTICE);
  7. class Sina
  8. {
  9. /****
  10. * @param $url
  11. * @return array|bool|string
  12. * 对curl_setopt进行封装,消除代码冗余
  13. */
  14. static private function curl_get_data($url){
  15. $curlHandle = curl_init();
  16. curl_setopt($curlHandle, CURLOPT_URL, $url);
  17. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  18. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  19. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  20. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  21. $content = curl_exec($curlHandle);
  22. curl_close($curlHandle);//防止中文乱码
  23. $content2 = iconv("gbk", "utf-8", $content);//子串
  24. $content3 = substr($content2, stripos($content2, "=\"") + 2); //获取 var hq_str_sz000002="万 科A,30.780,30.800,30.510, ="之后部分
  25. $content4 = substr($content3, 0, strripos($content3, "\";")); //获取 万 科A,30.94,0.14,0.45,584039,178827"; ";之前部分
  26. $content5 = explode(",", $content4);//分割
  27. return $content5;
  28. }
  29. /****
  30. * @param $url
  31. * @return array|bool|string
  32. * 对curl_setopt进行封装,消除代码冗余
  33. */
  34. static private function curl_get_data_list($url, $codeList){ //一次批量获取股票列表
  35. if (empty($codeList)) {
  36. return 0;
  37. }
  38. $curlHandle = curl_init();
  39. curl_setopt($curlHandle, CURLOPT_URL, $url);
  40. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
  41. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
  42. curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, false);
  43. curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
  44. $content = curl_exec($curlHandle);
  45. curl_close($curlHandle);//防止中文乱码
  46. $content2 = iconv("gbk", "utf-8", $content);//子串
  47. $arr1 = explode(";", $content2);//按股票分割
  48. $arr2 = array();
  49. $index = 0;
  50. $codeIndex = 0;
  51. foreach ($arr1 as $key => $item) {
  52. $tempItem = substr($item, stripos($item, "=\"") + 2); //获取 var hq_str_sz000002="万 科A,30.780,30.800,30.510, ="之后部分
  53. $tempItem = substr($tempItem, 0, strripos($tempItem, "\"")); //获取 万 科A,30.94,0.14,0.45,584039,178827"; ";之前部分
  54. $tempItem = trim($tempItem);
  55. if (!empty($tempItem)) {
  56. $arr2[$index] = explode(",", $tempItem);//分割
  57. $arr2[$index]['code'] = $codeList[$codeIndex];
  58. $index++;
  59. }
  60. $codeIndex++;
  61. }
  62. return $arr2;
  63. }
  64. //获取全部股票代码和名称列表
  65. static private function getAllStockCodeAndNameSub($exchange, $sector, $start, $end)
  66. {
  67. $url = "http://hq.sinajs.cn/list=";
  68. $data['exchange'] = $exchange;
  69. $data['sector'] = $sector;
  70. $codeList = array();
  71. $codeIndex = 0;
  72. for($code = $start;$code <= $end; $code++){
  73. $codeStr = sprintf('%06s', $code);
  74. $url .= 's_'.$exchange.$codeStr.',';
  75. $codeList[$codeIndex] = $codeStr;
  76. $codeIndex++;
  77. }
  78. $contentList = self::curl_get_data_list($url, $codeList);
  79. foreach ($contentList as $key => $item) {
  80. $data['code'] .= $item['code'];
  81. $data['name'] = trim($item[0]);
  82. if (!empty($item[0])) { //判断非法股票代码
  83. Stock::updateCodeAndName($data);
  84. }
  85. }
  86. return;
  87. }
  88. //获取全部股票代码和名称列表
  89. static public function getAllStockCodeAndName()
  90. {
  91. //循环遍历所有可能的股票代码,返回不为空,即可入库
  92. self::getAllStockCodeAndNameSub(STOCK_EXCHANGE_SZ, STOCK_SECTOR_SZ_MAIN, 000505, 000510);
  93. return;
  94. }
  95. /****
  96. * @param string $code
  97. * @return mixed
  98. //上证指数表(boniu_index_sh)
  99. */
  100. static public function get_boniu_index_sh($code="000001")
  101. {
  102. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  103. $content3=sina::curl_get_data($url);
  104. $data['increase_value'] = floatval($content3[3]);//涨跌率
  105. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  106. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  107. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  108. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  109. $data['open_price'] = floatval($data2[1]);//开盘价
  110. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  111. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  112. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  113. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  114. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  115. return Index_sh::add($data);
  116. }
  117. /****
  118. * @param string $code
  119. * @return mixed
  120. * 深成指数表(boniu_index_scz)
  121. */
  122. static public function get_boniu_index_scz($code="399001")
  123. {
  124. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  125. $content3=sina::curl_get_data($url);
  126. $data['increase_value'] = floatval($content3[3]);//涨跌率
  127. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  128. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  129. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  130. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  131. $data['open_price'] = floatval($data2[1]);//开盘价
  132. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  133. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  134. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  135. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  136. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  137. return Index_scz::add($data);
  138. }
  139. /***
  140. * @param string $code
  141. * @return mixed
  142. * 上证50指数表(boniu_index_sh50) 000016
  143. */
  144. static public function get_boniu_index_sh50($code="000016")
  145. {
  146. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  147. $content3=sina::curl_get_data($url);
  148. $data['increase_value'] = floatval($content3[3]);//涨跌率
  149. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  150. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  151. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  152. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  153. $data['open_price'] = floatval($data2[1]);//开盘价
  154. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  155. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  156. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  157. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  158. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  159. return Index_sh50::add($data);
  160. }
  161. /***
  162. * @param string $code
  163. * @return mixed
  164. * //沪深300指数表(boniu_index_csi300) 399300
  165. */
  166. static public function get_boniu_index_csi300($code="399300")
  167. {
  168. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  169. $content3=sina::curl_get_data($url);
  170. $data['increase_value'] = floatval($content3[3]);//涨跌率
  171. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  172. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  173. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  174. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  175. $data['open_price'] = floatval($data2[1]);//开盘价
  176. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  177. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  178. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  179. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  180. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  181. return Index_csi300::add($data);
  182. }
  183. //
  184. /***
  185. * @param string $code
  186. * @return mixed
  187. * 创业板指数表(boniu_index_gem) 399006
  188. */
  189. static public function get_boniu_index_gem($code="399006")
  190. {
  191. $url = "http://hq.sinajs.cn/list=s_sz".$code;
  192. $content3=sina::curl_get_data($url);
  193. $data['increase_value'] = floatval($content3[3]);//涨跌率
  194. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  195. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  196. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  197. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  198. $data['open_price'] = floatval($data2[1]);//开盘价
  199. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  200. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  201. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  202. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  203. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  204. return Index_gem::add($data);
  205. }
  206. /****
  207. * @param string $code
  208. * @return mixed
  209. * //科创50指数( boniu_index_kc50) 000688
  210. */
  211. static public function get_boniu_index_kc50($code="000688")
  212. {
  213. $url = "http://hq.sinajs.cn/list=s_sh".$code;
  214. $content3=sina::curl_get_data($url);
  215. $data['increase_value'] = floatval($content3[3]);//涨跌率
  216. $data2=self::get_info_code($code);//调用另一个函数获取其他数据如开盘价等等
  217. $data['increase_price'] = floatval($data2[3]-$data2[2]);//涨跌
  218. // 涨跌价-当日股票最新价与前一日收盘价格(或前一日收盘指数)
  219. $data['date'] = strtotime(date('Y-m-d',time()));//当天的0点时间戳
  220. $data['open_price'] = floatval($data2[1]);//开盘价
  221. $data['close_price'] = floatval($data2[3]);//3点之后的当前价格就是收盘价
  222. $data['hightest_price'] = floatval($data2[4]);//今日最高价
  223. $data['lowest_price'] = floatval($data2[5]);//今日最低价
  224. $data['amount'] = (int)($data2[8]);//成交的股票数,以百为单位
  225. $data['value'] = (int)($data2[9]);//成交金额以万为单位
  226. return Index_kc50::add($data);
  227. }
  228. //
  229. /***
  230. * @param $code
  231. * @param $date
  232. * 根据股票代码获取股票的实时信息
  233. */
  234. static public function get_info_code($code){
  235. $stock_code = $code;
  236. $f = substr($stock_code, 0, 1);
  237. if ($f == "6" || $f == "0" ) {
  238. $stock_code = "sh" . $code;
  239. } else {
  240. $stock_code = "sz" . $code;
  241. }
  242. $url = "http://hq.sinajs.cn/list=" . $stock_code;
  243. $content3=sina::curl_get_data($url);//封装为函数,执行url获取结果并解析
  244. return $content3;
  245. }
  246. /***
  247. * @param $code
  248. * @param $date
  249. * @return mixed
  250. * 日k线表 day_k_******(每月存一张表,比如boniu_day_k_202011)
  251. *
  252. */
  253. static public function get_day_k_base($code, $date)
  254. {
  255. $stock_code = $code;
  256. $f = substr($stock_code, 0, 1);
  257. if ($f == "6" || $f == "0" ) {
  258. $stock_code = "sh" . $code;
  259. } else {
  260. $stock_code = "sz" . $code;
  261. }
  262. $url = "http://hq.sinajs.cn/list=" . $stock_code;
  263. $content3=sina::curl_get_data($url);//封装为函数,
  264. $data['date'] = $content3[30];
  265. $data['code'] = $stock_code;
  266. $data['open_price'] = $content3[1];//开盘价
  267. $data['close_price'] = $content3[3];//3点之后的当前价格就是收盘价
  268. $data['hightest_price'] = $content3[4];//今日最高价
  269. $data['lowest_price'] = floatval($content3[5]);//今日最低价
  270. $data['amount'] = $content3[8];//成交的股票数,以百为单位
  271. $data['value'] = $content3[9];//成交金额以万为单位
  272. return Day_k_base::add($data, $date);
  273. }
  274. //除权除息表(boniu_xrxd_log)
  275. //st记录表(boniu_st_log)
  276. }
  277. ?>