User:SchlurcherBot/commonsapiaddclaimsoauth

From Wikimedia Commons, the free media repository
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)