def amz_call(self, call_params): AWS_ACCESS_KEY_ID = '1PKXRTEQQV19XXDW3ZG2' AWS_ASSOCIATE_TAG = 'whotookmybook-20' import time from boto.connection import AWSQueryConnection aws_conn = AWSQueryConnection( aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=Amz.AWS_SECRET_ACCESS_KEY, is_secure=False, host='ecs.amazonaws.com') aws_conn.SignatureVersion = '2' base_params = dict( Service='AWSECommerceService', Version='2008-08-19', SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=AWS_ACCESS_KEY_ID, AssociateTag=AWS_ASSOCIATE_TAG, Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())) #http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-expression params = dict(base_params, **call_params) verb = 'GET' path = '/onca/xml' qs, signature = aws_conn.get_signature(params, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) return aws_conn._mexe(verb, qs, None, headers={})
def method(self, operation, **kwargs): aws_conn = AWSQueryConnection( aws_access_key_id=self.aws_access_key_id, aws_secret_access_key=self.aws_secret_access_key, is_secure=False, host='ecs.amazonaws.com') aws_conn.SignatureVersion = '2' kwargs.update(dict( Service='AWSECommerceService', Version=Parser.version, SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=self.aws_access_key_id, AssociateTag=self.aws_associate_tag, Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()), Operation=operation, )) verb = 'GET' path = '/onca/xml' qs, signature = aws_conn.get_signature(kwargs, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) xml_response = StringIO(aws_conn._mexe(verb, qs, None, headers={ 'User-Agent': 'AWSECommerceClient.py', }).read()) try: return Parser.parse_file(xml_response) except: # Log the original response and the exception. log.error("Error parsing response:\n"+xml_response.getvalue()) raise
def get(keywords): aws_conn = AWSQueryConnection( aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY, is_secure=False, host="ecs.amazonaws.com") aws_conn.SignatureVersion = "2" params = dict( Service='AWSECommerceService', Version='2008-08-19', SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=ACCESS_KEY_ID, AssociateTag=ASSOCIATE_TAG, Operation="ItemSearch", SearchIndex="All", Keywords=keywords, ResponseGroup="ItemAttributes", Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()), ) verb = 'GET' path = "/onca/xml" qs, signature = aws_conn.get_signature(params, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) response = aws_conn._mexe(verb, qs, None, headers={}) content = response.read() tree = ET.fromstring(content) NS = tree.tag.split("}")[0][1:] res = [] for item in tree.find('{%s}Items' % NS).findall('{%s}Item' % NS): item_dic = {} attrs = item.find('{%s}ItemAttributes' % NS) if attrs is not None: isbn = attrs.find('{%s}ISBN' % NS) if isbn is not None: item_dic['ISBN'] = isbn.text title = attrs.find('{%s}Title' % NS) if title is not None: item_dic['Title'] = title.text author = attrs.find('{%s}Author' % NS) if author is not None: item_dic['Author'] = author.text if 'ISBN' in item_dic and 'Title' in item_dic: res.append(item_dic) return res
def get_ecs_response(params): """Call Amazon ECS with the given parameters and return the raw XML response""" try: aws_conn = AWSQueryConnection( aws_access_key_id=settings.AWS_ACCESS_KEY_ID, aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, is_secure=False, host='ecs.amazonaws.com', ) aws_conn.SignatureVersion = '2' base_params = dict( Service='AWSECommerceService', Version='2008-08-19', SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=settings.AWS_ACCESS_KEY_ID, AssociateTag=settings.AWS_ASSOCIATE_TAG, Operation='ItemSearch', IdType='ASIN', ResponseGroup='Small', Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) ) if params: base_params.update(params) verb = 'GET' path = '/onca/xml' qs, signature = aws_conn.get_signature(base_params, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) time.sleep(0.5) # throttle response = aws_conn._mexe(verb, qs, None, headers={}) resp = response.read() _log.debug("ECS Response: %s", resp) return resp except Exception, e: _log.debug("AWS ASIN call failed for params: %s", params) _log.debug(e) return u''
def create_amazon_book_by_asin(self, asin): AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID AWS_ASSOCIATE_TAG = settings.AWS_ASSOCIATE_TAG AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY search_index = 'Book' aws_conn = AWSQueryConnection( aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, is_secure=False, host='ecs.amazonaws.com') aws_conn.SignatureVersion = '2' params = dict( Service='AWSECommerceService', Version='2008-08-19', SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=AWS_ACCESS_KEY_ID, AssociateTag=AWS_ASSOCIATE_TAG, Operation='ItemLookup', ItemId=asin, ResponseGroup='ItemAttributes,Large, Images,Reviews', Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())) verb = 'GET' path = '/onca/xml' qs, signature = aws_conn.get_signature(params, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) #print "verb:", verb, "qs:", qs response = aws_conn._mexe(verb, qs, None, headers={}) returned_xml = self.raw_xml = myxml = str(response.read()) returned_xml = returned_xml.replace(" xmlns=\"http://webservices.amazon.com/AWSECommerceService/2008-08-19\"", '') doc = ElementTree.fromstring(returned_xml) try: self.title = doc.find('Items/Item/ItemAttributes/Title').text except: self.title = "" #self.author = doc.find('Items/Item/ItemAttributes/Author').text author_list = doc.findall('Items/Item/ItemAttributes/Author') for a in author_list: self.authors.append(a.text) try: self.edition = doc.find('Items/Item/ItemAttributes/Edition').text except: self.edition = "" try: self.list_price = doc.find('Items/Item/ItemAttributes/ListPrice/FormattedPrice').text except AttributeError: self.list_price = "" try: self.sale_price = doc.find('Items/Item/Offers/Offer/OfferListing/Price/FormattedPrice').text except AttributeError: self.sale_price = "" try: self.amount_saved = doc.find('Items/Item/Offers/Offer/OfferListing/AmountSaved/FormattedPrice').text except AttributeError: self.amount_saved = "" try: self.percentage_saved = doc.find('Items/Item/Offers/Offer/OfferListing/PercentageSaved').text except AttributeError: self.percentage_saved = "" try: self.ISBN = doc.find('Items/Item/ItemAttributes/ISBN').text except AttributeError: self.ISBN = "" try: self.ASIN = doc.find('Items/Item/ASIN').text except: self.ASIN = "" try: self.binding = doc.find('Items/Item/ItemAttributes/Binding').text except: self.binding = "" try: self.detail_url = doc.find('Items/Item/DetailPageURL').text except: self.detail_url = "" try: temp_date = doc.find('Items/Item/ItemAttributes/PublicationDate').text except: self.date = "" try: # convert to struct_time, then to datetime obj c = time.strptime(temp_date,"%Y-%m-%d") d = datetime.datetime(*c[:6]) self.publication_date = d except: self.publication_date = "" try: self.publisher = doc.find('Items/Item/ItemAttributes/Publisher').text # this should be a tag so it becomes a link to view more books by publisher except: self.publisher = "" try: self.pages = doc.find('Items/Item/ItemAttributes/NumberOfPages').text except AttributeError: self.page= "" try: self.lrg_image = doc.find('Items/Item/LargeImage/URL').text except AttributeError: self.lrg_img = "" try: self.med_image = doc.find('Items/Item/MediumImage/URL').text except AttributeError: self.med_image= "" try: self.tiny_image = doc.find('Items/Item/ImageSets/ImageSet/TinyImage/URL').text except AttributeError: self.tiny_image = "" editorials = doc.findall('Items/Item/EditorialReviews/EditorialReview') for reviews in editorials: if reviews.find('Source').text == "Product Description": self.description = reviews.find('Content').text else: ed = AmazonEditorial() ed.source = reviews.find('Source').text ed.content = reviews.find('Content').text self.editorial_reviews.append(ed) creators = doc.findall('Items/Item/ItemAttributes/Creator') for creator in creators: cr = AmazonBookCreator() cr.name = creator.text cr.role = creator.attrib['Role'] self.creators.append(cr)
aws_conn.SignatureVersion = '2' params = dict(Service='AWSECommerceService', Version='2008-08-19', SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=AWS_ACCESS_KEY_ID, AssociateTag=AWS_ASSOCIATE_TAG, Operation='ItemSearch', IdType='ASIN', SearchIndex='MP3Downloads', Sort='-releasedate', Keywords='"Will Dailey"', ResponseGroup='ItemIds', Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())) verb = 'GET' path = '/onca/xml' qs, signature = aws_conn.get_signature(params, verb, path) qs = path + '?' + qs + '&Signature=' + urllib.quote(signature) # print "verb:", verb, "qs:", qs print "http://ecs.amazonaws.com" + qs # response = aws_conn._mexe(verb, qs, None, headers={}) # print response.read() # --------------------------- # XML # --------------------------- import xml.etree.ElementTree as ET tree = ET.parse(f) ns = "http://webservices.amazon.com/AWSECommerceService/2008-08-19" asins = tree.findall("{%(ns)s}Items/{%s}Item/{%s}ASIN" % {'ns': ns}) if asins:
class AmazonUnbox: def __init__(self, key, secret): self.XML_NS = 'http://webservices.amazon.com/AWSECommerceService/2009-03-31' self.AMAZON_PROXY_URL = "http://atv-sr.amazon.com/proxy/proxy" self.NS = {'ns': self.XML_NS} self.KEY = key self.SECRET = secret self._conn = AWSQueryConnection( aws_access_key_id=self.KEY, aws_secret_access_key=self.SECRET, is_secure=False, host='ecs.amazonaws.com') self.__cache = {} self._conn.SignatureVersion = '2' def _internal_proxy_request(self,params): html = HTTP.Request(self.AMAZON_PROXY_URL,values=params,errors='replace') jsonString = html.split("\n")[2] return JSON.ObjectFromString(jsonString) def _request_xml(self,params): params['Timestamp'] = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) params['AWSAccessKeyId'] = self.KEY params['Version']='2009-03-31' params['AssociateTag'] = ASSOC_TAG qs, signature = self._conn.get_signature(params, 'POST', '/onca/xml') params['Signature'] = signature return XML.ElementFromURL("http://ecs.amazonaws.com/onca/xml",values=params,errors='replace') def itemDetail(self,asin,cache=True): k = 'itemDetail_%s' % asin ret = self.__cache.get(k) if not ret: params = { 'c': '', 'token': '', 'f': 'getASINList', 't': 'Streaming', 'asinList': asin } try: ret = self._internal_proxy_request(params)[0] self.__cache[k] = ret except: ret = {} return ret def item(self,asin,cache=True): return self.items([ asin ], max=1, cache=cache)[0] def items(self,asinList, max=0, purchased=False, cache=True): items = [] for maxTenList in self._lists_of_n(asinList,10): uncachedAsins = [] # check cache first for asin in maxTenList: k = 'asin_%s' % asin i = self.__cache.get(k) if i and cache: i['purchased_hint'] = purchased items.append(i) else: uncachedAsins.append(asin) if len(uncachedAsins) > 0: params = { 'Service': 'AWSECommerceService', 'Operation': 'ItemLookup', 'ItemId': ','.join(uncachedAsins), 'ResponseGroup': 'RelatedItems,Large,OfferFull,PromotionDetails,AlternateVersions', 'RelationshipType': 'Episode,Season' } xml = self._request_xml(params) for e in xml.xpath('//ns:Items/ns:Item', namespaces=self.NS): i = self._parse_item_el(e) k = 'asin_%s' % i['asin'] self.__cache[k] = i i['purchased_hint'] = purchased items.append( i ) if max > 0 and len(items) >= max: return items[0:max] else: return items def browseNodes(self,root='16261641'): params = { 'Service': 'AWSECommerceService', 'Operation': 'BrowseNodeLookup', 'ResponseGroup': 'BrowseNodeInfo', 'BrowseNodeId': root } xml = self._request_xml(params) items = [] for e in xml.xpath('//ns:Children/ns:BrowseNode', namespaces=self.NS): id = e.xpath('ns:BrowseNodeId/text()', namespaces=self.NS)[0] name = e.xpath('ns:Name/text()', namespaces=self.NS)[0] items.append( { 'id': id, 'name': name } ) return items def itemSearch(self,query='', opts={}): if query != '': opts['Keywords'] = query params = { 'Service': 'AWSECommerceService', 'Operation': 'ItemSearch', 'SearchIndex': 'UnboxVideo', 'ResponseGroup': 'RelatedItems,Large,OfferFull,PromotionDetails,AlternateVersions', 'RelationshipType': 'Episode,Season', } params.update(opts) xml = self._request_xml(params) items = [] for e in xml.xpath('//ns:Items/ns:Item', namespaces=self.NS): item = self._parse_item_el(e) items.append( item ) if len(items) == 0: PMS.Log( XML.StringFromElement(xml) ) return items def parentize(self,items): newItems = [] item_count = len(items) iter = 0 foundAsins = [] parent_purchased_hint = {} while item_count > 0: iter = iter + 1 parents_found = [] parentAsins = [] for i in items: if i['parent'] == '' and i['asin'] not in foundAsins: newItems.append(i) foundAsins.append(i['asin']) elif i['parent'] not in parents_found: if i.get('purchased_hint',False): parent_purchased_hint[i['parent']] = True parents_found.append(i['parent']) parentAsins.append( i['parent'] ) if len(parentAsins) > 0: items = [] for i in self.items(parentAsins): if i['asin'] in parent_purchased_hint: i['purchased_hint'] = True items.append(i) else: items = [] item_count = len(items) return newItems def geoCheck(self,customerId=''): params = { 't': 'Streaming', 'c': customerId, 'f': 'geoCheck' } return self._internal_proxy_request(params) def registerProductClick(self,asin): try: item = self.item(asin) x = HTTP.Request(item['detail_url'], errors='replace') return True except: pass return False def doPurchase(self,customerId,asinList): PMS.Log("purchasing") if len(asinList) == 0: PMS.Log("no ASINs found - fail") return None if not customerId or customerId == '': PMS.Log("no customerId found - fail") return None first_asin = asinList[0] PURCHASE_HANDLER = 'http://www.amazon.com/gp/video/order/handle-buy-box.html' params = { 't': 'atv', 'ref.atv.clientid': '00000000-0000-0000-000000000000', 'o_cust': customerId, 'o_cust_os': 'Macintosh', 'itemCount': len(asinList), 'retJSON': 'true', 'o_asin': first_asin, } count = 0 for asin in asinList: params['ASIN.%d' % count] = asin count = count + 1 PMS.Log(params) try: jsonStr = HTTP.Request(PURCHASE_HANDLER,values=params,errors='replace') PMS.Log(jsonStr) jsonObj = JSON.ObjectFromString(jsonStr) PMS.Log(jsonObj) if jsonObj['success'] == 'true': self.clearCache() return jsonObj['orderID'] except Exception, e: PMS.Log(e) return None pass
Service="AWSECommerceService", Version="2008-08-19", SignatureVersion=aws_conn.SignatureVersion, AWSAccessKeyId=AWS_ACCESS_KEY_ID, AssociateTag=AWS_ASSOCIATE_TAG, Operation="ItemSearch", IdType="ASIN", SearchIndex="MP3Downloads", Sort="-releasedate", Keywords='"Will Dailey"', ResponseGroup="ItemIds", Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()), ) verb = "GET" path = "/onca/xml" qs, signature = aws_conn.get_signature(params, verb, path) qs = path + "?" + qs + "&Signature=" + urllib.quote(signature) # print "verb:", verb, "qs:", qs print "http://ecs.amazonaws.com" + qs # response = aws_conn._mexe(verb, qs, None, headers={}) # print response.read() # --------------------------- # XML # --------------------------- import xml.etree.ElementTree as ET tree = ET.parse(f) ns = "http://webservices.amazon.com/AWSECommerceService/2008-08-19" asins = tree.findall("{%(ns)s}Items/{%s}Item/{%s}ASIN" % {"ns": ns}) if asins: