Esempio n. 1
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={})
    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
Esempio n. 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
Esempio n. 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''
Esempio n. 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)
            
            
Esempio n. 6
0
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:
Esempio n. 7
0
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
Esempio n. 8
0
    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: