Hi everyone,
I'm trying to login using the MediaWiki API. This works if I copy the token manually in the code every time again. Using the token from the variable DOESNT work, but copy pasting the same token into the TOKEN= assignment (into the source code) DOES work!
After that, I'm trying to edit a page. I have the same problem with the edit token. It cannot be read from the variable, unless I copied the token manually to the variable in the source code :(
I know I'm almost there, but the tokens are getting in the way.
Why doesn't it work when I'm parsing the token from the API? When I copy-paste the same token into the source code directly it works..
The token looks the same to me! Is curl getting in the way here? I tried several things, like dropping the last \ from the token and then passing it to curl, but to no avail.
Output of the script when it doesn't work (reading the token from the TOKEN variable when parsing from the API): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 112 100 112 0 0 649 0 --:--:-- --:--:-- --:--:-- 666 { "batchcomplete": "", "query": { "tokens": { "logintoken": "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" } } } Login token is "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" ----- Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 302 100 142 100 160 829 935 --:--:-- --:--:-- --:--:-- 958 { "error": { "code": "badtoken", "info": "Invalid CSRF token.", "*": "See https://nl.wikipedia.org/w/api.php for API usage." }, "servedby": "mw1288" }
Unable to login, is logintoken "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" correct?
==========================================
Output of the script when it does work (reading the token from the TOKEN variable when using a fixed value for the login token): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 111 100 111 0 0 642 0 --:--:-- --:--:-- --:--:-- 660 { "batchcomplete": "", "query": { "tokens": { "logintoken": "7bfac90f99869aeb77fee2646d0022f1589040d3+\" } } } Login token is 3e929f9275d81f12a1f7c93e1beec99f589040b4+\ ----- Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 224 100 76 100 148 36 71 0:00:02 0:00:02 --:--:-- 72 { "clientlogin": { "status": "PASS", "username": "Smile4ever" } } Successfully logged in as Smile4ever, STATUS is "PASS"
Script:
#!/usr/bin/env bash
#Needs curl USERNAME="Smile4ever" USERPASS="******" WIKIAPI="https://nl.wikipedia.org/w/api.php" cookie_jar="wikicj" #Will store file in wikifile
echo "UTF8 check: ☠" #################login echo "Logging into $WIKIAPI as $USERNAME..."
############### #Login part 1 #printf "%s" "Logging in (1/2)..." echo "Get login token..." CR=$(curl -S \ --location \ --retry 2 \ --retry-delay 5\ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "GET" "${WIKIAPI}?action=query&meta=tokens&type=login&format=json")
echo "$CR" | jq . rm login.json echo "$CR" > login.json TOKEN=$(jq '.query.tokens.logintoken' login.json) #TOKEN="${TOKEN//"/}" #replace double quote by nothing
#Remove carriage return! #printf "%s" "$TOKEN" > token.txt #TOKEN=$(cat token.txt | sed 's/\r$//') #TOKEN="$(<token.txt)" #TOKEN="${TOKEN//+\/+}" #replace +\ by +
#echo -n $TOKEN > token.txt #TOKEN="${TOKEN//+\/%2b%5c}" #replace +\ by %2b%5c #TOKEN="33bf0c310b22a836be6b28905470d3a1589031da+\"
#TOKEN="24949330db743d9af74e7e56f2b523725890407b+\" if [ "$TOKEN" == "null" ]; then echo "Getting a login token failed." exit else echo "Login token is $TOKEN" echo "-----" fi
############### #Login part 2 echo "Logging in..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "username=${USERNAME}" \ --data-urlencode "password=${USERPASS}" \ --data-urlencode "rememberMe=1" \ --data-urlencode "logintoken=${TOKEN}" \ --data-urlencode "loginreturnurl=http://google.be" \ --request "POST" "${WIKIAPI}?action=clientlogin&format=json")
echo "$CR" | jq .
STATUS=$(echo $CR | jq '.clientlogin.status') if [[ $STATUS == *"PASS"* ]]; then echo "Successfully logged in as $USERNAME, STATUS is $STATUS." echo "-----" else echo "Unable to login, is logintoken ${TOKEN} correct?" exit fi
############### #Get edit token echo "Fetching edit token..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "POST" "${WIKIAPI}?action=query&meta=tokens&format=json")
echo "$CR" | jq . echo "$CR" > edittoken.json EDITTOKEN=$(jq '.query.tokens.csrftoken' edittoken.json) rm edittoken.json EDITTOKEN="${EDITTOKEN//"/}" #replace double quote by nothing #EDITTOKEN="${EDITTOKEN//+\/+}" #replace +\ by +
if [[ $EDITTOKEN == *"+\"* ]]; then echo "Edit token is: $EDITTOKEN" else echo "Edit token not set." exit fi
############### #Make a test edit #EDITTOKEN="d55014d69f1a8c821073bb6724aced7658904018+\" CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "title=Gebruiker:Smile4ever/test4" \ --data-urlencode "appendtext={{nocat|2017|01|31}}" \ --data-urlencode "token=${EDITTOKEN}" \ --request "POST" "${WIKIAPI}?action=edit&format=json") echo "$CR" | jq .
Kind regards, Geoffrey De Belie
You should use jq --raw-output.
On Tue, Jan 31, 2017 at 12:08 AM, geoffreydebelie geoffreydebelie@zoho.com wrote:
Hi everyone,
I'm trying to login using the MediaWiki API. This works if I copy the token manually in the code every time again. Using the token from the variable DOESNT work, but copy pasting the same token into the TOKEN= assignment (into the source code) DOES work!
After that, I'm trying to edit a page. I have the same problem with the edit token. It cannot be read from the variable, unless I copied the token manually to the variable in the source code :(
I know I'm almost there, but the tokens are getting in the way.
Why doesn't it work when I'm parsing the token from the API? When I copy-paste the same token into the source code directly it works..
The token looks the same to me! Is curl getting in the way here? I tried several things, like dropping the last \ from the token and then passing it to curl, but to no avail.
Output of the script when it doesn't work (reading the token from the TOKEN variable when parsing from the API): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 112 100 112 0 0 649 0 --:--:-- --:--:-- --:--:-- 666 { "batchcomplete": "", "query": { "tokens": { "logintoken": "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" } } } Login token is "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\"
Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 302 100 142 100 160 829 935 --:--:-- --:--:-- --:--:-- 958 { "error": { "code": "badtoken", "info": "Invalid CSRF token.", "*": "See https://nl.wikipedia.org/w/api.php for API usage." }, "servedby": "mw1288" }
Unable to login, is logintoken "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" correct?
==========================================
Output of the script when it does work (reading the token from the TOKEN variable when using a fixed value for the login token): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 111 100 111 0 0 642 0 --:--:-- --:--:-- --:--:-- 660 { "batchcomplete": "", "query": { "tokens": { "logintoken": "7bfac90f99869aeb77fee2646d0022f1589040d3+\" } } } Login token is 3e929f9275d81f12a1f7c93e1beec99f589040b4+\
Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 224 100 76 100 148 36 71 0:00:02 0:00:02 --:--:-- 72 { "clientlogin": { "status": "PASS", "username": "Smile4ever" } } Successfully logged in as Smile4ever, STATUS is "PASS"
Script:
#!/usr/bin/env bash
#Needs curl USERNAME="Smile4ever" USERPASS="******" WIKIAPI="https://nl.wikipedia.org/w/api.php" cookie_jar="wikicj" #Will store file in wikifile
echo "UTF8 check: ☠" #################login echo "Logging into $WIKIAPI as $USERNAME..."
############### #Login part 1 #printf "%s" "Logging in (1/2)..." echo "Get login token..." CR=$(curl -S \ --location \ --retry 2 \ --retry-delay 5\ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "GET" "${WIKIAPI}?action=query&meta= tokens&type=login&format=json")
echo "$CR" | jq .
rm login.json echo "$CR" > login.json TOKEN=$(jq '.query.tokens.logintoken' login.json) #TOKEN="${TOKEN//"/}" #replace double quote by nothing
#Remove carriage return! #printf "%s" "$TOKEN" > token.txt #TOKEN=$(cat token.txt | sed 's/\r$//') #TOKEN="$(<token.txt)" #TOKEN="${TOKEN//+\/+}" #replace +\ by +
#echo -n $TOKEN > token.txt #TOKEN="${TOKEN//+\/%2b%5c}" #replace +\ by %2b%5c #TOKEN="33bf0c310b22a836be6b28905470d3a1589031da+\"
#TOKEN="24949330db743d9af74e7e56f2b523725890407b+\" if [ "$TOKEN" == "null" ]; then echo "Getting a login token failed." exit else echo "Login token is $TOKEN" echo "-----" fi
############### #Login part 2 echo "Logging in..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "username=${USERNAME}" \ --data-urlencode "password=${USERPASS}" \ --data-urlencode "rememberMe=1" \ --data-urlencode "logintoken=${TOKEN}" \ --data-urlencode "loginreturnurl=http://google.be" \ --request "POST" "${WIKIAPI}?action=clientlogin&format=json")
echo "$CR" | jq .
STATUS=$(echo $CR | jq '.clientlogin.status') if [[ $STATUS == *"PASS"* ]]; then echo "Successfully logged in as $USERNAME, STATUS is $STATUS." echo "-----" else echo "Unable to login, is logintoken ${TOKEN} correct?" exit fi
############### #Get edit token echo "Fetching edit token..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "POST" "${WIKIAPI}?action=query&meta= tokens&format=json")
echo "$CR" | jq . echo "$CR" > edittoken.json EDITTOKEN=$(jq '.query.tokens.csrftoken' edittoken.json) rm edittoken.json EDITTOKEN="${EDITTOKEN//"/}" #replace double quote by nothing #EDITTOKEN="${EDITTOKEN//+\/+}" #replace +\ by +
if [[ $EDITTOKEN == *"+\"* ]]; then echo "Edit token is: $EDITTOKEN" else echo "Edit token not set." exit fi
############### #Make a test edit #EDITTOKEN="d55014d69f1a8c821073bb6724aced7658904018+\" CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "title=Gebruiker:Smile4ever/test4" \ --data-urlencode "appendtext={{nocat|2017|01|31}}" \ --data-urlencode "token=${EDITTOKEN}" \ --request "POST" "${WIKIAPI}?action=edit&format=json")
echo "$CR" | jq .
Kind regards, Geoffrey De Belie
Mediawiki-api mailing list Mediawiki-api@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-api
Thanks a lot!
I posted my working code here https://www.mediawiki.org/wiki/API:Client_code/Bash
Kind regards, Geoffrey De Belie
---- On di, 31 jan 2017 11:12:54 +0100 Gergo Tisza gtisza@wikimedia.org wrote ----
You should use jq --raw-output. On Tue, Jan 31, 2017 at 12:08 AM, geoffreydebelie geoffreydebelie@zoho.com wrote:
Mediawiki-api mailing list Mediawiki-api@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Hi everyone,
I'm trying to login using the MediaWiki API. This works if I copy the token manually in the code every time again. Using the token from the variable DOESNT work, but copy pasting the same token into the TOKEN= assignment (into the source code) DOES work!
After that, I'm trying to edit a page. I have the same problem with the edit token. It cannot be read from the variable, unless I copied the token manually to the variable in the source code :(
I know I'm almost there, but the tokens are getting in the way.
Why doesn't it work when I'm parsing the token from the API? When I copy-paste the same token into the source code directly it works..
The token looks the same to me! Is curl getting in the way here? I tried several things, like dropping the last \ from the token and then passing it to curl, but to no avail.
Output of the script when it doesn't work (reading the token from the TOKEN variable when parsing from the API): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 112 100 112 0 0 649 0 --:--:-- --:--:-- --:--:-- 666 { "batchcomplete": "", "query": { "tokens": { "logintoken": "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" } } } Login token is "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\"
Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 302 100 142 100 160 829 935 --:--:-- --:--:-- --:--:-- 958 { "error": { "code": "badtoken", "info": "Invalid CSRF token.", "*": "See https://nl.wikipedia.org/w/api.php for API usage." }, "servedby": "mw1288" }
Unable to login, is logintoken "9b9a82c7ac27cf9573e1c7cb7419cf53589041ec+\" correct?
==========================================
Output of the script when it does work (reading the token from the TOKEN variable when using a fixed value for the login token): $ ./clientcode.sh UTF8 check: ☠ Logging into https://nl.wikipedia.org/w/api.php as Smile4ever... Get login token... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 111 100 111 0 0 642 0 --:--:-- --:--:-- --:--:-- 660 { "batchcomplete": "", "query": { "tokens": { "logintoken": "7bfac90f99869aeb77fee2646d0022f1589040d3+\" } } } Login token is 3e929f9275d81f12a1f7c93e1beec99f589040b4+\
Logging in... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 224 100 76 100 148 36 71 0:00:02 0:00:02 --:--:-- 72 { "clientlogin": { "status": "PASS", "username": "Smile4ever" } } Successfully logged in as Smile4ever, STATUS is "PASS"
Script:
#!/usr/bin/env bash
#Needs curl USERNAME="Smile4ever" USERPASS="******" WIKIAPI="https://nl.wikipedia.org/w/api.php" cookie_jar="wikicj" #Will store file in wikifile
echo "UTF8 check: ☠" #################login echo "Logging into $WIKIAPI as $USERNAME..."
############### #Login part 1 #printf "%s" "Logging in (1/2)..." echo "Get login token..." CR=$(curl -S \ --location \ --retry 2 \ --retry-delay 5\ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "GET" "${WIKIAPI}?action=query&meta=tokens&type=login&format=json")
echo "$CR" | jq .
rm login.json echo "$CR" > login.json TOKEN=$(jq '.query.tokens.logintoken' login.json) #TOKEN="${TOKEN//"/}" #replace double quote by nothing
#Remove carriage return! #printf "%s" "$TOKEN" > token.txt #TOKEN=$(cat token.txt | sed 's/\r$//') #TOKEN="$(<token.txt)" #TOKEN="${TOKEN//+\/+}" #replace +\ by +
#echo -n $TOKEN > token.txt #TOKEN="${TOKEN//+\/%2b%5c}" #replace +\ by %2b%5c #TOKEN="33bf0c310b22a836be6b28905470d3a1589031da+\"
#TOKEN="24949330db743d9af74e7e56f2b523725890407b+\" if [ "$TOKEN" == "null" ]; then echo "Getting a login token failed." exit else echo "Login token is $TOKEN" echo "-----" fi
############### #Login part 2 echo "Logging in..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "username=${USERNAME}" \ --data-urlencode "password=${USERPASS}" \ --data-urlencode "rememberMe=1" \ --data-urlencode "logintoken=${TOKEN}" \ --data-urlencode "loginreturnurl=http://google.be" \ --request "POST" "${WIKIAPI}?action=clientlogin&format=json")
echo "$CR" | jq .
STATUS=$(echo $CR | jq '.clientlogin.status') if [[ $STATUS == *"PASS"* ]]; then echo "Successfully logged in as $USERNAME, STATUS is $STATUS." echo "-----" else echo "Unable to login, is logintoken ${TOKEN} correct?" exit fi
############### #Get edit token echo "Fetching edit token..." CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --request "POST" "${WIKIAPI}?action=query&meta=tokens&format=json")
echo "$CR" | jq . echo "$CR" > edittoken.json EDITTOKEN=$(jq '.query.tokens.csrftoken' edittoken.json) rm edittoken.json EDITTOKEN="${EDITTOKEN//"/}" #replace double quote by nothing #EDITTOKEN="${EDITTOKEN//+\/+}" #replace +\ by +
if [[ $EDITTOKEN == *"+\"* ]]; then echo "Edit token is: $EDITTOKEN" else echo "Edit token not set." exit fi
############### #Make a test edit #EDITTOKEN="d55014d69f1a8c821073bb6724aced7658904018+\" CR=$(curl -S \ --location \ --cookie $cookie_jar \ --cookie-jar $cookie_jar \ --user-agent "Curl Shell Script" \ --keepalive-time 60 \ --header "Accept-Language: en-us" \ --header "Connection: keep-alive" \ --compressed \ --data-urlencode "title=Gebruiker:Smile4ever/test4" \ --data-urlencode "appendtext={{nocat|2017|01|31}}" \ --data-urlencode "token=${EDITTOKEN}" \ --request "POST" "${WIKIAPI}?action=edit&format=json")
echo "$CR" | jq .
Kind regards, Geoffrey De Belie
Mediawiki-api mailing list Mediawiki-api@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-api
mediawiki-api@lists.wikimedia.org