【问题标题】:How to get RealTime stock price using yahoo finance如何使用雅虎财经获取实时股价
【发布时间】:2014-01-17 07:27:47
【问题描述】:

我有几个要求如下。

  1. 无需页面刷新或 ajax 即可获得实时股票价格。 (即 yahoo Finance,他们无需刷新页面和 ajax 调用即可获得最新的股票价格)
  2. 从 BSE、NSC 等股票市场获取股票价格。

现在使用以下代码我可以获得股票价格,但我必须刷新页面或调用 ajax,在这两种情况下都需要 20 到 30 秒,但在许多金融网站中,他们可以每秒更新价格而无需使用 ajax。

<?php
/**
 * Class to fetch stock data from Yahoo! Finance
 *
 */

    class YahooStock {

        /**
         * Array of stock code
         */
        private $stocks = array();

        /**
         * Parameters string to be fetched  
         */
        private $format;

        /**
         * Populate stock array with stock code
         *
         * @param string $stock Stock code of company   
         * @return void
         */
        public function addStock($stock)
        {
            $this->stocks[] = $stock;
        }

        /**
         * Populate parameters/format to be fetched
         *
         * @param string $param Parameters/Format to be fetched
         * @return void
         */
        public function addFormat($format)
        {
            $this->format = $format;
        }

        /**
         * Get Stock Data
         *
         * @return array
         */
        public function getQuotes()
        {       
            $result = array();     
            $format = $this->format;

            foreach ($this->stocks as $stock)
            {           
                /**
                 * fetch data from Yahoo!
                 * s = stock code
                 * f = format
                 * e = filetype
                 */
                $s = file_get_contents("http://finance.yahoo.com/d/quotes.csv?s=$stock&f=$format&e=.csv");

                /**
                 * convert the comma separated data into array
                 */
                $data = explode( ',', $s);

                /**
                 * populate result array with stock code as key
                 */
                $result[$stock] = $data;
            }
            return $result;
        }
    }
    $objYahooStock = new YahooStock;

    /**
        Add format/parameters to be fetched

        s = Symbol
        n = Name
        l1 = Last Trade (Price Only)
        d1 = Last Trade Date
        t1 = Last Trade Time
        c = Change and Percent Change
        v = Volume
     */
    $objYahooStock->addFormat("snl1d1t1cv");

    /**
        Add company stock code to be fetched

        msft = Microsoft
        amzn = Amazon
        yhoo = Yahoo
        goog = Google
        aapl = Apple   
     */
    $objYahooStock->addStock("msft");
    $objYahooStock->addStock("amzn");
    $objYahooStock->addStock("yhoo");
    $objYahooStock->addStock("goog");
    $objYahooStock->addStock("vgz");
    $objYahooStock->addStock("FB");
    /**
     * Printing out the data
     */
    ?>
    <table width="100%">
    <tr>
        <th>Row</th>
        <th>Code</th>
        <th>Name</th>
        <th>Last Trade Price</th>
        <th>Last Trade Time</th>
        <th>Change and Percent Change</th>
        <th>Volume</th>
    </tr>
    <?php
    foreach( $objYahooStock->getQuotes() as $code => $stock)
    {
        ?>
        <tr>
            <td><?php //print_r($stock); ?></td>
            <td><?php echo $stock[0]; ?></td>
            <td><?php echo $stock[1]; ?></td>
            <td><?php echo $stock[2]; ?></td>
            <td><?php echo $stock[3]; ?></td>
            <td><?php echo $stock[4]; ?></td>
            <td><?php echo $stock[5]; ?></td>
            <td><?php echo $stock[6]; ?></td>
        </tr>

        <?php
    }
?>
    </table>

【问题讨论】:

标签: php jquery ajax yahoo-finance


【解决方案1】:
<?php

class U_Yahoo{

    private function file_get_contents_curl($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_URL, $url);

        $data = curl_exec($ch);
        curl_close($ch);

        return $data;
    }

    //return the history quote from the simbol, default begin date is 90 day ago, the default end is today
    public function getHistoryQuote($symbol, $begin = 90, $end = 0){
        if(!$begin && !$end)
            $begin = $end = 0;

        $begin = Date('Y-m-d', strtotime("-{$begin} days"));
        $end = Date('Y-m-d', strtotime("-{$end} days"));
        $url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22$symbol%22%20and%20startDate%20%3D%20%22$begin%22%20and%20endDate%20%3D%20%22$end%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
        $jason_obj = json_decode( $this->file_get_contents_curl($url) );
        return $jason_obj->query->results->quote;
    }

    //return not just the quote but others informations too
    public function getCurrentData($symbol){
        $is_array = is_array($symbol);

        $imp_symbol = ($is_array)? implode('%22%2C%22', $symbol) : $symbol;

        $url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quote%20where%20symbol%20in%20(%22$imp_symbol%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
        $jason_obj = json_decode( $this->file_get_contents_curl($url) );

        $result = $jason_obj->query->results->quote;

        return (is_array($symbol) and (count($symbol) == 1))? [$result] : $result;
    }

    //return all quotes from the param $symbol passed, if symbol is array, it will return other array indexed by the symbols
    public function getCurrentQuote($symbol){
        if(is_array($symbol)){
            $symbol = empty($symbol)? ['GOOG'] : $symbol;
            $data = $this->getCurrentData($symbol);
            $result = [];

            for ($c = 0; $c < count($data); $c++) { 
                $result[$data[$c]->Symbol] = $data[$c]->LastTradePriceOnly;
            }

            return $result;
        }else
            return $this->getCurrentData($symbol)->LastTradePriceOnly;
    }

}

如何使用:

$yahoo = new U_Yahoo();
var_dump( $yahoo->getCurrentQuote('GOOG') );
var_dump( $yahoo->getCurrentQuote(['GOOG', 'YHOO']) );

var_dump( $yahoo->getCurrentData(['GOOG', 'YHOO']) );

var_dump( $yahoo->getHistoryQuote('YHOO', 20, 0) );

【讨论】:

    【解决方案2】:

    嗯,在您的方法中,获取股票价格是由客户端(用户的浏览器)触发的。所以没有办法在页面刷新或 AJAX 之外触发它。

    但是,您的服务器可以获取这些数据,而与用户无关。比如:

    data source <----> your backend server fetching the data ---> your database <---- your frontend web server <---> users
    

    后端和前端服务器可以是同一台服务器,但进程不同。

    【讨论】:

    • 这只是演示,这就是它看起来像这样的原因。我也可以使用来自 ajax 的代码,但我也不想使用 ajax(你可以在我的要求中看到这一点)。
    【解决方案3】:

    检查这个网络,这可能是你想要的(将它用于实时网络应用程序)

    http://express-io.org/

    http://socket.io/

    教程

    http://blog.nodeknockout.com/post/34243127010/knocking-out-socket-io

    【讨论】:

      【解决方案4】:

      就谷歌而言,我很确定该 API 已被弃用并且不再工作。您可能可以使用 Yahoo Finance api,他们有用于 csv 下载和通过 yql 的 api。

      参考:https://code.google.com/p/yahoo-finance-managed/wiki/YahooFinanceAPIs

      就实时性而言,我建议看看 yahoo web services。下面是一个例子: http://finance.yahoo.com/webservice/v1/symbols/ITC.NS,ITC.BO/quote?format=json 如果您不提供格式,它将返回一个 XML。

      如何在不刷新或 Ajax 的情况下使其成为实时?

      您可以创建一个 pubsub 模型并让您的应用程序订阅您的应用程序,您必须创建这个层,因为 yahoo api 是基于拉而不是基于推的。因此,您需要从 yahoo 中提取股票报价并将其推送到您的应用程序中。您可能可以将 JMS 用于 java 或套接字,以适合您的方式。

      【讨论】:

        猜你喜欢
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 2022-01-22
        • 2021-07-10
        • 2021-03-25
        • 2015-06-11
        相关资源
        最近更新 更多