Oh right sorrySpiKe^^ wrote:There is a pile of info in the "Snapshot", way too much to present in a channel post.
Maybe pick a few key entries to present?
Better yet, type out an example of what a channel post would look like:)
The headers are there but none of the data.<td>Last (Price)</td>
<td class="text-right">
<span data-quoteapi="price"></span>
</td>
</tr>
<tr>
<td>Change</td>
<td class="text-right" data-quoteapi="changeSignCSS">
<span data-quoteapi="change showNegativeSign=false">0.00</span>
(<span data-quoteapi="pctChange showNegativeSign=true">0.00</span>)
</td>
</tr>
Hello Spike,SpiKe^^ wrote:Looking over the html source file much closer, shows they hide their quote data very well.The headers are there but none of the data.<td>Last (Price)</td>
<td class="text-right">
<span data-quoteapi="price"></span>
</td>
</tr>
<tr>
<td>Change</td>
<td class="text-right" data-quoteapi="changeSignCSS">
<span data-quoteapi="change showNegativeSign=false">0.00</span>
(<span data-quoteapi="pctChange showNegativeSign=true">0.00</span>)
</td>
</tr>
I do not know how to get any quote data from this site.
Maybe you know a usable source site for this stock quote data, or a way to force any data from this site?
Market Cap:SpiKe^^ wrote:Looks to me like the source code from here is user friendly:)
https://au.finance.yahoo.com/quote/CBA.AX?p=CBA.AX
With that being all the data available, what fields would you include in the channel post?
Code: Select all
## ausStocks.tcl version 0.1 24Jan2023 ##
# public command syntax: !asx <symbol>
# example: !asx csl
package require http
package require tls
http::register https 443 {tls::socket -autoservername true}
bind pub - !asx asx:bindpub
proc asx:bindpub {nk uh hn ch tx} {
set symbol [string toupper [lindex [split [string trim $tx]] 0]]
if {[string length $symbol] < 3 || [string length $symbol] > 6} { return 0 }
set address "https://au.finance.yahoo.com/quote/${symbol}.AX?p=${symbol}.AX"
set token [::http::geturl $address -timeout 7500]
set html [::http::data $token] ; ::http::cleanup $token
set html [join [lrange [split $html "\n"] 4 6] {}]
set ils {company xinfo lastprice change percent notice prevclose open bid ask}
foreach vname [lappend ils dayrange 52weeks volume avgvolume marketcap] {
set $vname "N/A"
}
set qmap [list %k $nk %h $ch]
regexp {<h1 class=\"D\(ib\) Fz\(18px\)\">(.*?)</h1>(.*)$} $html - company html
regexp {^</div>[^>]+><span>(.*?)</span>(.*)$} $html - xinfo html
regexp {regularMarketPrice[^>]+>(.*?)</fin-str(.*)$} $html - lastprice html
regexp {regularMarketChange[^>]+><[^>]+>(.*?)</span(.*)$} $html - change html
regexp {MarketChangePercent[^>]+><[^>]+>(.*?)</span(.*)$} $html - percent html
regexp {quote-market-notice[^>]+><span>(.*?)</span>(.*)$} $html - notice html
if {[matchstr "-*" $change]} {
set change "\00304$change\003" ; set percent "\00304$percent\003"
} elseif {[matchstr "+*" $change]} {
set change "\00303$change\003" ; set percent "\00303$percent\003"
}
lappend qmap %y $company %x $xinfo %l $lastprice %c $change %p $percent
regexp {PREV_CLOSE-value\">(.*?)</td></tr>(.*)$} $html - prevclose html
regexp {\"OPEN-value\">(.*?)</td></tr>(.*)$} $html - open html
regexp {\"BID-value\">(.*?)</td></tr>(.*)$} $html - bid html
regexp {\"ASK-value\">(.*?)</td></tr>(.*)$} $html - ask html
lappend qmap %n $notice %r $prevclose %o $open %b $bid %a $ask
regexp {DAYS_RANGE-value\">(.*?)</td></tr>(.*)$} $html - dayrange html
regexp {FIFTY_TWO_WK_RANGE-value\">(.*?)</td>(.*)$} $html - 52weeks html
regexp {regularMarketVolume[^>]+>(.*?)</fin-streamer(.*)$} $html - volume html
regexp {AVERAGE_VOLUME_3MONTH-value\">(.*?)</td>(.*)$} $html - avgvolume html
regexp {\"MARKET_CAP-value\">(.*?)</td></tr>(.*)$} $html - marketcap html
lappend qmap %d $dayrange %w $52weeks %v $volume %g $avgvolume %m $marketcap
set hmap [list "'" "'" "&" "&" """ "\""]
#### e f i j q s t u z ####
# %y = company name ex. Apollo Minerals Limited (AON.AX)
# %x = asx info ?? ex. ASX - ASX Delayed price. Currency in AUD
# %l = last price ex. 108.66
# %c = price change ex. -0.08
# %p = change percent ex. (-0.07%)
# %n = market notice ex. As of 10:17AM AEDT. Market open.
# %r = previous close ex. 108.74
# %o = open ex. 108.74
# %b = bid ex. 108.66 x 36400
# %a = ask ex. 108.69 x 7100
# %d = day's range ex. 108.38 - 109.15
# %w = 52-week range ex. 86.98 - 109.20
# %v = volume ex. 3,747,153
# %g = avg. volume ex. 2,190,023
# %m = market cap ex. 183.463B
# %k = nick ex. SpiKe^^
# %h = channel ex. #pc-mirc-help
set say [list "\00306<ASX>\003 %y \002%l AUD\002 Change: \002%c %p\002 %n"]
set s "Previous close: \002%r\002 Open: \002%o\002 Bid: \002%b\002 "
append s "Ask: \002%a\002 Day's range: \002%d\002 Market cap: \002%m\002"
lappend say $s
foreach ln $say {
set ln [string map $qmap $ln] ; set ln [string map $hmap $ln]
puthelp "PRIVMSG $ch :$ln"
}
return 0
}
putlog "Loaded ausStocks.tcl version 0.1 24Jan2023"
Code: Select all
## ausStocks.tcl version 0.2 27Jan2023 ##
## Version 0.2 adds some bare minimum sanity checks w/ reporting:
# 1) restricts user input to 3 - 6 alphanumeric characters.
# 2) adds some error checking on the http connection & get.
# 3) put the entire script code in the namespace ausStocks.
# public command syntax: !asx <symbol>
# example: !asx csl
##########################################
namespace eval ausStocks {
package require http
package require tls
::http::register https 443 {::tls::socket -autoservername true}
#::http::register https 443 [list ::tls::socket -servername au.finance.yahoo.com]
bind pub - !asx [namespace current]::asx:bindpub
proc asx:bindpub {nk uh hn ch tx} {
set sym [string toupper [lindex [split [string trim $tx]] 0]]
if {[string length $sym] ni {3 4 5 6} || [regexp {[^0-9A-Z]} $sym]} {
puthelp "PRIVMSG $ch :\00306<ASX>\003 Command syntax: \002!asx <symbol>\002"
return 0
}
set address "https://au.finance.yahoo.com/quote/${sym}.AX?p=${sym}.AX"
::http::config -useragent "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
#::http::register https 443 {::tls::socket -autoservername true}
#::http::register https 443 [list ::tls::socket -servername au.finance.yahoo.com]
# Thanks thommey #
if {[catch {::http::geturl $address -timeout 7500} tok]} { error $tok }
if {[::http::status $tok] ne "ok"} {
error "TCP error: [::http::status $tok][::http::cleanup $tok]"
} elseif {[::http::ncode $tok] != 200} {
error "HTTP error: [::http::code $tok][::http::cleanup $tok]"
}
set html [::http::data $tok] ; ::http::cleanup $tok
set html [join [lrange [split $html "\n"] 4 6] {}]
set company "" ; set xinfo "" ; set lastprice ""
regexp {<h1 class=\"D\(ib\) Fz\(18px\)\">(.*?)</h1>(.*)$} $html - company html
regexp {^</div>[^>]+><span>(.*?)</span>(.*)$} $html - xinfo html
regexp {regularMarketPrice[^>]+>(.*?)</fin-str(.*)$} $html - lastprice html
if {$company eq "" || $xinfo eq "" || $lastprice eq ""} {
puthelp "PRIVMSG $ch :\00306<ASX>\003 Invalid Company Symbol: \002$sym\002"
return 0
}
set qmap [list %k $nk %h $ch %y $company %x $xinfo %l $lastprice]
set ils {change percent notice prevclose open bid ask dayrange}
foreach vname [lappend ils 52weeks volume avgvolume marketcap] {
set $vname "N/A"
}
regexp {regularMarketChange[^>]+><[^>]+>(.*?)</span(.*)$} $html - change html
regexp {MarketChangePercent[^>]+><[^>]+>(.*?)</span(.*)$} $html - percent html
regexp {quote-market-notice[^>]+><span>(.*?)</span>(.*)$} $html - notice html
if {[matchstr "-*" $change]} {
set change "\00304$change\003" ; set percent "\00304$percent\003"
} elseif {[matchstr "+*" $change]} {
set change "\00303$change\003" ; set percent "\00303$percent\003"
}
lappend qmap %c $change %p $percent %n $notice
regexp {PREV_CLOSE-value\">(.*?)</td></tr>(.*)$} $html - prevclose html
regexp {\"OPEN-value\">(.*?)</td></tr>(.*)$} $html - open html
regexp {\"BID-value\">(.*?)</td></tr>(.*)$} $html - bid html
regexp {\"ASK-value\">(.*?)</td></tr>(.*)$} $html - ask html
regexp {DAYS_RANGE-value\">(.*?)</td></tr>(.*)$} $html - dayrange html
lappend qmap %r $prevclose %o $open %b $bid %a $ask %d $dayrange
regexp {FIFTY_TWO_WK_RANGE-value\">(.*?)</td>(.*)$} $html - 52weeks html
regexp {regularMarketVolume[^>]+>(.*?)</fin-streamer(.*)$} $html - volume html
regexp {AVERAGE_VOLUME_3MONTH-value\">(.*?)</td>(.*)$} $html - avgvolume html
regexp {\"MARKET_CAP-value\">(.*?)</td></tr>(.*)$} $html - marketcap html
lappend qmap %w $52weeks %v $volume %g $avgvolume %m $marketcap
set hmap [list "'" "'" "&" "&" """ "\""]
#### e f i j q s t u z ####
# %y = company name ex. Apollo Minerals Limited (AON.AX)
# %x = asx info ?? ex. ASX - ASX Delayed price. Currency in AUD
# %l = last price ex. 108.66
# %c = price change ex. -0.08
# %p = change percent ex. (-0.07%)
# %n = market notice ex. As of 10:17AM AEDT. Market open.
# %r = previous close ex. 108.74
# %o = open ex. 108.74
# %b = bid ex. 108.66 x 36400
# %a = ask ex. 108.69 x 7100
# %d = day's range ex. 108.38 - 109.15
# %w = 52-week range ex. 86.98 - 109.20
# %v = volume ex. 3,747,153
# %g = avg. volume ex. 2,190,023
# %m = market cap ex. 183.463B
# %k = nick ex. GreedyHamster
# %h = channel ex. #MarketHub
set say [list "\00306<ASX>\003 %y \002%l AUD\002 Change: \002%c %p\002 %n"]
set s "Previous close: \002%r\002 Open: \002%o\002 Bid: \002%b\002 "
append s "Ask: \002%a\002 Day's range: \002%d\002 Market cap: \002%m\002"
lappend say $s
foreach ln $say {
set ln [string map $qmap $ln] ; set ln [string map $hmap $ln]
putserv "PRIVMSG $ch :$ln"
}
return 0
}
putlog "Loaded ausStocks.tcl version 0.2 27Jan2023"
} ;## end of: namespace eval ausStocks ##
Code: Select all
########## ausStocks.tcl ver. 0.3 by SpiKe^^ ########## 10Feb2023 ##########
## Version 0.3 tries to make this script a little more user friendly:
# 1) script will now follow the redirect to the "Similar Symbol Lookup" page.
# 2) use .chanset #channel +asx to enable this script by channel.
# 3) and/or use the new channel setting: set asx(chan) "#chan #anotherchan"
# 4) can now use a company list file to limit invalid query symbols.
# 5) added public error messages for all ::http::geturl issues.
# 6) and lots of other small tweeks.
################## Version History ##################
## Version 0.2 added some bare minimum sanity checks w/ reporting:
# 1) restricts user input to 3 - 6 alphanumeric characters.
# 2) adds some error checking on the http connection & get.
# 3) put the entire script code in the namespace ::ausStocks::
# public command syntax: !asx <symbol>
# example: !asx csl
######################################################
namespace eval ausStocks { variable asx
package require http
package require tls
setudef flag asx ;# <= Use .chanset #chan +asx to enable this script by channel.
################### begin settings ###################
# set active channel(s) for this script (or set empty to only use .chanset #ch +asx)
# or use: set asx(chan) "*" to make the script active in all bot channels.
# note: the channels set here can not be disabled by using .chanset #ch -asx
set asx(chan) ""
# script logo (placed before almost every line sent to the channel)
set asx(logo) "\00306\[ASX\]\003 "
# this filename is read at: source scripts/ausStocks.tcl
# and makes the namespaced variable: $::ausStocks::asx(companydict).
set asx(companylist_filename) "scripts/ausStocks.companylist.txt"
############ end settings ############ end settings ############
################################################################
::http::register https 443 {::tls::socket -autoservername true}
#::http::register https 443 [list ::tls::socket -servername au.finance.yahoo.com]
bind pub - !asx [namespace current]::bindpub
proc bindpub {nk uh hn ch tx} { variable asx
set c [string tolower $ch]
if {![channel get $ch asx] && ("*" ni $asx(chan)) && ($c ni $asx(chan))} {
return 0
}
set tx [string trimright [string toupper [lindex [split [string trim $tx]] 0]] "."]
if {[matchstr "*.*" $tx]} { set tmp [split $tx "."]
if {[llength $tmp] > 2 || [lindex $tmp 1] ne "AX"} {
puthelp "PRIVMSG $ch :$asx(logo)Invalid Company Symbol: \002${tx}\002"
return 0
}
set sym [lindex $tmp 0]
} else { set sym $tx }
if {[string length $sym] ni {2 3 4 5 6} || [regexp {[^0-9A-Z]} $sym]} {
set say "$asx(logo)Command syntax: \002!asx <symbol>\002"
puthelp "PRIVMSG $ch :$say example: \002!asx csl\002"
return 0
}
if {$asx(companydict) ne ""} {
if {![dict exists $asx(companydict) $sym]} {
set say "$asx(logo)Invalid Company Symbol: \002${sym}\002"
puthelp "PRIVMSG $ch :$say (symbol not in the $asx(companylist_filename) file.)"
return 0
}
}
set addr "https://au.finance.yahoo.com"
set address "${addr}/quote/${sym}.AX?p=${sym}.AX"
set uagent "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
set emap [list "\n" " | "]
foreach try {1 2} { ::http::config -useragent $uagent
if {[catch {::http::geturl $address -timeout 7500} tok]} {
set err "1 ::http::geturl error: [string map $emap $tok]"
} elseif {[::http::status $tok] ne "ok"} {
set err "2 TCP error: [::http::status $tok]"
} else { set ncode [::http::ncode $tok]
if {($try == 1 && $ncode ni {200 302}) || ($try == 2 && $ncode != 200)} {
set err "3 HTTP error: [::http::code $tok]"
}
}
if {$try == 1 && [info exists ncode] && $ncode == 302} {
upvar #0 $tok state
if {[dict exists $state(meta) location]} {
set loc [dict get $state(meta) location]
if {[matchstr "/lookup*" $loc]} { set address "${addr}$loc"
::http::cleanup $tok ; unset tok ; unset ncode
continue
}
set err "5 Redirect error: state(meta) 'location' not as expected ( $loc )."
} else {
set err "4 Redirect error: Unable to find 'location' in state(meta)."
}
}
break
}
if {[info exists err]} { putlog "$asx(logo) [string range $err 2 end]"
if {[string index $err 0] > 1} { ::http::cleanup $tok }
puthelp "PRIVMSG $ch :$asx(logo)Unable to get the requested data. Try again later."
return 0
}
set html [::http::data $tok] ; ::http::cleanup $tok
set html [join [lrange [split $html "\n"] 4 6] {}]
# is redirected 302 #
if {$try == 2} { set similarto "" ; set allcount "" ; set simdict {}
regexp {<span>Symbols similar to (.*?)</span></h2>(.*)$} $html - similarto html
regexp {<span>All \((.*?)\)</span></a></li>(.*)$} $html - allcount html
if {$similarto eq "" || $allcount eq ""} {
puthelp "PRIVMSG $ch :$asx(logo)Unable to get the requested data."
return 0
}
set re {<td class=\"data-col0[^>]+>[^>]+>(.*?)</a></td>[^>]+>(.*?)</td>(.*)$}
while {[dict size $simdict] < 5} {
if {![regexp $re $html - ssym sname html]} { break }
dict set simdict $ssym $sname
}
set say "$asx(logo)Symbol Lookup >"
if {[set dsize [dict size $simdict]] == 0} {
puthelp "PRIVMSG $ch :$say Found no symbols similar to: \002${sym}\002"
return 0
}
if {$dsize == 1} { append say " Found one symbol similar to '${sym}':"
puthelp "PRIVMSG $ch :$say \002${ssym}\002 $sname"
return 0
}
if {$dsize <= 3} { append say " Found $dsize symbols similar to '${sym}':"
} else { append say " Found $allcount symbols similar to '${sym}'." }
if {$allcount > 5} { append say " Showing the first 5:"
} elseif {$allcount > 3} { append say " Showing all of them:" }
dict for {sy co} $simdict { append say " \002${sy}\002 $co" }
puthelp "PRIVMSG $ch :$say"
return 0
} ;# end: is redirected 302 #
set company "" ; set xinfo ""
regexp {<h1 class=\"D\(ib\) Fz\(18px\)\">(.*?)</h1>(.*)$} $html - company html
regexp {^</div>[^>]+><span>(.*?)</span>(.*)$} $html - xinfo html
if {$company eq "" || $xinfo eq ""} {
puthelp "PRIVMSG $ch :$asx(logo)Invalid Company Symbol: \002${sym}\002"
return 0
}
set qmap [list %k $nk %h $ch %y $company %x $xinfo]
set ils {lastprice change percent notice prevclose open bid ask dayrange 52weeks}
foreach vname [lappend ils volume avgvolume marketcap] { set $vname "N/A" }
regexp {regularMarketPrice[^>]+>(.*?)</fin-str(.*)$} $html - lastprice html
regexp {regularMarketChange[^>]+><[^>]+>(.*?)</span(.*)$} $html - change html
regexp {MarketChangePercent[^>]+><[^>]+>(.*?)</span(.*)$} $html - percent html
regexp {quote-market-notice[^>]+><span>(.*?)</span>(.*)$} $html - notice html
if {[matchstr "-*" $change]} {
set change "\00304$change\003" ; set percent "\00304$percent\003"
} elseif {[matchstr "+*" $change]} {
set change "\00303$change\003" ; set percent "\00303$percent\003"
}
lappend qmap %l $lastprice %c $change %p $percent %n $notice
regexp {PREV_CLOSE-value\">(.*?)</td></tr>(.*)$} $html - prevclose html
regexp {\"OPEN-value\">(.*?)</td></tr>(.*)$} $html - open html
regexp {\"BID-value\">(.*?)</td></tr>(.*)$} $html - bid html
regexp {\"ASK-value\">(.*?)</td></tr>(.*)$} $html - ask html
regexp {DAYS_RANGE-value\">(.*?)</td></tr>(.*)$} $html - dayrange html
lappend qmap %r $prevclose %o $open %b $bid %a $ask %d $dayrange
regexp {FIFTY_TWO_WK_RANGE-value\">(.*?)</td>(.*)$} $html - 52weeks html
regexp {regularMarketVolume[^>]+>(.*?)</fin-streamer(.*)$} $html - volume html
regexp {AVERAGE_VOLUME_3MONTH-value\">(.*?)</td>(.*)$} $html - avgvolume html
regexp {\"MARKET_CAP-value\">(.*?)</td></tr>(.*)$} $html - marketcap html
lappend qmap %w $52weeks %v $volume %g $avgvolume %m $marketcap
set hmap [list "'" "'" "&" "&" """ "\""]
#### e f i j q s t u z ####
# %y = company name ex. Apollo Minerals Limited (AON.AX)
# %x = asx info ?? ex. ASX - ASX Delayed price. Currency in AUD
# %l = last price ex. 108.66
# %c = price change ex. -0.08
# %p = change percent ex. (-0.07%)
# %n = market notice ex. As of 10:17AM AEDT. Market open.
# %r = previous close ex. 108.74
# %o = open ex. 108.74
# %b = bid ex. 108.66 x 36400
# %a = ask ex. 108.69 x 7100
# %d = day's range ex. 108.38 - 109.15
# %w = 52-week range ex. 86.98 - 109.20
# %v = volume ex. 3,747,153
# %g = avg. volume ex. 2,190,023
# %m = market cap ex. 183.463B
# %k = nick ex. GreedyHamster
# %h = channel ex. #MarketHub
set say [list "$asx(logo)%y \002%l AUD\002 Change: \002%c %p\002 %n"]
set s "Previous close: \002%r\002 Open: \002%o\002 Bid: \002%b\002 "
append s "Ask: \002%a\002 Day's range: \002%d\002 Market cap: \002%m\002"
lappend say $s
foreach ln $say {
set ln [string map $qmap $ln] ; set ln [string map $hmap $ln]
putserv "PRIVMSG $ch :$ln"
}
return 0
}
proc onsource {} { variable asx
set asx(chan) [split [string tolower [string trim $asx(chan)]]]
set asx(companylist_filename) [string trim $asx(companylist_filename)]
set asx(companydict) [dict create]
if {[file exists $asx(companylist_filename)]} {
set open [open $asx(companylist_filename) r]
set asx(companydict) [read -nonewline $open] ; close $open
}
}
onsource
putlog "Loaded ausStocks.tcl version 0.3 10Feb2023"
} ;## end of: namespace eval ausStocks ##