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