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