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
Exemple #2
0
    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={})
Exemple #3
0
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
Exemple #4
0
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''
Exemple #5
0
    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)