REBOL [ Title: "Wikipedia Auto-POST Bot" Date: 30-Nov-2002/19:04:09+1:00 Version: 1.0.0 File: %wapbot.r Author: "Athymik" Needs: "Rebol/Core, downloadable freely on www.rebol.com" Purpose: "Posts an article on Wikipedia." Email: athymik@ifrance.com Category: [view 4 markup] Note_fr: {Ce programme est basé sur les travaux de Martin Johannesson, HTTP-POST et utilise les fonctions http-post-form et url-encode.} License: "GPL" ] wikitime: func [] [ decalagehoraire: 1 ; signifie +1 GMT now_year: to-string now/year now_month: to-string now/month now_day: to-string now/day if (length? now_month) = 1 [ now_month: rejoin ["0" now_month] ] if (length? now_day) = 1 [ now_day: rejoin ["0" now_day] ] now_time: now/time ntstr: to-string now_time ntsp: parse ntstr ":" tempz: to-integer ntsp/1 tempz: tempz - decalagehoraire ntsp/1: to-string tempz groupeb: rejoin ntsp groupea: rejoin [now_year now_month now_day] wt: rejoin [groupea groupeb] return wt ] url-encode: func [ {URL-encode a string} data "String to encode" /local new-data ][ new-data: make string! "" normal-char: charset [ #"A" - #"Z" #"a" - #"z" #"@" #"." #"*" #"-" #"_" #"0" - #"9" ] if not string? data [return new-data] forall data [ append new-data either find normal-char first data [ first data ][ rejoin ["%" to-string skip tail (to-hex to-integer first data) -2] ] ] new-data ] http-post-form: func [ {Post a form to a web server} url "The URL to post to" data [block!] "A block of name/value pairs to represent the form" /local encoded-data port-spec HTTP-Post-Header http-request buffer tmp-buffer ][ port-spec: make port! [ scheme: 'tcp port-id: 80 timeout: 0:10 ] net-utils/url-parser/parse-url port-spec url encoded-data: make string! "" foreach [name value] data [ append encoded-data rejoin [ url-encode name "=" url-encode value "&" ] ] remove back tail encoded-data HTTP-Post-Header: make object! [ Accept: "*/*" User-Agent: reform ["REBOL" system/version] Host: port-spec/host Content-Type: "application/x-www-form-urlencoded" Content-Length: length? encoded-data ] http-request: rejoin [ "POST /" either found? port-spec/path [port-spec/path][""] either found? port-spec/target [port-spec/target][""] " HTTP/1.0^/" net-utils/export HTTP-Post-Header "^/" encoded-data ] http-port: open/lines [ scheme: 'tcp port-id: port-spec/port-id timeout: port-spec/timeout host: port-spec/host user: port-spec/user pass: port-spec/pass ] insert http-port http-request buffer: make string! 10000 tmp-buffer: reform ["HTTP-Response:" pick http-port 1] while [not none? tmp-buffer] [ append buffer rejoin [tmp-buffer "^/"] tmp-buffer: pick http-port 1 ] close http-port HTTP-Header: make object! [ HTTP-Response: Date: Server: Last-Modified: none Accept-Ranges: Content-Encoding: Content-Type: none Content-Length: Location: Expires: Referer: Connection: none ] parse-header HTTP-Header buffer ] wikipost: func [wwiki txt title somr minor] [ not-lt-gt: complement charset [#"<" #">"] tag-rule: ["<" some not-lt-gt ">"] wikiurlbeg: "http://" wikiurlmiddle: ".wikipedia.org/w/wiki.phtml?title=" wikiurlend: "&action=submit" wikiurl: rejoin [wikiurlbeg wwiki wikiurlmiddle title wikiurlend] tmp: http-post-form wikiurl reduce [ "wpTextbox1" txt "wpSummary" somr "wpMinoredit" minor "wpSave" "Sauvegarder" "wpEdittime" wikitime "wpCountable" "0" ] print "Article posté !" print tmp/content ] print {0-----------------0 | WAPBot | |-----------------| | par Athymik | |-----------------| | License GPL | 0-----------------0 } wiki_laquel: ask "Quelle Wikipedia ? (par ex. fr ou meta ou www ou de): " texte_path: ask "Nom du fichier: " titre: ask "Titre de l'article (par ex. Utilisateur:Athymik/WAPBot): " resume: ask "Résumé de l'article: " mineure_txt: ask "Est-ce une révision mineure ? (O/N): " if/else (mineure_txt = "O") [mineure: 1] [mineure: 0] texte: read make file! texte_path resume: rejoin ["Posté par WAPBot - " resume] ; nothinge: {(Il n'y a pour l'instant aucun texte sur cette page)} ; pageexist: read to-url rejoin ["http://fr.wikipedia.org/wiki/" titre] ; if/else (find pageexist nothinge) <> none [ ; print rejoin "Un article, également nommé " titre " existe déjà sur Wikipedia." ; ecrason: ask {Voulez-vous le remplacer par le vôtre ? (tapez "o" pour confirmer) : } ; if/else (ecrason = "o" ) [wikipost texte titre resume mineure] [print "Post de l'article annulé." wait 5] ; ] [wikipost texte titre resume mineure] wikipost wiki_laquel texte titre resume mineure