2wiki.sh: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 141: | Zeile 141: | ||
== N900 extensions == | == N900 extensions == | ||
This is a script with the n900 extensions | This is a script with the n900 extensions | ||
< | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
# whacky hacky mediawiki uploader. | # whacky hacky mediawiki uploader. | ||
| Zeile 158: | Zeile 158: | ||
# hier konfigurieren: | # hier konfigurieren: | ||
APIURL="http://cccgoe.de/w/api.php" | APIURL="http://cccgoe.de/w/api.php" | ||
LGNAME=" | LGNAME="" | ||
LGPASS=" | LGPASS="" | ||
# hier debuggen: :-) | # hier debuggen: :-) | ||
Version vom 6. Juli 2011, 00:33 Uhr
Idee
Upload ins Mediawiki via möglichst einfach gehaltenem Bash-Skript. Konstruiert, um via N900 direkt aus der Kamera-App Bilder hochzuladen
Anforderungen
Bash, Wget Sed, Grep mktemp
Hack-Faktor
Baut ein MIME multipart/form-data für wget, das das eigentlich nicht kann... Dürfte auch der Schwachpunkt der ganzen Angelegenheit sein...
Skript
#!/bin/bash # whacky hacky mediawiki uploader. # (c) 2011 Hans-Werner Hilse <hilse@web.de> # this software is published under the know-what-you're-doing licence: # # 1. you may use this software for whatever you want, given that you know what you're doing. # 2. author of this software isn't responsible for anything since you knew what you're doing. # 3. if you have still questions, chances are you do not fullfill requirements #---------------------------------------------------------------------------------------------- # hier konfigurieren: APIURL="http://cccgoe.de/w/api.php" LGNAME="" LGPASS="" # hier debuggen: :-) # wenn dies in der datei vorkommt, haut das MIME/multipart/form-data nicht hin. BOUNDARY="32ruofdihgo83hkj" SOURCENAME="$1" FILENAME="$2" if [ "x$FILENAME" = "x" ] ; then FILENAME="$1" fi # temp file fuer die cookies SAVECOOKIES=$(mktemp /tmp/2wiki.XXXXXXX) # einloggen RESULT=$(wget --quiet -O - \ --save-cookies "$SAVECOOKIES" \ --keep-session-cookies \ --post-data="action=login&format=xml&lgname=$LGNAME&lgpassword=$LGPASS" \ "$APIURL") # neuere mediawiki brauchen dann dies zur token-bestaetigung: if echo "$RESULT"|grep -q '<login result="NeedToken"'; then LGTOKEN=$(echo $RESULT|sed 's/^.*<login result="NeedToken" token="\([^"]\+\)".*$/\1/') RESULT=$(wget --quiet -O - \ --load-cookies "$SAVECOOKIES" \ --save-cookies "$SAVECOOKIES" \ --keep-session-cookies \ --post-data="action=login&format=xml&lgname=$LGNAME&lgpassword=$LGPASS&lgtoken=$LGTOKEN" \ "$APIURL") fi # gucken, ob wir drin sind: if ! echo "$RESULT" | grep -q '<login result="Success"'; then echo "Login failure" echo $RESULT rm "$SAVECOOKIES" fi echo "Logged in." # edit-token holen (irgendwie brauchts einen Seitentitel - wir nehmen "FooBar" RESULT=$(wget --quiet -O - \ --load-cookies "$SAVECOOKIES" \ --save-cookies "$SAVECOOKIES" \ --keep-session-cookies \ --post-data="action=query&format=xml&prop=info&intoken=edit&titles=FooBar" \ "$APIURL") EDITTOKEN=$(echo $RESULT|sed 's/^.* edittoken="\([^"]\+\)".*$/\1/') # hacky MIME multipart/form-data construction: # wir brauchen das in einer Datei, da wget nicht gepuffert aus stdin liest: TEMPPOSTDATA=$(mktemp /tmp/2wiki.XXXXXX) echo -e "--$BOUNDARY\r Content-Disposition: form-data; name=\"action\"\r \r upload\r --$BOUNDARY\r Content-Disposition: form-data; name=\"ignorewarnings\"\r \r true\r --$BOUNDARY\r Content-Disposition: form-data; name=\"filename\"\r \r $FILENAME\r --$BOUNDARY\r Content-Disposition: form-data; name=\"format\"\r \r xml\r --$BOUNDARY\r Content-Disposition: form-data; name=\"token\"\r \r $EDITTOKEN --$BOUNDARY\r Content-Disposition: form-data; name=\"file\"; filename=\"$FILENAME\"\r Content-Type: application/octet-stream\r Content-Transfer-Encoding: binary\r \r" > "$TEMPPOSTDATA" cat "$SOURCENAME" >> "$TEMPPOSTDATA" echo -e "\r\n--$BOUNDARY--\r" >> "$TEMPPOSTDATA" # und raus mit dem Kram! RESULT=$(wget --quiet -O - \ --load-cookies "$SAVECOOKIES" \ --save-cookies "$SAVECOOKIES" \ --keep-session-cookies \ --header="Content-Type: multipart/form-data; boundary=$BOUNDARY" \ --post-file="$TEMPPOSTDATA" \ "$APIURL") if ! echo "$RESULT" | grep -q '<upload result="Success"'; then echo "Upload failure" > /dev/stderr echo $RESULT > /dev/stderr else echo "Upload successful" > /dev/stderr echo $RESULT | sed 's/^.* url="\([^"]\+\)".*$/\1/' fi rm "$TEMPPOSTDATA" rm "$SAVECOOKIES"
N900 extensions
This is a script with the n900 extensions
#!/bin/bash
# whacky hacky mediawiki uploader.
# (c) 2011 Hans-Werner Hilse <hilse@web.de>
# this software is published under the know-what-you're-doing licence:
#
# 1. you may use this software for whatever you want, given that you know what you're doing.
# 2. author of this software isn't responsible for anything since you knew what you're doing.
# 3. if you have still questions, chances are you do not fullfill requirements
#----------------------------------------------------------------------------------------------
# More hackyer n900 extensions
# (c) 2011 Marvin Sebulov (marvin@0x53a.de)
# If something goes wrong, ask hw.
# hier konfigurieren:
APIURL="http://cccgoe.de/w/api.php"
LGNAME=""
LGPASS=""
# hier debuggen: :-)
perror()
{
if [ "x$allow_n900_messages" = "x1" ]
then
dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"$*"
else
echo "$*" >&2
fi
cleanup
if [ "$read_before_exit" = "1" ]
then
read
fi
exit
}
cleanup()
{
[ -e "$SAVECOOKIES" ] && rm "$SAVECOOKIES";
[ -e "$TEMPPOSTDATA" ] && rm "$TEMPPOSTDATA";
}
export allow_n900_messages=0
export read_before_exit=0
found=1
while [ "$found" = 1 ]
do
found=0
if [ "x$1" = "xwrap-n900-xterm" ]
then
pf=$(mktemp /tmp/2wiki.XXXXXXX)
osso-xterm -e "$0 allow-n900-messages create-pid \"$pf\" read-before-exit \"$2\" \"$3\""
while ! [ -e "$pf" ]
do
sleep 0.5
done
wait $(< "$pf")
exit
fi
if [ "x$1" = "xcreate-pid" ]
then
echo $$ > "$2"
shift
shift
found=1
fi
if [ "x$1" = "xread-before-exit" ]
then
export read_before_exit=1
shift
found=1
fi
if [ "x$1" = "xallow-n900-messages" ]
then
export allow_n900_messages=1
shift
found=1
fi
done
if ! [ "x$#" = "x2" ]
then
echo 'Usage: '"$0" ' {create-pid <pidfile>|wrap-n900-xterm|read-before-exit|allow_n900_messages} <source file> <desired file name>'
exit 1
fi
# wenn dies in der datei vorkommt, haut das MIME/multipart/form-data nicht hin.
BOUNDARY="32ruofdihgo83hkj"
SOURCENAME="$1"
FILENAME="$2"
if [ "x$FILENAME" = "x" ] ; then
FILENAME="$1"
fi
if ! [ -e "$SOURCENAME" ]
then
perror "Source file does not exist"
fi
# temp file fuer die cookies
export SAVECOOKIES=$(mktemp /tmp/2wiki.XXXXXXX)
# einloggen
RESULT=$(wget --quiet -O - \
--save-cookies "$SAVECOOKIES" \
--keep-session-cookies \
--post-data="action=login&format=xml&lgname=$LGNAME&lgpassword=$LGPASS" \
"$APIURL")
# neuere mediawiki brauchen dann dies zur token-bestaetigung:
if echo "$RESULT"|grep -q '<login result="NeedToken"'; then
LGTOKEN=$(echo $RESULT|sed 's/^.*<login result="NeedToken" token="\([^"]\+\)".*$/\1/')
RESULT=$(wget --quiet -O - \
--load-cookies "$SAVECOOKIES" \
--save-cookies "$SAVECOOKIES" \
--keep-session-cookies \
--post-data="action=login&format=xml&lgname=$LGNAME&lgpassword=$LGPASS&lgtoken=$LGTOKEN" \
"$APIURL")
fi
# gucken, ob wir drin sind:
if ! echo "$RESULT" | grep -q '<login result="Success"'; then
perror "Login failure"
echo $RESULT
rm "$SAVECOOKIES"
fi
echo "Logged in."
# edit-token holen (irgendwie brauchts einen Seitentitel - wir nehmen "FooBar"
RESULT=$(wget --quiet -O - \
--load-cookies "$SAVECOOKIES" \
--save-cookies "$SAVECOOKIES" \
--keep-session-cookies \
--post-data="action=query&format=xml&prop=info&intoken=edit&titles=FooBar" \
"$APIURL")
EDITTOKEN=$(echo $RESULT|sed 's/^.* edittoken="\([^"]\+\)".*$/\1/')
# hacky MIME multipart/form-data construction:
# wir brauchen das in einer Datei, da wget nicht gepuffert aus stdin liest:
export TEMPPOSTDATA=$(mktemp /tmp/2wiki.XXXXXX)
echo -e "--$BOUNDARY\r
Content-Disposition: form-data; name=\"action\"\r
\r
upload\r
--$BOUNDARY\r
Content-Disposition: form-data; name=\"ignorewarnings\"\r
\r
true\r
--$BOUNDARY\r
Content-Disposition: form-data; name=\"filename\"\r
\r
$FILENAME\r
--$BOUNDARY\r
Content-Disposition: form-data; name=\"format\"\r
\r
xml\r
--$BOUNDARY\r
Content-Disposition: form-data; name=\"token\"\r
\r
$EDITTOKEN
--$BOUNDARY\r
Content-Disposition: form-data; name=\"file\"; filename=\"$FILENAME\"\r
Content-Type: application/octet-stream\r
Content-Transfer-Encoding: binary\r
\r" > "$TEMPPOSTDATA"
cat "$SOURCENAME" >> "$TEMPPOSTDATA"
echo -e "\r\n--$BOUNDARY--\r" >> "$TEMPPOSTDATA"
# und raus mit dem Kram!
RESULT=$(wget --quiet -O - \
--load-cookies "$SAVECOOKIES" \
--save-cookies "$SAVECOOKIES" \
--keep-session-cookies \
--header="Content-Type: multipart/form-data; boundary=$BOUNDARY" \
--post-file="$TEMPPOSTDATA" \
"$APIURL")
if ! echo "$RESULT" | grep -q '<upload result="Success"'; then
perror "Upload failure"
echo $RESULT > /dev/stderr
else
perror "Upload successful"
echo $RESULT | sed 's/^.* url="\([^"]\+\)".*$/\1/'
fi
cleanup
if [ "$read_before_exit" = "1" ]
then
read
fi