-
-
Save nyov/5116258 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
from rauth.service import OAuth1Service | |
# Create consumer key & secret in your Magento Admin interface | |
# For an API Guideline see: | |
# http://www.magentocommerce.com/api/rest/authentication/oauth_authentication.html | |
# | |
# Short Magento setup explanation: | |
# 1. Magento Admin > System > Web Services > REST - OAuth Consumers: | |
# Add a new consumer for this script [maybe the OAuth1Service(name='') value] | |
# (This creates the consumer_key and consumer_secret token for you) | |
# 2. Possibly enable rewriting rules for the /api url in the Magento .htaccess | |
# 3. Magento Admin > System > Web Services > REST - Roles: | |
# Give the Customer account some access to stuff (using the customer authorize_url below) | |
# or create an Admin account for write access (using the admin authorize_url below) | |
# Give the Guest account some access for some basic functionality testing without authorization. | |
# 4. Magento Admin > System > Web Services > REST - Attributes: | |
# Configure ACL attributes access for the role/account configured in 3rd | |
# - The customer must have a (frontend) account to login to and authorize the script. | |
# - For any created Admin roles in 3rd, the role needs to be mapped to an admin user: | |
# 5. Magento Admin > System > Permissions > Users: | |
# Edit an admin user and under 'REST Role', tick the created Admin REST Role to map it to that account. | |
# This admin will get the authorize_url to authorize your script access in the browser. | |
MAGENTO_HOST = 'http://127.0.0.1' | |
MAGENTO_API_BASE = '%s/api/rest/' % MAGENTO_HOST | |
magento = OAuth1Service( | |
name = 'magento', | |
consumer_key = 'vygdq11yzaectqwbpn1h4zwlamsrpomi', | |
consumer_secret = '5x5idvqc8rh4vc8lrxeg4hvple0u63dt', | |
request_token_url = '%s/oauth/initiate' % MAGENTO_HOST, | |
access_token_url = '%s/oauth/token' % MAGENTO_HOST, | |
# Customer authorization | |
#authorize_url = '%s/oauth/authorize' % MAGENTO_HOST, | |
# Admin authorize url depending on admin url | |
authorize_url = '%s/admin/oauth_authorize' % MAGENTO_HOST, | |
base_url = MAGENTO_API_BASE | |
) | |
# get request token | |
request_token, request_token_secret = magento.get_request_token(method='POST', params={'oauth_callback': 'oob'}) | |
# authorize us | |
authorize_url = magento.get_authorize_url(request_token) | |
print 'Visit this URL in your browser: ' + authorize_url | |
code = raw_input('Paste Code from browser: ') | |
session = magento.get_auth_session(request_token, | |
request_token_secret, | |
method='POST', | |
data={'oauth_verifier': code}) | |
headers = {'Accept': 'application/json'} | |
r = session.get('products', headers=headers) | |
articles = r.json() | |
for i, product in articles.items(): | |
id = product['sku'].encode('utf-8') | |
text = product['description'].encode('utf-8') | |
print '{0}. ArtNr: {1} - {2}'.format(i, id, text) | |
session.close() |
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
from rauth.service import OAuth1Service | |
import json | |
from urlparse import urljoin | |
# Create consumer key & secret in your Magento Admin interface | |
# For an API Guideline see: | |
# http://www.magentocommerce.com/api/rest/authentication/oauth_authentication.html | |
# | |
# Short Magento setup explanation: | |
# 1. Magento Admin > System > Web Services > REST - OAuth Consumers: | |
# Add a new consumer for this script [maybe the OAuth1Service(name='') value] | |
# (This creates the consumer_key and consumer_secret token for you) | |
# 2. Possibly enable rewriting rules for the /api url in the Magento .htaccess | |
# 3. Magento Admin > System > Web Services > REST - Roles: | |
# Give the Customer account some access to stuff (using the customer authorize_url below) | |
# or create an Admin account for write access (using the admin authorize_url below) | |
# Give the Guest account some access for some basic functionality testing without authorization. | |
# 4. Magento Admin > System > Web Services > REST - Attributes: | |
# Configure ACL attributes access for the role/account configured in 3rd | |
# - The customer must have a (frontend) account to login to and authorize the script. | |
# - For any created Admin roles in 3rd, the role needs to be mapped to an admin user: | |
# 5. Magento Admin > System > Permissions > Users: | |
# Edit an admin user and under 'REST Role', tick the created Admin REST Role to map it to that account. | |
# This admin will get the authorize_url to authorize your script access in the browser. | |
MAGENTO_HOST = 'http://127.0.0.1' | |
MAGENTO_API_BASE = '%s/api/rest/' % MAGENTO_HOST | |
magento = OAuth1Service( | |
name = 'magento', | |
consumer_key = 'vygdq11yzaectqwbpn1h4zwlamsrpomi', | |
consumer_secret = '5x5idvqc8rh4vc8lrxeg4hvple0u63dt', | |
request_token_url = '%s/oauth/initiate' % MAGENTO_HOST, | |
access_token_url = '%s/oauth/token' % MAGENTO_HOST, | |
# Customer authorization | |
#authorize_url = '%s/oauth/authorize' % MAGENTO_HOST, | |
# Admin authorize url depending on admin url | |
authorize_url = '%s/admin/oauth_authorize' % MAGENTO_HOST, | |
base_url = MAGENTO_API_BASE | |
) | |
""" | |
# get request token | |
request_token, request_token_secret = magento.get_request_token(method='POST', params={'oauth_callback': 'oob'}) | |
print 'Our request token is: ' + request_token | |
print ' token secret is: ' + request_token_secret | |
# authorize us | |
authorize_url = magento.get_authorize_url(request_token) | |
print 'Visit this URL in your browser: ' + authorize_url | |
code = raw_input('Paste Code from browser: ') | |
#session = magento.get_auth_session(request_token, request_token_secret, method='POST', data=params) | |
#session = magento.get_auth_session(request_token, request_token_secret, method='GET', params=params) | |
# -- get access token | |
access_token, access_token_secret = magento.get_access_token(request_token=request_token, | |
request_token_secret=request_token_secret, | |
method='POST', | |
data={'oauth_verifier': code}) | |
print 'Our access token is: ' + access_token | |
print ' token secret is: ' + access_token_secret | |
""" | |
access_token = '<save access_token here for reuse>' | |
access_token_secret = '<save access_token here for reuse>' | |
tok = access_token, access_token_secret | |
session = magento.get_session(token=tok, signature=None) | |
## example GET request | |
headers = {'Accept': 'application/json'} | |
#headers = {'Accept': 'application/xml'} | |
r = session.get( | |
'products', | |
#'products/1/categories', | |
#'customers', | |
#'stockitems', | |
#'products?filter[1][attribute]=entity_id&filter[1][gt]=4' | |
headers=headers, | |
#header_auth=True, | |
) | |
print r.request.headers | |
print r.json() | |
## example POST request | |
headers = {'Content-Type': 'application/json', 'Accept': 'application/json'} | |
# - create a product | |
product = """{ | |
"type_id": "simple", | |
"attribute_set_id": "4", | |
"sku": "TestArticle1", | |
"name": "Test Article 70mm² M12", | |
"price": "3.5200", | |
"description": "This Product has the bare minimum required attributes to get inserted", | |
"short_description": "Test Article 70mm² M12", | |
"weight": "0.0000", | |
"status": "1", | |
"visibility": "4", | |
"tax_class_id": "2" | |
}""" | |
payload = json.loads(product) | |
r = session.post( | |
'products', | |
header_auth=True, | |
headers=headers, | |
data=json.dumps(payload), | |
) | |
# see if we have errors | |
if r.status_code != 200: | |
print 'Error!' | |
print r.text | |
quit() | |
else: | |
# catch the returned Location redirect to the new product | |
article_url = urljoin(MAGENTO_API_BASE, r.headers['location']) | |
print 'New product inserted as: %s' % (article_url) | |
# - assign new product to a category (so it will be visible in frontend) | |
# FIX THIS TO A CATEGORY ID WHICH EXISTS AND IS NOT ROOT | |
payload = json.dumps({'category_id': '2'}) | |
r = session.post( | |
article_url + '/categories', | |
header_auth=True, | |
headers=headers, | |
data=payload, | |
) | |
# see if we have errors | |
if r.status_code != 200: | |
print 'Error!' | |
print r.text | |
quit() | |
else: | |
article_url = urljoin(MAGENTO_API_BASE, r.headers['location']) | |
print 'Success! Product added to category: %s' % (article_url) | |
print r.request.headers | |
session.close() |
Awesome, thanks for sharing
Hello I get this error:
Traceback (most recent call last): File "magento_cli.py", line 44, in <module> request_token, request_token_secret = magento.get_request_token(method='POST', params={'oauth_callback': 'oob'}) File "/home/antonio/.local/lib/python2.7/site-packages/rauth/service.py", line 244, in get_request_token process_token_request(r, decoder, key_token, key_token_secret) File "/home/antonio/.local/lib/python2.7/site-packages/rauth/service.py", line 20, in process_token_request data = decoder(r.content) File "/home/antonio/.local/lib/python2.7/site-packages/rauth/utils.py", line 33, in parse_utf8_qsl v = v.decode('utf-8') File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 597: invalid continuation byte
It seems that I have problem with the utf-8.
Hi guys, sorry I don't get notifies on gist comments, unless you @mention me.
Late comment: A 400
error probably meant the API wasn't enabled or credentials were wrong.
@blob84, your magento apparently returned some data that couldn't be decoded using utf-8
.
I don't know why this happens, if the API is enabled I think that should happen.
Note this was built for the Magento 1 API.
Hi,
Thank you for sharing good source. I have changed your source to create product like following.
headers = {'Accept': 'application/json',}
product = """{
"attribute_set_id":"4",
"type_id":"simple",
"sku":"wedding dress",
"name":"Dress_test",
"meta_title":"dress",
"meta_description":"a wedding dress",
"price":"2000.0000",
"weight":"0.5000",
"status":"1",
"visibility":"4",
"enable_googlecheckout":"1",
"tax_class_id":"1",
"description":"dress",
"meta_keyword":"dress, wedding"
}"""
payload = json.loads(product)
r = session.post(
'products',
header_auth=True,
headers=headers,
data=json.dumps(payload),
)
see if we have errors
if r.status_code != 200:
print 'Error!'
print r.text
quit()
else:
# catch the returned Location redirect to the new product
article_url = ''#urljoin(MAGENTO_API_BASE, r.headers['location'])
print 'New product inserted as: %s' % (article_url)
But I have 400 Error.
Would you like to help me to resolve this issue?