User:SchlurcherBot/commonsapiaddclaimsoauth
Jump to navigation
Jump to search
#!/usr/bin/python3
# Script: commonsapiaddclaimsoauth
#
# Description:
#
# Contacts the Commons API and adds Claim statements to a File
#
# Arguments:
#
# i id - File media ID
# v value - Data to add
# o optional - Edit summary
#
# Imports:
#
# Requests
# Requests_oauthlib
# Argparse
# Sys
#
# Returns:
#
# Will create an edit on Wikimedia Commons
#
# Exit:
#
# 0 - Success
# 1 - General error
#
# Examples:
#
# > python3 commonsapiaddclaimsoauth.py -i M47060293 -o ': date copyright license author' -v '{"claims":[{"mainsnak":{"snaktype":"value","property":"P571","datavalue":{"value":{"time":"+2016-02-12T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"}},"type":"statement","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P7482","datavalue":{"value":{"entity-type":"item","numeric-id":66458942,"id":"Q66458942"},"type":"wikibase-entityid"}},"type":"statement","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P6216","datavalue":{"value":{"entity-type":"item","numeric-id":50423863,"id":"Q50423863"},"type":"wikibase-entityid"}},"type":"statement","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P275","datavalue":{"value":{"entity-type":"item","numeric-id":18199165,"id":"Q18199165"},"type":"wikibase-entityid"}},"type":"statement","rank":"normal"},{"mainsnak":{"snaktype":"somevalue","property":"P170"},"type":"statement","qualifiers":{"P3831":[{"snaktype":"value","property":"P3831","datavalue":{"value":{"entity-type":"item","numeric-id":33231,"id":"Q33231"},"type":"wikibase-entityid"}}],"P2093":[{"snaktype":"value","property":"P2093","datavalue":{"value":"MartinVeselka","type":"string"}}],"P4174":[{"snaktype":"value","property":"P4174","datavalue":{"value":"MartinVeselka","type":"string"}}],"P2699":[{"snaktype":"value","property":"P2699","datavalue":{"value":"http://commons.wikimedia.org/wiki/User:MartinVeselka","type":"string"}}]},"rank":"normal"}]}'
import requests
from requests_oauthlib import OAuth1
import argparse
import sys
# Step 0: Parse the arguments and select API URL
parser = argparse.ArgumentParser(description='Contacts the Commons API and adds a Claim statements to a File.')
parser.add_argument('-i','--id', type=str, help='File media ID', required=True)
parser.add_argument('-v','--value', type=str, help='Data to add', required=True)
parser.add_argument('-o','--optional', type=str, default='', help='Edit summary')
args = parser.parse_args()
S = requests.Session()
URL = "https://commons.wikimedia.org/w/api.php"
print ("ID: %s" % args.id )
print ("Value: %s" % args.value )
print ("Optional: %s" % args.optional )
print ("")
# Step 1: Login details from OAuth (consumer_key, consumer_secret, access_token, access_secret)
# m:Special:OAuthConsumerRegistration/propose (using an owner-only consumers)
auth = OAuth1('WWWWWWWWWWW', 'XXXXXXXXXX', 'YYYYYYYYYY', 'ZZZZZZZZZZ')
# Step 2: GET request to fetch CSRF token
print ("Fetch CSRF token")
PARAMS_2 = {
"action": "query",
"meta": "tokens",
"format": "json",
"maxlag" : "2",
"assert" : "user"
}
R = S.get(url=URL, params=PARAMS_2, auth=auth)
DATA = R.json()
if 'error' in DATA:
print (R.text)
sys.exit(1)
CSRF_TOKEN = DATA['query']['tokens']['csrftoken']
print ("Edit a page")
# Step 3: POST request to edit a page
PARAMS_3 = {
"action": "wbeditentity",
"summary" : args.optional,
"token" : CSRF_TOKEN,
"format" : "json",
"id" : args.id,
"data": args.value,
"maxlag" : "2",
"assert" : "user"
}
R = S.post(URL, data=PARAMS_3, auth=auth)
DATA = R.json()
if 'error' in DATA:
print(R.text)
sys.exit(1)
print ("Purge file")
# Step 4: Purge file
PARAMS_4 = {
"action" : "purge",
"pageids" : args.id[1:],
"format" : "json",
"forcelinkupdate" : "",
"maxlag" : "2",
"assert" : "user"
}
R = S.post(URL, data=PARAMS_4, auth=auth)
DATA = R.json()
if 'error' in DATA:
print(R.text)
sys.exit(1)
print ("Done.")
sys.exit(0)