2017-05-03

TclCurl and YQL

我不太確定 YQL 是不是還有在維護,不過這是用來測試 TclCurl Http GET 的程式,送出查詢給 Yahoo Query Language (YQL),然後取得結果。

package require Tcl 8.6
package require TclOO
package require TclCurl

oo::class create CurlYQL {
    variable html_result
    
    constructor {} {
        set html_result ""
    }
    
    destructor {
    }    
    
    method query {query args} {
        variable url
        variable pairs

        set url "https://query.yahooapis.com/v1/public/yql"
        set pairs {}

        lappend pairs "[curl::escape format]=[curl::escape json]"
        lappend pairs "[curl::escape q]=[curl::escape $query]"
        
        foreach {name value} $args {
            lappend pairs "[curl::escape $name]=[curl::escape $value]"
        }
    
        append url ? [join $pairs &]

        set curlHandle [curl::init]
        $curlHandle configure -url $url -bodyvar [namespace current]::html_result
        catch { $curlHandle perform } curlErrorNumber
        if { $curlErrorNumber != 0 } {
            error [curl::easystrerror $curlErrorNumber]
        }

        $curlHandle cleanup
    }
    
    #
    # get the results
    #
    method getResults {} {
        return $html_result
    }
}

所以接下來就是測試。

送出查詢到 Yhaoo Finance (for CSV file) 查詢 SPY, VOO, IVV 的股價,我們拿到結果以後,使用 rl_json 分析結果並且印出來。

package require rl_json

set curlyql [CurlYQL new]
$curlyql query {select * from csv where url='http://download.finance.yahoo.com/d/quotes.csv?s=SPY,VOO,IVV&f=sl1d1t1c1ohgv&e=.csv' and columns='symbol,price,date,time,change,col1,high,low,col2'}
set query_result [$curlyql getResults]

if {[::rl_json::json exists $query_result query]==1} {
    set rows [::rl_json::json get $query_result query results row]

    puts "========================================\n"
    foreach row $rows {        
        puts "symbol: [dict get $row symbol]"
        puts "price: [dict get $row price]"
        puts "date: [dict get $row date]"
        puts "time: [dict get $row time]"
        puts "change: [dict get $row change]"
        puts "col1: [dict get $row col1]"
        puts "high: [dict get $row high]"
        puts "low: [dict get $row low]"
        puts "col2: [dict get $row col2]"
        puts "========================================\n"
    }
}

$curlyql destroy

* 注意:rl_json 新增加的 command json 放在 namespace rl_json 內,不過使用說明上沒有特別明講,所以需要注意一下這件事。

* 更新:
我把資料放到 Github 上了。

沒有留言: