2wiki.sh: Unterschied zwischen den Versionen
Hw (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 139: | Zeile 139: | ||
rm "$SAVECOOKIES" | rm "$SAVECOOKIES" | ||
</pre> | </pre> | ||
== N900 extensions == | |||
This is a script with the n900 extensions | |||
</pre> | |||
#!/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="Marvin" | |||
LGPASS="q64ZRdtB31WFbnHgo75" | |||
# 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 | |||
</pre> | |||
[[Category:Projekte]] | [[Category:Projekte]] |
Version vom 6. Juli 2011, 00:32 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="Marvin" LGPASS="q64ZRdtB31WFbnHgo75"
- 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