donc oui j'ai fais une DB différentes pour chaque lien dans le répertoire que j'ai créé à savoir scripts ==>> feeds et les deux fichier sont dedans "sauvegarde1 et sauvegarde2 et les fichiers sont écris dedans j'ai vérifié donc l'eggdrop arrive bien à écrire dedans.
Ensuite non il n'y a pas d'autres entrée dans le flux j'ai mis que les deux ci dessus. Il n'y a que si je supprime les databases qu'il envoie les liens sur l'IRC... EN fait il ne les répètes pas malgré l'intervalle de 30 minutes !
rss-synd ne répète pas les liens qu'il a déjà annoncé, le délai que tu indiques dans le réglage est le délai d'attente entre deux vérifications sur le flux.
Si aucune nouvelle entrée n'est présente dans le flux rss pendant 15 jours, ton eggdrop sera muet 15 jours. Si 3 nouvelles entrées arrivent en 5 minutes (et que tu as réglé le délai sur 10 minutes), tu auras tout d'un coup 3 nouvelles annonces en même temps.
coucou je reviens vers vous après avoir attendu une nouvelle entrée sur le flux. En effet comme tu m'as dit Crazy, "Si aucune nouvelle entrée n'est présente dans le flux rss pendant 15 jours, ton eggdrop sera muet 15 jours. "
Et bien en effet ce matin en ayant laissé 2 jours mon egg tranquille, il a "cracher" un lien. bon va falloir que je travail pour qu'il m'en balance souvent !
Donc c'est tout bon en fin de compte tout fonctionne nickel
Et oui les couleurs passent pas de souci à ce niveau
# Doesn't work with "charset" "utf-8" because TCL converts characters
# with umlauts in to multibyte characters (eg: ü = ü). Works fine
# without.
#set rss(test5) {
# "url" "http://www.heise.de/newsticker/heise-atom.xml"
# "channels" "#test"
# "database" "./scripts/feeds/test5.db"
# "trigger" "!@@feedid@@"
#}
# The default settings, If any setting isn't set for an individual feed
# it'll use the defaults listed here.
#
# WARNING: You can change the options here, but DO NOT REMOVE THEM, doing
# so will create errors.
set default {
"announce-output" 3
"trigger-output" 3
"remove-empty" 1
"trigger-type" 0:2
"announce-type" 0
"max-depth" 5
"evaluate-tcl" 0
"update-interval" 30
"output-order" 0
"timeout" 60000
"channels" "#channel1"
"trigger" "!rss @@feedid@@"
"output" "\[\002@@channel!title@@@@title@@\002\] @@item!title@@@@entry!title@@ - @@item!link@@@@entry!link!=href@@"
"user-agent" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
}
}
#
# End of Settings
#
################################################################################
et le script en lui même :
Code :
# -*- tab-width: 4; indent-tabs-mode: t; -*-
# rss-synd.tcl -- 0.5.1
#
# Highly configurable asynchronous RSS & Atom feed reader for Eggdrops
# written in TCL. Supports multiple feeds, gzip compressed feeds,
# automatically messaging channels with updates at set intervals,
# custom private/channel triggers and more.
#
# Copyright (c) 2011 Andrew Scott, HM2K
#
# Name: RSS & Atom Syndication Script for Eggdrop
# Author: Andrew Scott <andrew.scott@wizzer-it.com>
# Author: HM2K <irc@hm2k.org>
# License: See LICENSE file
# Link: http://code.google.com/p/rss-synd/
# Tags: rss, atom, syndication
# Updated: 05-Jan-2011
#
###Usage
# See README file
#
###Revisions
# See HISTORY file
#
# Include Settings
#
if {[catch {source scripts/rss-synd-settings.tcl} err]} {
putlog "Error: Could not load 'rss-synd-settings.tcl file.'";
}
set tmp(updated) 0
if {([file exists $tmp(database)]) && ([set mtime [file mtime $tmp(database)]] < [unixtime])} {
set tmp(updated) [file mtime $tmp(database)]
}
set rss($feed) [array get tmp]
} else {
putlog "\002RSS Error\002: Unable to load feed \"$feed\", missing one or more required settings. \"[join $required ", "]\""
unset rss($feed)
}
if {$chan != ""} {
set feed(type) [lindex $feed(trigger-type) 0]
set feed(channels) $chan
} else {
set feed(type) [lindex $feed(trigger-type) 1]
set feed(channels) ""
}
if {[catch {set data [[namespace current]::feed_read]} error] == 0} {
if {![[namespace current]::feed_info $data]} {
putlog "\002RSS Error\002: Invalid feed database file format ($feed(database))!"
return
}
if {$feed(trigger-output) > 0} {
set feed(announce-output) $feed(trigger-output)
if {$chan != ""} {
set list_type [lindex $feed(trigger-type) 0]
set list_targets $chan
} else {
set list_type [lindex $feed(trigger-type) 1]
set list_targets ""
}
for {set i 0} {$i < $length} {incr i} {
set type [[namespace current]::xml_get_info $data [list $i "*"] "name"]
# tag-name: the name of the element that contains each article and its data
# tag-list: the position in the xml structure where all 'tag-name' reside
switch [string tolower $type] {
rss {
# RSS v0.9x & x2.0
set feed(tag-list) [list 0 "channel"]
set feed(tag-name) "item"
break
}
rdf:rdf {
# RSS v1.0
set feed(tag-list) [list]
set feed(tag-name) "item"
break
}
feed {
# ATOM
set feed(tag-list) [list]
set feed(tag-name) "entry"
break
}
}
}
if {[info exists tag_data]} {
set tag(data) [${ns_current}::xml_escape $tag_data]
}
} else {
# we should only ever encounter opening tags, if we hit a closing one somethings wrong
if {[string match {[/]*} $tag_string]} {
putlog "\002RSS Malformed Feed\002: Tag not open: \"<$tag_string>\" ($tag_start_first => $tag_start_last)"
continue
}
# split up the tag name and attributes
regexp -- {(.[^ \/\n\r]*)(?: |\n|\r\n|\r|)(.*?)$} $tag_string -> tag_name tag_args
set tag(name) [${ns_current}::xml_escape $tag_name]
# split up all of the tags attributes
set tag(attrib) [list]
if {[string length $tag_args] > 0} {
set values [regexp -inline -all -- {(?:\s*|)(.[^=]*)=["'](.[^"']*)["']} $tag_args]
# find the end tag of non-self-closing tags
if {(![regexp {(\?|!|/)(\s*)$} $tag_args]) || \
(![string match "\?*" $tag_string])} {
set tmp_num 1
set tag_success 0
set tag_end_last $ptr
# find the correct closing tag if there are nested elements
# with the same name
while {$tmp_num > 0} {
# search for a possible closing tag
set tag_success [regexp -indices -start $tag_end_last -- "</$tag_name>" $xml_data tag_end]
set last_tag_end_last $tag_end_last
set tag_end_first [lindex $tag_end 0]
set tag_end_last [lindex $tag_end 1]
# check to see if there are any NEW opening tags within the
# previous closing tag and the new closing one
incr tmp_num [regexp -all -- "<$tag_name\(\[\\s\\t\\n\\r\]+\(\[^/>\]*\)?\)?>" [string range $xml_data $last_tag_end_last $tag_end_last]]
incr tmp_num -1
}
if {$tag_success == 0} {
putlog "\002RSS Malformed Feed\002: Tag not closed: \"<$tag_name>\""
return
}
# set the pointer to after the last closing tag
set ptr [expr { $tag_end_last + 1 }]
# remember tag_start*'s character index doesnt include the tag start and end characters
set xml_sub_data [string range $xml_data [expr { $tag_start_last + 2 }] [expr { $tag_end_first - 1 }]]
# recurse the data within the currently open tag
set result [${ns_current}::xml_list_create $xml_sub_data]
# set the list data returned from the recursion we just performed
if {[llength $result] > 0} {
set tag(children) $result
# set the current data we have because we're already at the end of a branch
# (ie: the recursion didnt return any data)
} else {
set tag(data) [${ns_current}::xml_escape $xml_sub_data]
}
}
}
# insert any plain data that appears before the current element
if {$last_ptr != [expr { $tag_start_first - 1 }]} {
lappend xml_list [list "data" [${ns_current}::xml_escape [string range $xml_data $last_ptr [expr { $tag_start_first - 2 }]]]]
}
# inset tag data
lappend xml_list [array get tag]
unset tag
}
# if there is still plain data left add it
if {$ptr < [string length $xml_data]} {
lappend xml_list [list "data" [${ns_current}::xml_escape [string range $xml_data $ptr end]]]
}
# this function is to replace:
# regexp -indices -start $ptr {<(!\[CDATA\[.+?\]\]|!--.+?--|!DOCTYPE.+?|.+?)>} $xml_data -> tag_start
# which doesnt work correctly with tcl's re_syntax
proc ::rss-synd::xml_get_position {xml_data ptr} {
set tag_start [list -1 -1]
# returns information on a data structure when given a path.
# paths can be specified using: [struct number] [struct name] <...>
proc ::rss-synd::xml_get_info {xml_list path {element "data"}} {
set i 0
foreach {t_data} $xml_list {
array set t_array $t_data
# if the name doesnt exist set it so we can still reference the data
# using the 'stuct name' *
if {![info exists t_array(name)]} {
set t_array(name) ""
}
if {[string match -nocase [lindex $path 1] $t_array(name)]} {
if {$i == [lindex $path 0]} {
set result ""
if {([llength $path] == 2) && \
([info exists t_array($element)])} {
set result $t_array($element)
} elseif {[info exists t_array(children)]} {
# shift the first path reference of the front of the path and recurse
set result [[namespace current]::xml_get_info $t_array(children) [lreplace $path 0 1] $element]
}
return $result
}
incr i
}
unset t_array
}
if {[lindex $path 0] == -1} {
return $i
}
}
# converts 'args' into a list in the same order
proc ::rss-synd::xml_join_tags {args} {
set list [list]
foreach tag $args {
foreach item $tag {
if {[string length $item] > 0} {
lappend list $item
}
}
}
set path [[namespace current]::xml_join_tags $ofeed(tag-feed) $ofeed(tag-list) -1 $ofeed(tag-name)]
set count [[namespace current]::xml_get_info $odata $path]
for {set i 0} {$i < $count} {incr i} {
# extract the current article from the database
set tmpp [[namespace current]::xml_join_tags $ofeed(tag-feed) $ofeed(tag-list) $i $ofeed(tag-name)]
set tmpd [[namespace current]::xml_get_info $odata $tmpp "children"]
set w 0; # weight value
set m 0; # item tag matches
foreach {cmp_path cmp_element cmp_attrib cmp_weight} $cmp_items {
# try and extract the tag info from the current article
set oresult [[namespace current]::xml_get_info $tmpd $cmp_path $cmp_element]
if {$cmp_element == "attrib"} {
array set tmp $oresult
catch {set oresult $tmp($cmp_attrib)}
unset tmp
}
# if the tag doesnt exist in the article ignore it
if {$oresult == ""} { continue }
incr m
# extract the tag info from the current article
set result [[namespace current]::xml_get_info $data $cmp_path $cmp_element]
if {$cmp_element == "attrib"} {
array set tmp $result
catch {set result $tmp($cmp_attrib)}
unset tmp
}
if {[string equal -nocase $oresult $result]} {
set w [expr { $w + $cmp_weight }]
}
}
# value of 100 or more means its a match
if {($m > 0) && \
([expr { round(double($w) / double($m) * 100) }] >= 100)} {
return 1
}
}
# replace tag-item's index with the current article
if {[string equal -nocase $feed(tag-name) [lindex $cookie 1]]} {
set cookie [[namespace current]::xml_join_tags $feed(tag-list) [lreplace $cookie $index $index $current]]
}
set cookie [[namespace current]::xml_join_tags $feed(tag-feed) $cookie]
if {[set tmp [[namespace current]::cookie_replace $cookie $data]] != ""} {
set tmp [[namespace current]::xml_list_flatten $tmp]
regsub -all -- {([\"\$\[\]\{\}\(\)\\])} $match {\\\1} match
set feed_data "[string map { "&" "\\\x26" } [[namespace current]::html_decode $eval $tmp]]"
if {$eval == 1} {
# We are going to eval this string so we can't insert untrusted
# text. Instead create variables and insert references to those
# variables that will be expanded in the subst call below.
set cookie_val($variable_index) $feed_data
regsub -- $match $output "\$cookie_val($variable_index)" output
} else {
regsub -- $match $output $feed_data output
}
}
}
25/10/2017, 12:19 (Modification du message : 25/10/2017, 12:56 par CrazyCat.)
Il semblerait plutôt que ce soit un souci avec tcl8.6 :
Citation :Tcl 8.6 is using build-in zlib for compression so thats why Trf fails, I installed tcl 8.6b2 and I can use both build-in zlib & trf (i've scripts that needs zlib but for sake of rss-synd i installed trf). You can use guide from here to locally install tcl & compile eggdrop against it.
Tu peux peut-être essayer de modifier la procédure en cause:
tcl
# decompress gzip formatted dataproc ::rss-synd::feed_gzip{cdata}{variable packages
if{(![info exists packages(trf)]) || \
($packages(trf)!= 0)}{error"Trf package not found."}
# remove the 10 byte gzip header and 8 byte footerset cdata [string range $cdata10[expr{[string length $cdata] - 9}]]
# decompress the raw dataif{[catch{zip -mode decompress -nowrap 1$cdata} data]!= 0}{error$data}return$data}
25/10/2017, 13:02 (Modification du message : 25/10/2017, 13:03 par T3nS.)
Merci CrazyCat,
Je suis au travail là mais j'essaye ça dès ce soir.
Je te dirai si ça fonctionne ou pas. Petite question qui n'a rien à voir, vous n'être donc pas obligé d'y répondre mais quand je me connecte en DCC sur mon bot il coupe la connexion très vite si je ne fais aucune commande (donc pour voir certain message d'erreur éventuelle c'est assez gênant.) Est-ce qu'il y a un moyen qu'il ne coupe pas la connexion aussi rapidement ? Ou alors est-ce qu'en me connectant en telnet il arrêtera de la couper sans arrêt ?
Merci d'avance et je reviens ce soir soit te remercier une seconde fois soit te transmettre les nouvelles erreurs éventuelle.
Il semblerait que ça Fonctionne. merci beaucoup CrazyCat.
Je suis connecté en telnet pour le moment et il m'a pas encore déconnecté donc ça c'est une bonne chose.
J'ai deux questions :
- La première quand j'ai restart le bot il m'a affiché des films et des infos du flux RSS est-ce normal ?
- La seconde c'est que mon bot est en UTF-8 et les infos que je récupère je pense qu'elles ne le sont pas car les accents s'affichent mal, est-ce qu'il existe un petit script pour remplacer les accents ou pour tout simplement les afficher ?
La première pour un script RSS il n'affiche pas automatiquement les nouvelles news, est-ce parce que je réécris tout le fichier xml à chaque ajout de news ? L'url est : https://audiovisuel-epiknet.fr/RSS.xml
Ma seconde question est tous les combien de temps est-ce que le script regarde ce qui a changé sur un flux pour afficher les dernières actus ?
Je pense que ton flux est mal formé. Il manque des balises CDATA pour encapsuler tes descriptions.
Et pour ta seconde question, il s'agit du réglage update-intervall qui est bien expliqué dans le fichier README:
Citation :update-interval How often (in minutes) you want the feed to be checked. Try and keep this number sensible, something above 15 minutes.
Some websites will ban you for hammering their feeds.
Default: 30
D'accord pour le flux, en tout cas quand je tape la commande il me remonte bien les informations concernant les news, il le met effectivement à jour au bout d'une trentaine de minutes. Tu penses que c'est l'absence des balises CDATA qui fait en sorte qu'il n'annonce pas de lui même le nouveau contenu ?
Y a t-il un moyen également pour qu'il écrive ce qu'il trouve en UTF-8 parce que actuellement ce n'est pas le cas et de fait nous n'avons pas les accents.
Tu as l'option charset dans les réglages de chaque flux (et aussi de manière globale).
Je te conseille de lire le fichier README, et plutôt deux fois qu'une.