Accueil > > > TELECHARGEMENT DE FICHIER PAR PROTOCOLE HTTP 1.0 VIA SOCKET
TELECHARGEMENT DE FICHIER PAR PROTOCOLE HTTP 1.0 VIA SOCKET
Information sur la source
Description
cet addon vous permet de télécharger un fichier depuis un serveur web sans utiliser de dll utilisation: wbs.webget nom-conection my-callback 80 0 http://www.google.fr/intl/fr_fr/images/logo.gif c:/file.gif explication: wbs.webget nom-conection [port] [ssl:0/1 (pas testé)] [url] [destination sur le disque] pour la position courante du fichier: $sock(wbs.webget.nom-conection).rcvd (/help $sock) pour toute information complémentaire sur le téléchargement en cour: une hash table est créé sous le nom: wbs.webget.nom-conection avant l'ouverture du socket et est supprimée a la fermeture du socket (apres l'event du callback) edit: j'ai ajouté un système de callback, pour cela: /getfile download my-callback 80 0 http://www.google.fr/intl/fr_fr/images/logo.gif c:/file.gif si vous ne voulez pas de callback entrez "x" comme nom: /getfile download x 80 0 http://www.google.fr/intl/fr_fr/images/logo.gif c:/file.gif edit: j'ai écrit un fichier de manuel pour la fonction: http://www.wbsscript.free.fr/files/man/man%20webge -w32t.txt en espérant que celui ci puisse vous être utile
Source
- alias wbs.webget.version return 1.4
-
- dialog wbs.webget {
- title "Wbs.webget"
- size -1 -1 285 228
- option dbu
- box "Info", 1, 3 3 277 77
- text "Url", 2, 10 16 25 8
- edit "", 3, 41 14 234 10, autohs
- text "Destination", 4, 10 27 29 8
- edit "", 5, 41 25 234 10
- text "port", 6, 10 37 25 8
- edit "80", 7, 41 36 50 10
- button "Go", 8, 165 210 37 12
- box "Debug", 9, 3 81 277 124
- list 10, 7 90 270 110, size
- text "", 11, 9 68 267 8
- check "Mode SSL", 12, 93 36 37 10
- text "CallBack:", 13, 9 58 190 8
- text "", 14, 201 58 75 8
- button "Stop", 15, 125 210 37 12
- button "Pause", 16, 85 210 37 12
- check "headers only", 17, 134 36 46 10
- check "Cookie", 18, 187 36 29 10
- edit "", 19, 217 36 58 10, autohs
- text "", 20, 4 212 76 8
- }
-
- on *:dialog:wbs.webget:*:*:{
- if ($devent == init) {
- mdxinit
- wbs.mdx.make.pbar $dname 11:0-0-100
- bdid 19
- if ($sock(wbs.webget.download)) {
- .timerweb.webget.refresh 0 1 wbs.webget.timer.refresh wbs.webget.download $dname 11
- idid 11 1 0 $hget(wbs.webget.download,Content-Length)
- }
- adid 10 Engine version: $wbs.webget.version
- if (!$sslready) {
- bdid 12
- udid 12
- adid 10 Impossible d'utiliser le mode ssl:
- adid 10 Installez openssl-0.9.8i-setup.exe
- }
- }
- elseif ($devent == sclick) {
- var %sockname = wbs.webget.download , %table = wbs.webget.download
- if ($did == 8) {
- if (!$did(3) || !$did(5)) {
- w.err Impossible de satisfaire la requete: arguments manquant.
- return
- }
- rdid 10
- wbs.webget download wbs.webget.callback $did(7) $did(12).state $did(3) $iif(!$did(17).state,$did(5),x)
- .timerweb.webget.refresh 0 1 wbs.webget.timer.refresh wbs.webget.download $dname 11
- writeini $wcfg webget lasturl $did(3)
- }
- elseif ($did == 12) odid 7 1 $iif($did(12).state,443,80)
- elseif ($did == 18) $iif($did(18).state,edid,bdid) 19
- elseif ($did == 15) {
- if ($sock(wbs.webget.download)) {
- wbs.webget.callback wbs.webget.download close $ctime $calc($ctime - $hget(%table,open)) user abord
- sockclose wbs.webget.download
- hfree %table
- adid 10 Connection was closed by user
- }
- else adid 10 Unable to close socket: no such socket
- }
- elseif ($did == 16) {
- if ($version < 6.17) {
- adid 10 Unable to use "pause" : you're version of mirc is $version and need to be at last 6.17 or newer
- return
- }
- if ($sock(wbs.webget.download)) {
- if ($sock(%sockname).pause) adid 10 The socket is already in "pause" mode: trying resume
- else adid 10 Socket was put in "pause" mode: done.
- sockpause $iif($sock(%sockname).pause,-r) %sockname
- }
- else adid 10 Unable to use "pause" : no such socket
- }
- }
- elseif ($devent == dclick) {
- if ($did == 10) wecho $did(10).seltext
- }
- elseif (($devent == edit) && ($did == 3)) odid 5 1 $replace($gettok($did(3),-1,47),$+($chr(37),20),_)
- }
- alias wbs.webget.callback {
- ;ici un exemple concret d'utilisation de la fonction callback
- var %dname = wbs.webget , %table = wbs.webget.download
- if ($dialog(%dname).title) {
- did -a %dname 10 callback: $1-
- did -o %dname 13 1 CallBack: $2-
- if (($3 == content-lenght) && ($4)) {
- if ($dialog(%dname).title) {
- did -i %dname 11 1 0 $4
- did -o %dname 14 1 / $wsize($4)
- did -a %dname 11 0
- }
- }
- elseif ($2 == ierror) {
- if ($3 == 1) || ($3 == 1) .remove $qt($hget(%table,file-temp))
- }
- elseif ($2 == pre-connect) {
- ;ici un exemple de personalisation du user agent
- hadd -m %table user-agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/2.0.0.14
- if ($did(%dname,18).state) hadd -m %table cookie $$did(%dname,19)
- }
- elseif ($2 == close) {
- var %value = $hget(wbs.webget.download,content-length)
- did -a %dname 11 %value
- did -o %dname 14 1 $wsize(%value) / $wsize(%value)
- did -a %dname 10 Connection closed.
- did -a %dname 10 Conection duration: $duration($4) $calc($5 % 1000) ms
- }
- }
- }
- alias wbs.webget.timer.refresh {
- ;utilisation: /timer 0 1 wbs.webget.timer.refresh [sockname] [dialogue]
- if (($sock($1)) && ($dialog($2).title)) {
- var %max = $hget(wbs.webget. $+ $gettok($1,3-,46),Content-Length)
- did -a $2 11 $sock($1).rcvd 0 %max
- did -o $2 14 1 $wsize($sock($1).rcvd) / $wsize(%max)
- did -o $2 20 1 Average speed: $wsize($calc($sock($1).rcvd / $sock($1).to)) $+ /s
- }
- else .timerweb.webget.refresh off
- }
- ;################## FIN DE L'EXEMPLE DU DIALOGUE ET DEBUT DU CODE UTILE ##################
- alias wbs.server.url return $gettok($$1,2,47)
- alias wbs.webget.showstats {
- var %n = $sock(wbs.webget.*,0)
- if (!%n) wecho No socket.
- while (%n > 0) {
- var %sname = $sock(wbs.webget.*,%n) , %rcvd = $sock(%sname).rcvd , %size = $hget(%sname,content-length)
- wecho $qt(%sname) $+($chr(91),type: $sock(%sname).type,$chr(93)) $+($chr(91),port: $sock(%sname).port,$chr(93)) $br(ip: $sock(%sname).ip) $&
- $br($wsize(%rcvd) / $wsize(%size)) $br($round($calc(%rcvd / %size * 100),2) $+ $chr(37)) $br(from: $duration($sock(%sname).to) ) $&
- $br(pause: $iif($sock(%sname).pause,yes,no)) $br(ssl: $iif($sock(%sname).ssl,yes,no))
- dec %n
- }
- }
- ;ici je préfere faire une alias vers mon alias car je préfere employer mon alias car "getfile" peu etre un nom attribué dans d'autres scripts
- alias getfile {
- if ($1) wbs.webget $1-
- else wbs.webget.showstats
- }
- alias -l br return $+($chr(91),$1-,$chr(93))
- alias wbs.webget {
- ;6 arguments requis: nom,alias de callback,port,ssl (0/1),url,destination
- ;exemple: wbs.webget download callback 80 0 http://www.google.fr/intl/fr_fr/images/logo.gif c:/file.gif
- ;il est possible de spécifier un user-agent personalisé en l'entran manuelement dans la table AVANT l'appel de la commande wbs.webget ou getfile
- ;syntaxe: wbs.webget.[nom-de-la-conection] user-agent
- ;exemple: hadd -m %table wbs.webget.download user-agent mIrc $version
- if ($5) {
- var %table = wbs.webget. $+ $1
- ;ici je préfere aussi laisser a l'utilisateur de pouvoir formuler lui même sa requette GET s'il le shouaite
- if (!$hget(%table,get)) hadd -m %table get $5
- if ($6 != x) hadd -m %table file $6-
- hadd -m %table mode 0
- hadd -m %table ctime $ctime
- hadd -m %table name $1
- if (!$hget(%table,redirects-left)) hadd -m %table redirects-left 16
- if (!$hget(%table,file-temp)) hadd -m %table file-temp $1 $+ .temp
- if ($exists($hget(%table,file-temp))) callback %table ierror 1 $qt($hget(%table,file-temp)) already exists
- if ($2 != x) hadd %table callback $2
- if ($sock(wbs.webget. $+ $1)) {
- callback wbs.webget. $+ $1 info hard-sockclose
- sockclose wbs.webget. $+ $1
- }
- callback %table pre-connect
- sockopen $iif($4 == 1,-e) $+(wbs.webget.,$1) $wbs.server.url($5) $3
- }
- else wecho $sname error: wbs.webget: syntax: /wbs.webget [name] [callback alias ("x" if not)] [port] [ssl (0/1)] [url] [destination]
- }
- alias wsockwrite {
- sockwrite $1-
- if ($hget($2,callback)) $v1 $2 sockwrite $1-
- }
- alias -l callback {
- ;utilisation: callback [htable] alias de callback
- ;todo permrete l'utilisation de plusieures fonction de callback succesives séparées par des ","
- if (($hget($1,callback)) && ($isalias($hget($1,callback)))) $hget($1,callback) $1-
- }
- alias -l sname return wbs.webget
- on *:sockopen:wbs.webget.*:{
- var %table = $sockname
- hadd -m %table open $ctime $ticks
- callback %table info open $ctime $ticks
- callback %table info serverip $sock($sockname).ip $sock($sockname).port
- if ($hget(%table,post)) wsockwrite -n $sockname POST $v1 HTTP/ $+ $iif($hget(%table,http-version),$v1,1.0)
- else wsockwrite -n $sockname GET / $+ $gettok($hget(%table,get),3-,47)) HTTP/ $+ $iif($hget(%table,http-version),$v1,1.0)
- if ($hget(%table,Authorization)) wsockwrite -n $sockname Authorization: $v1
- if (!$hget(%table,no-referer)) wsockwrite -n $sockname Referer: $iif($hget(%table,referer),$v1,http://wbsscript.free.fr/)
- if ($hget(%table,accept)) wsockwrite -n $sockname Accept: $v1
- if ($hget(%table,connection)) wsockwrite -n $sockname Connection: $v1
- if ($hget(%table,cache-control)) wsockwrite -n $sockname Cache-Control: $v1
- if ($hget(%table,cookie)) wsockwrite -n $sockname Cookie: $v1
- if (!$hget(%table,no-user-agent)) wsockwrite -n $sockname User-Agent: $iif($hget(%table,user-agent),$v1,CERN-LineMode/2.15 libwww/2.17)
- wsockwrite -n $sockname Host: $iif($hget(%table,host),$v1,$wbs.server.url($hget(%table,get))) $+ $crlf $+ $crlf
-
- }
- ;ici le but de l'interpreteur est de clarifier le code dans la fonction du socket, le socket contien cependent la gestion des erreures
- alias wbs.webget.interpreter {
- var %buffer = $2- , %table = $1 , %errors = 400;404;500;403, %err = 0
- tokenize 32 $2-
- if ($gettok($1,1,47) == HTTP) {
- hadd -m %table http $2-
- callback %table http $2-
- }
- elseif ($1 == Content-Length:) {
- hadd -m %table Content-Length $2
- callback %table info content-lenght $2
- }
- elseif ($1 == Set-Cookie:) {
- hadd -m %table cookie $2-
- callback %table cookie $2-
- }
- elseif ($1 == Location:) {
- var %location = $2
- if (($left(%location,7) != http://) && ($left(%location,8) != https://)) var %location = $+(http://,$sock($sockname).ip,$2)
- var %arguments = $hget(%table,name) $iif($hget(%table,callback),$v1,x) $sock($sockname).port $iif($sock($sockname).ssl,1,0) %location $iif($hget(%table,file),$v1,x)
- sockclose $sockname
- callback %table error $hget(%table,http) $2-
- hdec %table redirects-left
- if ($hget(%table,redirects-left) <= 0) {
- callback %table ierror 2 too many redirections
- hfree %table
- return
- }
- hadd -m %table get %location
- callback %table reconnect %arguments
- wbs.webget %arguments
- }
- }
-
- on *:sockread:wbs.webget.*:{
- var %buffer = $null , %table = $sockname , %errors = 400;404;500;403, %err = 0 , %writefile = $qt($hget(%table,file-temp))
- while ((!$sockerr) && (!%err)) {
- if ($hget(%table,mode) == 0) {
- sockread %buffer
- tokenize 32 %buffer
- wbs.webget.interpreter $sockname %buffer
- callback %table buffer %buffer
- if ($1 == Location:) inc %err
- elseif ($istok(%errors,$2,59)) {
- sockclose $sockname
- var %err = $2
- callback %table error %err $calc($ctime - $hget(%table,start-time))
- hfree %table
- break
- }
- elseif (!%buffer) {
- ;ce passage marque la fin des headers intervient juste avant le debut du transfer binaire
- if (($hget(%table,Content-Length) == 0) || (!$hget(%table,file))) {
- callback %table close $ctime $calc($ctime - $hget(%table,ctime)) $ticks no-data
- sockclose $sockname
- hfree %table
- break
- }
- hadd -m %table mode 1
- hadd -m %table safemode 1
- }
- }
- elseif ($hget(%table,mode) == 1) {
- ;mode binaire (traitement)
- sockread &buffer
- ;la ligne ci dessous est surtout la pour éviter le bug des crlf lié a mirc qui les efface comme un malpropre, a modiffier
- if ($bvar(&buffer,0,5).text != $crlf) {
- if ($hget(%table,safemode)) {
- hdel %table safemode
- callback %table info start $ctime
- hadd -m %table start-time $ctime
- }
- }
- if (!$hget(%table,safemode)) {
- ;ici je préfere remetre une sous boucle pour ne pas avoir a ré-interpreter toutes les autres conditions
- bwrite %writefile -1 &buffer
- while ((!$sockerr) && (!%err)) {
- sockread &buffer
- bwrite %writefile -1 &buffer
- if ($sockbr == 0) break
- }
- }
- }
- if ($sockbr == 0) break
- }
- if ($sockerr) callback %table error sockerr $sockerr
- }
- on *:sockclose:wbs.webget.*:{
- var %table = $sockname , %file = $qt($hget(%table,file))
- if ($exists(%file)) .remove %file
- if ($hget(%table,mode)) .rename $qt($iif($hget(%table,file-temp),$v1,$+($mircdir,$sockname,.temp))) %file
- callback %table file %file
- callback %table close $ctime $calc($ctime - $hget(%table,open)) $ticks finished
- hfree %table
- }
- alias wbs.webget.timer.callback {
- ;utilisation: /.timerwbs.webget.timer.callback 0 1 wbs.webget.timer.callback [sockname] [alias]
- ;effet: appele [alias] et retourne: [sockname] [position actuelle] [durée de la conection]
- if (($sock($1)) && ($isalias($2))) {
- $2 $sock($1).rcvd $hget(wbs.webget. $+ $gettok($1,3-,46),Content-Length)
- if (!$timer(wbs.webget.timer.callback)) .timerwbs.webget.timer.callback 0 1 wbs.webget.timer.callback $1 $2
- }
- else .timerwbs.webget.timer.callback off
- }
-
- ;#aliases de compatibilitées
- alias -l wbs.mdx.make.pbar {
- ;usage: wbs.mdx.make.pbar $dname id:0-0-100
- ;values: defaut-debut-fin
- var %dname = $1 , %target = $gettok($2,1,58) , %values = $replace($gettok($2,2,58),-,$chr(32))
- if ($dialog(%dname).title) {
- wbs.mdx SetControlMDX %dname %target ProgressBar > $wdll(ctl_gen.mdx)
- did -i %dname %target 1 $gettok(%values,2-,32)
- did -a %dname %target $gettok(%values,1,32)
- }
- }
-
- ;alias de compatibilitée pour exportation du code
- alias -l wdll return $qt($+($scriptdir,dlls\,$1))
- alias -l w.err adid 10 $1-
- alias -l idid did -i $dname $1-
- alias -l adid did -a $dname $1-
- alias -l rdid did -r $dname $1-
- alias -l odid did -o $dname $1-
- alias -l bdid did -b $dname $1-
- alias -l udid did -u $dname $1-
- alias -l wecho echo -a $1-
- alias -l wsize {
- if ($1 !isnum 0-) return n/a
- else return $replace($lower($bytes($1-,3).suf $+ $iif($right($bytes($1-,3).suf,1) !== b,b)),b,b)
- }
- ;uniquement pour le gui:
- alias -l wbs.mdx.make.pbar {
- ;usage: wbs.mdx.make.pbar $dname id:0-0-100
- ;values: defaut-debut-fin
- var %dname = $1 , %target = $gettok($2,1,58) , %values = $replace($gettok($2,2,58),-,$chr(32))
- if ($dialog(%dname).title) {
- wbs.mdx SetControlMDX %dname %target ProgressBar > $wdll(ctl_gen.mdx)
- did -i %dname %target 1 $gettok(%values,2-,32)
- did -a %dname %target $gettok(%values,1,32)
- }
- }
-
-
alias wbs.webget.version return 1.4
dialog wbs.webget {
title "Wbs.webget"
size -1 -1 285 228
option dbu
box "Info", 1, 3 3 277 77
text "Url", 2, 10 16 25 8
edit "", 3, 41 14 234 10, autohs
text "Destination", 4, 10 27 29 8
edit "", 5, 41 25 234 10
text "port", 6, 10 37 25 8
edit "80", 7, 41 36 50 10
button "Go", 8, 165 210 37 12
box "Debug", 9, 3 81 277 124
list 10, 7 90 270 110, size
text "", 11, 9 68 267 8
check "Mode SSL", 12, 93 36 37 10
text "CallBack:", 13, 9 58 190 8
text "", 14, 201 58 75 8
button "Stop", 15, 125 210 37 12
button "Pause", 16, 85 210 37 12
check "headers only", 17, 134 36 46 10
check "Cookie", 18, 187 36 29 10
edit "", 19, 217 36 58 10, autohs
text "", 20, 4 212 76 8
}
on *:dialog:wbs.webget:*:*:{
if ($devent == init) {
mdxinit
wbs.mdx.make.pbar $dname 11:0-0-100
bdid 19
if ($sock(wbs.webget.download)) {
.timerweb.webget.refresh 0 1 wbs.webget.timer.refresh wbs.webget.download $dname 11
idid 11 1 0 $hget(wbs.webget.download,Content-Length)
}
adid 10 Engine version: $wbs.webget.version
if (!$sslready) {
bdid 12
udid 12
adid 10 Impossible d'utiliser le mode ssl:
adid 10 Installez openssl-0.9.8i-setup.exe
}
}
elseif ($devent == sclick) {
var %sockname = wbs.webget.download , %table = wbs.webget.download
if ($did == 8) {
if (!$did(3) || !$did(5)) {
w.err Impossible de satisfaire la requete: arguments manquant.
return
}
rdid 10
wbs.webget download wbs.webget.callback $did(7) $did(12).state $did(3) $iif(!$did(17).state,$did(5),x)
.timerweb.webget.refresh 0 1 wbs.webget.timer.refresh wbs.webget.download $dname 11
writeini $wcfg webget lasturl $did(3)
}
elseif ($did == 12) odid 7 1 $iif($did(12).state,443,80)
elseif ($did == 18) $iif($did(18).state,edid,bdid) 19
elseif ($did == 15) {
if ($sock(wbs.webget.download)) {
wbs.webget.callback wbs.webget.download close $ctime $calc($ctime - $hget(%table,open)) user abord
sockclose wbs.webget.download
hfree %table
adid 10 Connection was closed by user
}
else adid 10 Unable to close socket: no such socket
}
elseif ($did == 16) {
if ($version < 6.17) {
adid 10 Unable to use "pause" : you're version of mirc is $version and need to be at last 6.17 or newer
return
}
if ($sock(wbs.webget.download)) {
if ($sock(%sockname).pause) adid 10 The socket is already in "pause" mode: trying resume
else adid 10 Socket was put in "pause" mode: done.
sockpause $iif($sock(%sockname).pause,-r) %sockname
}
else adid 10 Unable to use "pause" : no such socket
}
}
elseif ($devent == dclick) {
if ($did == 10) wecho $did(10).seltext
}
elseif (($devent == edit) && ($did == 3)) odid 5 1 $replace($gettok($did(3),-1,47),$+($chr(37),20),_)
}
alias wbs.webget.callback {
;ici un exemple concret d'utilisation de la fonction callback
var %dname = wbs.webget , %table = wbs.webget.download
if ($dialog(%dname).title) {
did -a %dname 10 callback: $1-
did -o %dname 13 1 CallBack: $2-
if (($3 == content-lenght) && ($4)) {
if ($dialog(%dname).title) {
did -i %dname 11 1 0 $4
did -o %dname 14 1 / $wsize($4)
did -a %dname 11 0
}
}
elseif ($2 == ierror) {
if ($3 == 1) || ($3 == 1) .remove $qt($hget(%table,file-temp))
}
elseif ($2 == pre-connect) {
;ici un exemple de personalisation du user agent
hadd -m %table user-agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/2.0.0.14
if ($did(%dname,18).state) hadd -m %table cookie $$did(%dname,19)
}
elseif ($2 == close) {
var %value = $hget(wbs.webget.download,content-length)
did -a %dname 11 %value
did -o %dname 14 1 $wsize(%value) / $wsize(%value)
did -a %dname 10 Connection closed.
did -a %dname 10 Conection duration: $duration($4) $calc($5 % 1000) ms
}
}
}
alias wbs.webget.timer.refresh {
;utilisation: /timer 0 1 wbs.webget.timer.refresh [sockname] [dialogue]
if (($sock($1)) && ($dialog($2).title)) {
var %max = $hget(wbs.webget. $+ $gettok($1,3-,46),Content-Length)
did -a $2 11 $sock($1).rcvd 0 %max
did -o $2 14 1 $wsize($sock($1).rcvd) / $wsize(%max)
did -o $2 20 1 Average speed: $wsize($calc($sock($1).rcvd / $sock($1).to)) $+ /s
}
else .timerweb.webget.refresh off
}
;################## FIN DE L'EXEMPLE DU DIALOGUE ET DEBUT DU CODE UTILE ##################
alias wbs.server.url return $gettok($$1,2,47)
alias wbs.webget.showstats {
var %n = $sock(wbs.webget.*,0)
if (!%n) wecho No socket.
while (%n > 0) {
var %sname = $sock(wbs.webget.*,%n) , %rcvd = $sock(%sname).rcvd , %size = $hget(%sname,content-length)
wecho $qt(%sname) $+($chr(91),type: $sock(%sname).type,$chr(93)) $+($chr(91),port: $sock(%sname).port,$chr(93)) $br(ip: $sock(%sname).ip) $&
$br($wsize(%rcvd) / $wsize(%size)) $br($round($calc(%rcvd / %size * 100),2) $+ $chr(37)) $br(from: $duration($sock(%sname).to) ) $&
$br(pause: $iif($sock(%sname).pause,yes,no)) $br(ssl: $iif($sock(%sname).ssl,yes,no))
dec %n
}
}
;ici je préfere faire une alias vers mon alias car je préfere employer mon alias car "getfile" peu etre un nom attribué dans d'autres scripts
alias getfile {
if ($1) wbs.webget $1-
else wbs.webget.showstats
}
alias -l br return $+($chr(91),$1-,$chr(93))
alias wbs.webget {
;6 arguments requis: nom,alias de callback,port,ssl (0/1),url,destination
;exemple: wbs.webget download callback 80 0 http://www.google.fr/intl/fr_fr/images/logo.gif c:/file.gif
;il est possible de spécifier un user-agent personalisé en l'entran manuelement dans la table AVANT l'appel de la commande wbs.webget ou getfile
;syntaxe: wbs.webget.[nom-de-la-conection] user-agent
;exemple: hadd -m %table wbs.webget.download user-agent mIrc $version
if ($5) {
var %table = wbs.webget. $+ $1
;ici je préfere aussi laisser a l'utilisateur de pouvoir formuler lui même sa requette GET s'il le shouaite
if (!$hget(%table,get)) hadd -m %table get $5
if ($6 != x) hadd -m %table file $6-
hadd -m %table mode 0
hadd -m %table ctime $ctime
hadd -m %table name $1
if (!$hget(%table,redirects-left)) hadd -m %table redirects-left 16
if (!$hget(%table,file-temp)) hadd -m %table file-temp $1 $+ .temp
if ($exists($hget(%table,file-temp))) callback %table ierror 1 $qt($hget(%table,file-temp)) already exists
if ($2 != x) hadd %table callback $2
if ($sock(wbs.webget. $+ $1)) {
callback wbs.webget. $+ $1 info hard-sockclose
sockclose wbs.webget. $+ $1
}
callback %table pre-connect
sockopen $iif($4 == 1,-e) $+(wbs.webget.,$1) $wbs.server.url($5) $3
}
else wecho $sname error: wbs.webget: syntax: /wbs.webget [name] [callback alias ("x" if not)] [port] [ssl (0/1)] [url] [destination]
}
alias wsockwrite {
sockwrite $1-
if ($hget($2,callback)) $v1 $2 sockwrite $1-
}
alias -l callback {
;utilisation: callback [htable] alias de callback
;todo permrete l'utilisation de plusieures fonction de callback succesives séparées par des ","
if (($hget($1,callback)) && ($isalias($hget($1,callback)))) $hget($1,callback) $1-
}
alias -l sname return wbs.webget
on *:sockopen:wbs.webget.*:{
var %table = $sockname
hadd -m %table open $ctime $ticks
callback %table info open $ctime $ticks
callback %table info serverip $sock($sockname).ip $sock($sockname).port
if ($hget(%table,post)) wsockwrite -n $sockname POST $v1 HTTP/ $+ $iif($hget(%table,http-version),$v1,1.0)
else wsockwrite -n $sockname GET / $+ $gettok($hget(%table,get),3-,47)) HTTP/ $+ $iif($hget(%table,http-version),$v1,1.0)
if ($hget(%table,Authorization)) wsockwrite -n $sockname Authorization: $v1
if (!$hget(%table,no-referer)) wsockwrite -n $sockname Referer: $iif($hget(%table,referer),$v1,http://wbsscript.free.fr/)
if ($hget(%table,accept)) wsockwrite -n $sockname Accept: $v1
if ($hget(%table,connection)) wsockwrite -n $sockname Connection: $v1
if ($hget(%table,cache-control)) wsockwrite -n $sockname Cache-Control: $v1
if ($hget(%table,cookie)) wsockwrite -n $sockname Cookie: $v1
if (!$hget(%table,no-user-agent)) wsockwrite -n $sockname User-Agent: $iif($hget(%table,user-agent),$v1,CERN-LineMode/2.15 libwww/2.17)
wsockwrite -n $sockname Host: $iif($hget(%table,host),$v1,$wbs.server.url($hget(%table,get))) $+ $crlf $+ $crlf
}
;ici le but de l'interpreteur est de clarifier le code dans la fonction du socket, le socket contien cependent la gestion des erreures
alias wbs.webget.interpreter {
var %buffer = $2- , %table = $1 , %errors = 400;404;500;403, %err = 0
tokenize 32 $2-
if ($gettok($1,1,47) == HTTP) {
hadd -m %table http $2-
callback %table http $2-
}
elseif ($1 == Content-Length:) {
hadd -m %table Content-Length $2
callback %table info content-lenght $2
}
elseif ($1 == Set-Cookie:) {
hadd -m %table cookie $2-
callback %table cookie $2-
}
elseif ($1 == Location:) {
var %location = $2
if (($left(%location,7) != http://) && ($left(%location,8) != https://)) var %location = $+(http://,$sock($sockname).ip,$2)
var %arguments = $hget(%table,name) $iif($hget(%table,callback),$v1,x) $sock($sockname).port $iif($sock($sockname).ssl,1,0) %location $iif($hget(%table,file),$v1,x)
sockclose $sockname
callback %table error $hget(%table,http) $2-
hdec %table redirects-left
if ($hget(%table,redirects-left) <= 0) {
callback %table ierror 2 too many redirections
hfree %table
return
}
hadd -m %table get %location
callback %table reconnect %arguments
wbs.webget %arguments
}
}
on *:sockread:wbs.webget.*:{
var %buffer = $null , %table = $sockname , %errors = 400;404;500;403, %err = 0 , %writefile = $qt($hget(%table,file-temp))
while ((!$sockerr) && (!%err)) {
if ($hget(%table,mode) == 0) {
sockread %buffer
tokenize 32 %buffer
wbs.webget.interpreter $sockname %buffer
callback %table buffer %buffer
if ($1 == Location:) inc %err
elseif ($istok(%errors,$2,59)) {
sockclose $sockname
var %err = $2
callback %table error %err $calc($ctime - $hget(%table,start-time))
hfree %table
break
}
elseif (!%buffer) {
;ce passage marque la fin des headers intervient juste avant le debut du transfer binaire
if (($hget(%table,Content-Length) == 0) || (!$hget(%table,file))) {
callback %table close $ctime $calc($ctime - $hget(%table,ctime)) $ticks no-data
sockclose $sockname
hfree %table
break
}
hadd -m %table mode 1
hadd -m %table safemode 1
}
}
elseif ($hget(%table,mode) == 1) {
;mode binaire (traitement)
sockread &buffer
;la ligne ci dessous est surtout la pour éviter le bug des crlf lié a mirc qui les efface comme un malpropre, a modiffier
if ($bvar(&buffer,0,5).text != $crlf) {
if ($hget(%table,safemode)) {
hdel %table safemode
callback %table info start $ctime
hadd -m %table start-time $ctime
}
}
if (!$hget(%table,safemode)) {
;ici je préfere remetre une sous boucle pour ne pas avoir a ré-interpreter toutes les autres conditions
bwrite %writefile -1 &buffer
while ((!$sockerr) && (!%err)) {
sockread &buffer
bwrite %writefile -1 &buffer
if ($sockbr == 0) break
}
}
}
if ($sockbr == 0) break
}
if ($sockerr) callback %table error sockerr $sockerr
}
on *:sockclose:wbs.webget.*:{
var %table = $sockname , %file = $qt($hget(%table,file))
if ($exists(%file)) .remove %file
if ($hget(%table,mode)) .rename $qt($iif($hget(%table,file-temp),$v1,$+($mircdir,$sockname,.temp))) %file
callback %table file %file
callback %table close $ctime $calc($ctime - $hget(%table,open)) $ticks finished
hfree %table
}
alias wbs.webget.timer.callback {
;utilisation: /.timerwbs.webget.timer.callback 0 1 wbs.webget.timer.callback [sockname] [alias]
;effet: appele [alias] et retourne: [sockname] [position actuelle] [durée de la conection]
if (($sock($1)) && ($isalias($2))) {
$2 $sock($1).rcvd $hget(wbs.webget. $+ $gettok($1,3-,46),Content-Length)
if (!$timer(wbs.webget.timer.callback)) .timerwbs.webget.timer.callback 0 1 wbs.webget.timer.callback $1 $2
}
else .timerwbs.webget.timer.callback off
}
;#aliases de compatibilitées
alias -l wbs.mdx.make.pbar {
;usage: wbs.mdx.make.pbar $dname id:0-0-100
;values: defaut-debut-fin
var %dname = $1 , %target = $gettok($2,1,58) , %values = $replace($gettok($2,2,58),-,$chr(32))
if ($dialog(%dname).title) {
wbs.mdx SetControlMDX %dname %target ProgressBar > $wdll(ctl_gen.mdx)
did -i %dname %target 1 $gettok(%values,2-,32)
did -a %dname %target $gettok(%values,1,32)
}
}
;alias de compatibilitée pour exportation du code
alias -l wdll return $qt($+($scriptdir,dlls\,$1))
alias -l w.err adid 10 $1-
alias -l idid did -i $dname $1-
alias -l adid did -a $dname $1-
alias -l rdid did -r $dname $1-
alias -l odid did -o $dname $1-
alias -l bdid did -b $dname $1-
alias -l udid did -u $dname $1-
alias -l wecho echo -a $1-
alias -l wsize {
if ($1 !isnum 0-) return n/a
else return $replace($lower($bytes($1-,3).suf $+ $iif($right($bytes($1-,3).suf,1) !== b,b)),b,b)
}
;uniquement pour le gui:
alias -l wbs.mdx.make.pbar {
;usage: wbs.mdx.make.pbar $dname id:0-0-100
;values: defaut-debut-fin
var %dname = $1 , %target = $gettok($2,1,58) , %values = $replace($gettok($2,2,58),-,$chr(32))
if ($dialog(%dname).title) {
wbs.mdx SetControlMDX %dname %target ProgressBar > $wdll(ctl_gen.mdx)
did -i %dname %target 1 $gettok(%values,2-,32)
did -a %dname %target $gettok(%values,1,32)
}
}
Conclusion
je ne met pas les aliases "mdxinit" et "mdx" car celles ci sont déjà tellement répandues que je préfère ne pas les mettre pour éviter des confits
#FACULTATIF ! (interface uniquement: useless) placez les dlls de mdx dans le dossier "dlls/" la ou se trouve le script, si vous les avez deja ailleurs moddifiez la fonction "wdll" (a la la fin du code) (je met ca car chez moi le wdll fait appels a bien trop de sous fonction (utilisation d'un cache)
je suis bien évidement ouvert a toute idée d'amélioration
Historique
- 13 février 2009 20:34:22 :
- ajout du systeme de callback
épuration du code
séparation du dialog et du coeur du script
- 14 février 2009 14:05:54 :
- corection d'un bug majeur qui freezai mirc en boucle infinie lors d'une erreur du serveur (404/400/503/403...)
La bare de progression du dialogue fonctione a present
- 16 février 2009 03:51:32 :
- ajout de l'evant "buffer" dans la fonction de callback pour permettre plus de possibilités
ajout d'un bouton "stop" dans le dialogue pour couper un téléchargement
ajout d'un bouton "pause" pour mettre en pause/reprendre un téléchargement (sous réserve que le serveur le supporte)
- 16 février 2009 14:53:10 :
- ajout d'une alias oubliée: wsize
- 23 février 2009 04:06:54 :
- gestion du cas de l'erreur 302 (données déménagées de serveur) et suivis du lien indiqué par le serveur
- 27 février 2009 18:41:33 :
- optimisation du code
les sockwrite passent maintenant par la fonction de callback
ajout de l'alias "w.err" oubliée
ajout d'un interpréteur séparé du socket pour clarifier le code
il est désormais possible de sépcifier manuelement la requete GET à envoyer et de changer l'user agent (voir manuel) à volontée
- 10 mars 2009 19:36:35 :
- creation d'une alias $wbs.webget.version qui retourne la version du script wbs.webget
ajout de plusieurs pre-evenement pour les téléchagement: host/autorization/connection
optimisation de la boucle de la partie binaire
ajout d'un parseur externe au on *:sockread pour plus de claretée dans le code
- 14 mars 2009 05:29:54 :
- correction d'un bug (espace en trop dans le headers "host") qui retournais une erreur 400 sur certains serveurs, ajout des évènements "pre-connect" pour les moddif des paramètres avant ouverture du socket, événement "file" qui retourne le chemin du fichier sur le disque dur, possibilités de spécifier un cookie (voir manuel), évement "cookie" lors de la recepetion de celui par le serveur
- 13 mai 2009 16:00:24 :
- correction d'une erreur a la ligne 291 lorsque le dossier ou mirc se trouve contenais un espace, le mode ssl fonctione (requier l'installation de openssl avant), rajout des aliases oubliées, protection contre les erreur 302 et 301 de la part du serveur (quand ce dernier redirigeais infiniement): désormais 15 redirection maxi (parametrable via la htable), gestion des liens relatifs pour les redirection du serveur (301/302)
- 07 juillet 2009 13:24:09 :
- ajout de la possibilitée d'envoyer des requetes via POST (au lieu de get) , possibilitée de spécifier un "accept" et aussi de pouvoir changer le "referer" , correction d'un bug lorsque le chemin de destination contenais des espaces.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Socket HTTP [ par Landwest ]
J'ai copié le code suivant dans mle tuto sur les sockets, mais je ne comprend pas pourquoi il me retourne: _____________________________ HTTP/1.1 200
PicWin Multi-Fonctions : Un p'tit coup de pub [ par RCA ArKanis ]
J'osais pas créer une nouvelle source pour ça, étant donné que le remote pour lequel je pubbe a déjà été envoy
Socket basique ( dur pour moi :'( ) [ par Dabouille ]
Voila j'essaye d'apprendre les sockets mais la je desespere tout seul a 5h du matin :'(Si quelqu'un voit des erreux peut il me le signaler?merci bcpal
avoir un bot [ par Nosferaptu ]
bonjour, je voudrais telecharger mon bot mais je ne sais pas ou le telecharger si vous sauriez ou telecharger un bot contacter moimerci d'avance
$regex [ par MegaSmax ]
Bonsoir, je voudrais ameliorer une partie de mon script. Je voudrais write dans fichier txt une url qui apparait sur un chan.Jai trouvé ca sur sc
Socket [ par Dabouille ]
Bonjour,quand jessaye de me connecter, j'obtient ceciHTTP/1.1 403 ForbiddenDate: Fri, 03 Feb 2006 21:25:14 GMTServer: Apache/2.0.52 (Red Hat) DAV/2 mo
telecharger un bot [ par Nosferaptu ]
bonjour,je voudrais savoir ou telecharger un bot qui pourrais "faire la loi" c'est a dire un bot qui gererais le salon.merci d'avance
Socket anti-flood [ par michaeldu03 ]
Bonjour a tous Je viens de me mettre au socket et la je bloque je cherche un moyen de faire un anti-flood par socket et un anti-spam mais je bloque je
Aide pour socket [ par KaLViN2 ]
Bonjour : )Mettant mis depuis quelques temps aux sockets je me trouve bloqué par un truc surement idiot mais je n'ai rien vu dans l'aide pour m'a
|
Derniers Blogs
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : ON RAWMODERE : ON RAWMODE par WorldDMT
Cliquez pour lire la suite par WorldDMT AVERTISSMENT ET KIKKAVERTISSMENT ET KIKK par mouhcine951990
Cliquez pour lire la suite par mouhcine951990
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|