This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

GoogleNews

Help for those learning Tcl or writing their own scripts.
User avatar
aslpls
Halfop
Posts: 42
Joined: Mon May 02, 2016 9:41 am

Post by aslpls »

anyone help got error

Code: Select all

Tcl error [Google:News]: error "no element found" at line 1 character 0
G
Goga
Halfop
Posts: 83
Joined: Sat Sep 19, 2020 2:12 am

Post by Goga »

Update your tcl version to 8.6+ to get past this error.
w
wixchat
Voice
Posts: 6
Joined: Sat May 06, 2023 3:21 am

error

Post by wixchat »

help, i got error

Code: Select all

wrong # args: should be "tls::socket ?options? host port"
Tcl error [Google:News]: error "syntax error" at line 1 character 0
"0 <--Error-- "
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Re: error

Post by simo »

wixchat wrote:help, i got error

Code: Select all

wrong # args: should be "tls::socket ?options? host port"
Tcl error [Google:News]: error "syntax error" at line 1 character 0
"0 <--Error-- "
pastebin the code you are using
w
wixchat
Voice
Posts: 6
Joined: Sat May 06, 2023 3:21 am

Post by wixchat »

Code: Select all

# Google news v0.3 by nrt (01Dec2015)
# Updated GoogleNews Country links and added some more lines for redirected link support (04Jan2018) karakedi

package require tdom
package require http
package require htmlparse
package require textutil::split
package require tls 1.6.4
package present Tcl 8.6

set ::oldnews [list ]

set googlelink {https://news.google.com/news/rss/headlines/section/topic/NATION}

# Length of chars in a line.
set newsmax 412

# Links shortened to tinyurl. 1 = true , 0 = false
set tinyurl 1

# 1 = US_en (U.S.A), 2 = TR (Turkey) , 3 = FR (France), 4 = DE (Germany), 5 = UK_en (U.K) , 6 = RU (Russia)
# 7 = IT (Italy) , 8 = NL (Netherlands) , 9 = AU_en (Australia) , 10 = PT (Portugal) , 11 = AR (Arabian World) , 12 = AT_de (Austria)
# 13 = BE_fr (Belgium) , 14 = BR_pt (Brazil) , 15 = BG (Bulgaria) , 16 = CA_en (Canada) , 17 = NZ_en (New Zealand) , 18 = PL (Poland)
# 19 = RO (Romania) , 20 = CS (Czech Republic) , 21 = NO (Norway) , 22 = CH_fr (Switzerland) , 23 = SV (Sweden) , 24 = SR (Serbia)
# 25 = CN_zh (China) , 26 = JA (Japan) , 27 = GR (Greece) , 28 = LT (Lithuania) , 29 = IN_en (India) , 30 = HU (Hungary)
# 31 = AR (Argentina) , 32 = ID (Indonesia) , 33 = MY (Malaysia) , 34 = BN (Bangladesh) , 35 = MX (Mexico) , 36 = PK_en (Pakistan)
# news in this language/nation
set newslang 33

# This is for set a limit, do not post if that headline older than ** minutes
set headlinedelay 40

# How many latest news posts would like to see when you use .topnews ?
set TopNewsPosts 4

# .news on <- to enable on your #channel / .news off <- for turn this off!
setudef flag googlenews

bind pub mnf|oa ".news" news_control
bind evnt - init-server news_refresh
bind pub mnf|oa ".topnews" Google_TopNews

proc httpsregister {} {
   package require tls
   if {[package vcompare [package present tls] 1.7] > 0} {
      ::http::register https 443 [list ::tls::socket -autoservername 1]
   } else {
      ::http::register https 443 [list ::tls::socket -request 0 -require 1 -ssl2 0 -ssl3 0 -tls1 1]
   }
}

proc httpsunregister {} {
   ::http::unregister https
}

proc Google_TopNews {nick uhost hand chan arg} {
   if {![channel get $chan googlenews]} { return 0 }
   set doc [dom parse [getit [langSel]]]
   set root [$doc documentElement]
   set i 0
   foreach id [$root selectNodes "/rss/channel/item"] {
      set desc [[$id selectNodes "description"] text]
      set Date [[$id selectNodes "pubDate"] text]
      set newsurl [[$id selectNodes "link"] text]
      set newstime [lsort -integer -decreasing -index end [clock scan $Date]]
      set news "[dom_trim $desc] [news_tiny [getRealLink [dom_trim $newsurl]]] ([duration [expr {[clock seconds] - $newstime}]] ago.)"
      if {$i == $::TopNewsPosts} break
      news_print $chan "[htmlparse::mapEscapes $news]"
      incr i
   }
   $doc delete
}

proc langSel {} {
   switch -exact -- $::newslang {
      1 { set url {us&hl=en&gl=US} }
      2 { set url {tr_tr&hl=tr&gl=TR} }
      3 { set url {fr&hl=fr&gl=FR} }
      4 { set url {de&hl=de&gl=DE} }
      5 { set url {uk&hl=en-GB&gl=GB} }
      6 { set url {ru_ru&hl=ru&gl=RU} }
      7 { set url {it&hl=it&gl=IT} }
      8 { set url {nl_nl&hl=nl&gl=NL} }
      9 { set url {au&hl=en-AU&gl=AU} }
      10 { set url {pt-PT_pt&hl=pt-PT&gl=PT} }
      11 { set url {ar_me&hl=ar&gl=ME} }
      12 { set url {de_at&hl=de-AT&gl=AT} }
      13 { set url {fr_be&hl=fr&gl=BE} }
      14 { set url {pt-BR_br&hl=pt-BR&gl=BR} }
      15 { set url {bg_bg&hl=bg&gl=BG} }
      16 { set url {ca&hl=en-CA&gl=CA} }
      17 { set url {nz&hl=en-NZ&gl=NZ} }
      18 { set url {pl_pl&hl=pl&gl=PL} }
      19 { set url {ro_ro&hl=ro&gl=RO} }
      20 { set url {cs_cz&hl=cs&gl=CZ} }
      21 { set url {no_no&hl=no&gl=NO} }
      22 { set url {fr_ch&hl=fr-CH&gl=CH} }
      23 { set url {sv_se&hl=sv&gl=SE} }
      24 { set url {sr_rs&hl=sr&gl=RS} }
      25 { set url {cn&hl=zh-CN&gl=CN} }
      26 { set url {jp&hl=ja&gl=JP} }
      27 { set url {el_gr&hl=el&gl=GR} }
      28 { set url {lt_lt&hl=lt&gl=LT} }
      29 { set url {in&hl=en-IN&gl=IN} }
      30 { set url {hu_hu&hl=hu&gl=HU} }
      31 { set url {es_ar&hl=es-419&gl=AR} }
      32 { set url {id_id&hl=id&gl=ID} }
      33 { set url {en_my&hl=en-MY&gl=MY} }
      34 { set url {bn_bd&hl=bn&gl=BD} }
      35 { set url {es_mx&hl=es-419&gl=MX} }
      36 { set url {en_pk&hl=en&gl=PK} }
      default { set url {us&hl=en&gl=US} }
   }
   return ${::googlelink}?ned=$url
}

proc news_refresh type {
   foreach chan [channels] newsbind [binds time] {
      if {([lsearch -exact [channel info $chan] "+googlenews"] != "-1") && ![string match "*Google:News*" $newsbind]} {
         bind time - "*" Google:News
         return 1
      }
   }
}

proc news_control {nick uhost hand chan text} {
   switch -nocase -- [lindex [split $text] 0] {
      "on" { if {[channel get $chan googlenews]} {
            puthelp "privmsg $chan :News already running @ $chan"
         } {
            bind time - "*" Google:News
            channel set $chan +googlenews
            puthelp "privmsg $chan :News now enabled @ $chan"
         }
      }
      "off" { if {![channel get $chan googlenews]} {
            puthelp "privmsg $chan :News already disabled @ $chan"
         } {
            unbind time - "*" Google:News
            channel set $chan -googlenews
            puthelp "privmsg $chan :News now stopped @ $chan"
         }
      }
      default { puthelp "privmsg $chan :Usage: $::lastbind <on/off>" }
   }
   return 0
}

proc getit url {
   ::httpsregister
   if {[catch {set token [http::geturl $url -binary 1 -timeout 15000]} error]} {
      putcmdlog "[string map [list \n " "] $error]"
     ::httpsunregister
      return 0
   } elseif {[string match *[http::ncode $token]* "307|303|302|301"]} {
      upvar #0 $token state
      if {[dict exists $state(meta) Location]} {
         set newurl [dict get $state(meta) Location]
         ::http::cleanup $token
         if {[catch {set newtok [http::geturl $newurl -binary 1 -timeout 15000]} err]} {
            putcmdlog "[string map [list \n " "] $err]"
         ::httpsunregister
            return 0
         } elseif {[http::status $newtok] eq "ok" && [http::ncode $newtok] == "200"} {
            set data [http::data $newtok]
            ::http::cleanup $newtok
         } else {
            putcmdlog "[http::status $newtok] - [http::code $newtok]"
            ::http::cleanup $newtok
         }
      }
      ::http::cleanup $token
   } elseif {[http::status $token] eq "ok" && [http::ncode $token] == "200"} {
      set data [http::data $token]
      ::http::cleanup $token
   } else {
      putcmdlog "[http::status $token] - [http::code $token]"
      ::http::cleanup $token
   }
   ::httpsunregister
   if {[info exists data]} {
      return [encoding convertfrom utf-8 $data]
   }
}

proc newsdom {} {
   set document [dom parse [getit [langSel]]]
   set root [$document documentElement]
   foreach id [$root selectNodes "/rss/channel/item"] {
      set description [[$id selectNodes "description"] text]
      set pubDate [[$id selectNodes "pubDate"] text]
      set newsurl [[$id selectNodes "link"] text]
      lappend news "[dom_trim $description] | [dom_trim $newsurl] | [clock scan [dom_trim $pubDate]]"
   }
   $document delete
   set listnews [lindex [lsort -integer -decreasing -index end $news] 0]
   return [join [htmlparse::mapEscapes $listnews]]
}

proc news_print {where what} {
   regexp {^(.*?)(http(?:s|)://[^\s]+)(.*?)$} $what - res links _
   set output [textutil::split::splitn $what $::newsmax]
   if {[string match *${links}* $output]} {
      lmap newsout $output { puthelp "privmsg $where :$newsout" }
   } else {
      lmap newsout [textutil::split::splitn $what [string length $res]] { puthelp "privmsg $where :$newsout" }
   }
}

proc dom_trim str {
   regsub -all -nocase {(?:<strong>|</strong>|<b>|</b>)} $str \002 str
   regsub -all -- {<font color="#6f6f6f">(.*?)</font>} $str "(\00304\\1\003)" str
   set str [string map [list &lt\; \u003c &gt\; \u003e &nbsp\; \u0020 \" \u0027] $str]
   regsub -all -- "<.+?>" $str { } str
   regsub -all -- {\s+} $str \u0020 str
   set str [string map {"View Full coverage on Google News" ""} $str]
   return [string trim $str]
}

proc news_tiny link {
   set tinyurl [getit http://tinyurl.com/api-create.php?[http::formatQuery url $link]]
   if {[info exists tinyurl] && [string length $tinyurl]} {
      return $tinyurl
   } else {
      return $link
   }
}

proc getRealLink RealURL {
   ::httpsregister
   set TokLink [http::geturl [string trim $RealURL]]
   upvar #0 $TokLink state
   set RealLink [dict get $state(meta) Location]
   ::http::cleanup $TokLink
   ::httpsunregister
   if {[info exists RealLink] && [string length $RealLink]} {
      return $RealLink
   } {
      return $RealURL
   }
}

proc Google:News args {
   foreach chan [channels] {
      if {[channel get $chan googlenews]} {
         set news [newsdom]
         set newsdesc [lindex [split $news |] 0]
         set newslink [getRealLink [lindex [split $news |] end-1]]
         set newstime [string trim [lindex [split $news |] end]]
         #scan $newsdesc {%[^(]} headline
         if {(![string match *$newslink* $::oldnews] && [expr {([clock seconds] - $newstime) < ($::headlinedelay * 60)}]) || ![llength $::oldnews]} {
            if {$::tinyurl < "1" || ![string length $::tinyurl]} {
               news_print $chan "$newsdesc : $newslink ([duration [expr {[clock seconds] - $newstime}]] ago.)"
            } else {
               news_print $chan "$newsdesc : [news_tiny [string trim $newslink]] ([duration [expr {[clock seconds] - $newstime}]] ago.)"
            }
            set ::oldnews "$newsdesc $newslink"
         }
      }
   }
   return 0
}

putlog "ok..."
i got error

Code: Select all

wrong # args: should be "tls::socket ?options? host port"
Tcl error [Google:News]: error "syntax error" at line 1 character 0
"0 <--Error-- "
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

Did u make sure you have all the packages install that it needs?
w
wixchat
Voice
Posts: 6
Joined: Sat May 06, 2023 3:21 am

Post by wixchat »

simo wrote:Did u make sure you have all the packages install that it needs?
im not sure with this 2 package
package require htmlparse
package require textutil::split
how to check it?
and how to install it.
thanks.
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

myselve i would focus on:

package require tdom

on debian its :

tcl-tls tcllib

nott sure what OS you use
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

i loaded the code and got this error :
Tcl error [Google_TopNews]: error "no element found" at line 1 character 0
it used to work for me before as i used the same tcl before
User avatar
CrazyCat
Revered One
Posts: 1217
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Post by CrazyCat »

The trouble seems to be with the tls package.
In party-line, do:

Code: Select all

.tcl package require tls
If the package is installed and correctly loaded, it will give you its version:

Code: Select all

.tcl package require tls
Tcl: 1.7.22
And when the error occurs, type .set errorInfo to have a better trace about it.
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

hm i thought

package require tls 1.6.4
means tls package version 1.6.4 and up is accepted ?

as i have a version above 1.6.4 as well
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

after doing .error i got this respons:



error "no element found" at line 1 character 0
while executing
"dom parse [getit [langSel]]"
(procedure "Google_TopNews" line 3)
invoked from within
"Google_TopNews $_pub1 $_pub2 $_pub3 $_pub4 $_pub5"
User avatar
CrazyCat
Revered One
Posts: 1217
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Post by CrazyCat »

Your error is not related with initial trouble (the one from wixchat).
Open another thread and stay focus on wixchat trouble.
Online
s
simo
Revered One
Posts: 1072
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

The issue is related to the Google news tcl wich is the topic here and isnt opened by wixchat
User avatar
CrazyCat
Revered One
Posts: 1217
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Post by CrazyCat »

simo wrote:The issue is related to the Google news tcl wich is the topic here and isnt opened by wixchat
It's true, sorry. But I mean first we solve the tls trouble then we solve the tdom trouble.

Trying to solve 2 problems in the same time alway creates a 3rd problem.
Post Reply