ponyriders / django-amazon-price-monitor Goto Github PK
View Code? Open in Web Editor NEWMonitors prices of Amazon products via Product Advertising API
License: Other
Monitors prices of Amazon products via Product Advertising API
License: Other
We'll need a REST-API for the Frontend (as we'll cut it into a separate project) and for Third-Party-Apps.
Things, that the API should be able to do:
Additionally check, to which terms third-party apps should stick to (usage restrictions of Amazon product API).
If there isn't a subscription for a product, don't sync it. Just wastes the API calls that are limited.
We do not currently remove the price instances, even if nobody subscribed to the product. In general prices could be deleted if no subscription is available. Even products that are not activly monitored shall be removed.
Having older prices would be nice, but is not relevant. If the last subscription was two months ago and somebody subscribes now, there would be a gap of 2 months in the price history. Furthermore the user is only interested in the price history since he added it.
...as this does not synchronize a single product but multiple.
The release cycle of python-amazon-simple-product-api is unclear, within the github repo you cannot find out what is contained in which release - also there is no release log.
We used python-amazon-simple-product-api at the beginning because it was easy to use and provided a lot of values we needed (and a lot we do not need). The python-amazon-simple-product-api would not cover the requirements for ticket #19 but bottlenose provides the relevant information.
I'd like to strip down our models to only the fields we need and query the Amazon API with only these values. Therefore using bottlenose is the tool of choice as it is a dumb and simple wrapper around the Amazon Product Advertising API and nothing more.
Update the whole thing to run with Django 1.6 and current Celery.
Add celery to prerequisites in documentation.
If a subscription is updated and the target price has changed, reset the price fetch interval and directly fetch the price of the product to have the least actual price.
If you use override_settings (https://docs.djangoproject.com/en/1.4/topics/testing/#overriding-settings) in tests they do not work when accessing values via price_monitor.app_settings.
Product Advertising API:
(n) You will not store or cache Product Advertising Content consisting of an image, but you may store a link to Product Advertising Content consisting of an image for up to 24 hours. You may store other Product Advertising Content that does not consist of images for caching purposes for up to 24 hours, but if you do so you must immediately thereafter refresh and re-display the Product Advertising Content by making a call to the Product Advertising API or retrieving a new Data Feed and refreshing the Product Advertising Content on your application immediately thereafter. Unless otherwise notified by us, you may store individual Amazon Standard Identification Numbers (ASINs) for an indefinite period until the termination of this Licence Agreement. Notwithstanding the foregoing, if your application includes a client application, the client application may not store or cache Product Advertising Content. Upon our request you will, within three business days of our request, furnish us with a copy of any client application that includes or uses Product Advertising Content for the purpose of verifying your compliance with this Licence Agreement.
(o) You will include a date/time stamp adjacent to your display of pricing or availability information on your application if you obtain Product Advertising Content from a Data Feed, or if you call the Product Advertising API or refresh the Product Advertising Content displayed on your application less frequently than hourly. However, during the same day on which you requested and refreshed the pricing and availability information displayed on your application, you may omit the date portion of the stamp. Examples of acceptable messaging include:
[insert name of Amazon Site] Price: EUR/POUND 32.77 (as of 01/07/2012 14:11 [insert time zone] - Details)
[insert name of Amazon Site] Price: EUR/POUND 32.77 (as of 14:11 [insert time zone] - More info)
Additionally, you must either include the following disclaimer adjacent to the pricing or availability information or provide it via a hyperlink, popup box, scripted popup, or other similar method: "Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product." In the above examples, "Details" and "More info" would provide a method for the end user to read the disclaimer.
(q) If you display Product Advertising Content consisting of text on your application, you will include the following disclaimer in plain view to end users of your application: "CERTAIN CONTENT THAT APPEARS [IN THIS APPLICATION or ON THIS SITE, as applicable] COMES FROM AMAZON EU S.à r.l. THIS CONTENT IS PROVIDED 'AS IS' AND IS SUBJECT TO CHANGE OR REMOVAL AT ANY TIME."
We may modify any of the terms and conditions contained in this Licence Agreement at any time and in our sole discretion by, at least 7 days prior to the effective date of the modification, posting a change notice or revised agreement on an Amazon Site. Modifications may include, for example, changes to the usage requirements. You may during that 7-day period, as your sole recourse, notify us in writing of your objections to the modifications and, if you do so, your account will automatically terminate on the effective date of the modification to which you objected. We recommend that you frequently review this Licence Agreement for any modifications that may be applicable to you.
IF ANY MODIFICATION IS UNACCEPTABLE TO YOU, YOUR ONLY RECOURSE IS TO TERMINATE THIS LICENCE AGREEMENT IN WRITING. YOUR CONTINUED USAGE OF THE PRODUCT ADVERTISING API, DATA FEED, OR PRODUCT ADVERTISING CONTENT FOLLOWING THE EFFECTIVE DATE OF THE MODIFICATION WILL CONSTITUTE YOUR BINDING ACCEPTANCE OF THE CHANGE.
Currently the product infos are fetched when the periodic celery task is triggered. It would be better to trigger it for a newly created product directly after the creation of it.
If a product is not available, there is no price created upon the task run. Somehow we should mark the product as currently not available.
Sample product: http://www.amazon.de/gp/product/B003Y3VWGQ/
We have a funny endless queue phenomenom here: the sync all products task runs every 5 minutes. A taskrun queries 10 products and if there are more products, the task will be run again after 10 seconds. If there are more than 300 products to sync, the periodic task will run before the actual sync run is done. This stacks up a pile of queues.
Currently, there is only a dummy test and nothing more...
Would be nice to see X products that are closest to the set price limit.
Please do so ;-)
Currently you can add x subscriptions for the same product (and email notification).
With the subscription remove fix in e392107 this will throw an error in the frontend.
Generally one should only be able to create a subscription for a product and notification email once, this is currently not secured.
...and if you have more than 150 they probably won't be synced.
Add the possibility to tag products and show the products tagged with a specific tag.
Currently it only informs about the subscribed prices and you have to delete the subscription manually. There should be additionally a history with which one can see whcih products he already purchased and a hint when adding a subscription with a product already owned. Therefore the functionality to mark a subscribed product as bought is also needed.
Taking this further, we could also add a kind of "Movies I own" archive at once with functionality to add products one already owns.
That's just an idea, I have to think about it more deeply.
While synching:
Unable to parse 2015-02 to a datetime
[2014-05-18 10:38:11,300: ERROR/Worker-1] Unable to communicate with Amazon, an unknown error occurred.
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 102, in lookup
"Amazon Product Lookup Error: '{0}', '{1}'".format(code, msg))
amazon.api.LookupException: Amazon Product Lookup Error: 'AWS.ExceededMaximumParameterValues', 'Your request contains too many values for ItemId. This parameter can have a maximum of 10 values.'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
lookup = get_api().lookup(ItemId=asin)
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 96, in lookup
response = self.api.ItemLookup(ResponseGroup=ResponseGroup, **kwargs)
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 241, in __call__
{'api_url': api_url, 'cache_url': cache_url})
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 202, in _call_api
return urllib2.urlopen(api_request, timeout=self.Timeout)
File "/usr/local/lib/python3.3/urllib/request.py", line 156, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.3/urllib/request.py", line 475, in open
response = meth(req, response)
File "/usr/local/lib/python3.3/urllib/request.py", line 587, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/local/lib/python3.3/urllib/request.py", line 513, in error
return self._call_chain(*args)
File "/usr/local/lib/python3.3/urllib/request.py", line 447, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.3/urllib/request.py", line 595, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable
[2014-05-18 10:38:11,389: ERROR/Worker-1] Unable to communicate with Amazon, an unknown error occurred.
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 102, in lookup
"Amazon Product Lookup Error: '{0}', '{1}'".format(code, msg))
amazon.api.LookupException: Amazon Product Lookup Error: 'AWS.ExceededMaximumParameterValues', 'Your request contains too many values for ItemId. This parameter can have a maximum of 10 values.'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
lookup = get_api().lookup(ItemId=asin)
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 96, in lookup
response = self.api.ItemLookup(ResponseGroup=ResponseGroup, **kwargs)
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 241, in __call__
{'api_url': api_url, 'cache_url': cache_url})
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 202, in _call_api
return urllib2.urlopen(api_request, timeout=self.Timeout)
File "/usr/local/lib/python3.3/urllib/request.py", line 156, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.3/urllib/request.py", line 475, in open
response = meth(req, response)
File "/usr/local/lib/python3.3/urllib/request.py", line 587, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/local/lib/python3.3/urllib/request.py", line 513, in error
return self._call_chain(*args)
File "/usr/local/lib/python3.3/urllib/request.py", line 447, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.3/urllib/request.py", line 595, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable
If I delete a product subscription within the angular list view, the request is sent to the server, the subscription is deleted but it is still listed within the list view, even after paginating.
Currently we stick to 1.6, check and update to 1.8
In Germany the movies are rated by FSK and all titles having FSK 18 have additional postage (5€). So when your FSK 18 product hits the price limit you still have to add the postage. Therefore it would be great to filter all subscriptions by the FSK value to see other FSK 18 titles and then be able to deceide if you buy some of the others too to save postage.
Currently I've no idea how this applies to other countries and their postages fees. Have to check what the API offers for that.
That deletes the subscription and then takes you to the referral link.
ASINs should be unique.
We have to handle products that do not have ASINs (like books). They have ISBN-10 and/or ISBN-13 that probably map to ASIN.
Additionally we should not only store the title of the product but also the interpret (for music, books, etc.)
AFAIK the graph shows all prices the product has. If the product is there for a very long time, then there is a huge amount of data to be loaded and displayed. We should think about limiting this graph to a certain time slice (e.g. the last month) and add the option to change the displayed time slice.
Add highest and lowest price and their date. Maybe a graph.
Would be nice to see the highest and lowest price for a product ever.
For some products, the graphs are empty, but not with the "No data" string. Maybe this is caused by the changes in #14.
I once added a product that is not available on Amazon any more. The system tries to update its price, then the exception below occurs. As the user has a subscription for the product, mark both product and subscription as invalid and display an error? If there are no more subscriptions for an invalid product, delete it.
Syncing 1 products. No more products to sync there.
unable to lookup product with asin B00GK7MFXC
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 105, in lookup
etree.tostring(root, pretty_print=True)))
amazon.api.AsinNotFound: ASIN(s) not found: 'b'<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">\n <OperationRequest>\n <HTTPHeaders>\n <Header Name="UserAgent" Value="Python-urllib/3.3"/>\n </HTTPHeaders>\n <RequestId>8f0799d1-1090-4878-a343-824373b349e9</RequestId>\n <Arguments>\n <Argument Name="Operation" Value="ItemLookup"/>\n <Argument Name="Service" Value="AWSECommerceService"/>\n <Argument Name="Signature" Value="EugbExkwNGTAPDowj5u5VrtejIENWdvoKe6JqCaxsvM="/>\n <Argument Name="AssociateTag" Value="zoevc-21"/>\n <Argument Name="Version" Value="2011-08-01"/>\n <Argument Name="ItemId" Value="B00GK7MFXC"/>\n <Argument Name="AWSAccessKeyId" Value="AKIAIFSTEZFTTSS6HAFA"/>\n <Argument Name="Timestamp" Value="2014-06-10T15:44:06Z"/>\n <Argument Name="ResponseGroup" Value="Large"/>\n </Arguments>\n <RequestProcessingTime>0.0189840000000000</RequestProcessingTime>\n </OperationRequest>\n <Items>\n <Request>\n <IsValid>True</IsValid>\n <ItemLookupRequest>\n <IdType>ASIN</IdType>\n <ItemId>B00GK7MFXC</ItemId>\n <ResponseGroup>Large</ResponseGroup>\n <VariationPage>All</VariationPage>\n </ItemLookupRequest>\n <Errors>\n <Error>\n <Code>AWS.InvalidParameterValue</Code>\n <Message>B00GK7MFXC is not a valid value for ItemId. Please change this value and retry your request.</Message>\n </Error>\n </Errors>\n </Request>\n </Items>\n</ItemLookupResponse>\n''
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
lookup = get_api().lookup(ItemId=asin)
File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 105, in lookup
etree.tostring(root, pretty_print=True)))
amazon.api.AsinNotFound: ASIN(s) not found: 'b'<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">\n <OperationRequest>\n <HTTPHeaders>\n <Header Name="UserAgent" Value="Python-urllib/3.3"/>\n </HTTPHeaders>\n <RequestId>aa1994fa-552a-4623-b448-1d15bca6e57e</RequestId>\n <Arguments>\n <Argument Name="Operation" Value="ItemLookup"/>\n <Argument Name="Service" Value="AWSECommerceService"/>\n <Argument Name="Signature" Value="EugbExkwNGTAPDowj5u5VrtejIENWdvoKe6JqCaxsvM="/>\n <Argument Name="AssociateTag" Value="zoevc-21"/>\n <Argument Name="Version" Value="2011-08-01"/>\n <Argument Name="ItemId" Value="B00GK7MFXC"/>\n <Argument Name="AWSAccessKeyId" Value="AKIAIFSTEZFTTSS6HAFA"/>\n <Argument Name="Timestamp" Value="2014-06-10T15:44:06Z"/>\n <Argument Name="ResponseGroup" Value="Large"/>\n </Arguments>\n <RequestProcessingTime>0.0218340000000000</RequestProcessingTime>\n </OperationRequest>\n <Items>\n <Request>\n <IsValid>True</IsValid>\n <ItemLookupRequest>\n <IdType>ASIN</IdType>\n <ItemId>B00GK7MFXC</ItemId>\n <ResponseGroup>Large</ResponseGroup>\n <VariationPage>All</VariationPage>\n </ItemLookupRequest>\n <Errors>\n <Error>\n <Code>AWS.InvalidParameterValue</Code>\n <Message>B00GK7MFXC is not a valid value for ItemId. Please change this value and retry your request.</Message>\n </Error>\n </Errors>\n </Request>\n </Items>\n</ItemLookupResponse>\n''
If the price limit hit the email to the subscribers is sent and then again after 7 days if the price is still under the limit. (the 7 days are a setting)
We should instead inform the subscriber about future price reductions as they happen and if they hit a certain price deviation (maybe at least 50 cent difference to the last price).
If you have an album called "The Title" of the artist "The Artist" the notification mail just says
The price limit of 10.00 EUR has been reached for the article "The Title" - the current price is 9.21 EUR.
So there is the artist missing that should be displayed, too.
Sometimes the FindProductsToSynchronizeTask is not rescheduled. It's currently unclear, why this happens, there are no outputs in the logs indicating an error or something else. The last product is synchronized (at least the synchronization is started) and then there is emptyness.
Products created via Angular and normal view are not synced immediately after creation.
The syncronization is trigger via a post_save signal handler. This handler triggers SynchronizeSingleProductTask wih the ASIN of the new created product.
It is a very common problem, that the post_save signal handler also runs inside the transaction, that creates the product at the end, so the task is triggered just before the product is actually is created in the database.
Otherwise there will be mixed contents warnings within the browser.
Because the tests fail with the most current beautifulsoup4, the package was pinned.
We should fix this in code and unpin.
./home/travis/virtualenv/python3.3.5/lib/python3.3/site-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
https://travis-ci.org/ponyriders/django-amazon-price-monitor/jobs/69645569
Currently angular-django-rest-resource is bundled into the project. If possible, we should remove this and add it as requirement only.
Sometimes one would like to see his oldest subscriptions.
If there is e.g. a movie, one might want to monitor the prices for the DVD as well as the BluRay version without having to monitor 2 separate products. This would be really nifty but it would also change the approach that everything is based on an ASIN which then will not be the case.
Have to check, what the best structure would be here. Also keep in mind that we probably will provide an API to fetch prices or product related information for authorized webapps.
Currently all time information displayed is UTC, but it should be the timezone of the user.
Currently we create a single HTTP request for each product. Following the API guide of Amazon, we can query up to 10 products in a single HHTP query: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/PerformingMultipleItemLookupsinOneRequest.html
Therefor we have to adjust the parsing functionality to fetch multiple products instead of one and slightly adjust the query.
Currently e.g. the renotification interval is a global setting. Specify the settings the user can set for himself and implement.
We do not need that anymore.
The mail content of subscriptions is currently created from 2 settings variables and some variable replacements.
This should really be a template to allow customization.
If there is a product which price hasn't changed for the timespan being displayed in the graph, then the graph is empty. It should instead draw a single line at the price value.
The price values for this item are:
{
"count": 50,
"next": null,
"previous": null,
"results": [
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T07:52:30.393212Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T08:52:31.259789Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T08:52:33.132879Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T09:52:33.567063Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T09:52:35.363439Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T10:52:35.661678Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T10:52:37.299173Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T11:52:38.346373Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T11:52:39.193436Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T12:52:39.664503Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T12:52:41.064781Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T13:52:41.684590Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T13:52:43.171169Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T14:52:43.634879Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T14:52:44.730469Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T15:52:45.965490Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T15:52:47.219004Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T16:52:47.937923Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T16:52:49.817696Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T17:52:50.132232Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T17:52:51.369144Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T18:52:52.455237Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T18:52:55.142894Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T19:52:56.469450Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T19:52:57.625116Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T20:52:58.359876Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T20:53:00.234466Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T21:53:01.268994Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T21:53:02.945412Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T22:53:03.644877Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T22:53:05.088830Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T23:53:05.544245Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-16T23:53:07.489745Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T00:53:08.060176Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T00:53:09.025517Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T01:53:09.893997Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T01:53:10.946594Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T02:53:11.470668Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T02:53:12.444995Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T03:53:12.828628Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T03:53:14.277582Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T04:53:14.838663Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T04:53:16.163076Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T05:53:16.436199Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T05:53:18.281304Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T06:53:18.635791Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T06:53:20.417171Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T07:53:21.001458Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T07:53:22.791741Z"
},
{
"value": 14.99,
"currency": "EUR",
"date_seen": "2015-06-17T08:53:23.510070Z"
}
]
}
It would be nice (like all the other suggested enhancements) to have a kind of interest or monitoring list for products. One should be able to add search terms (not an ASIN!) and then be informed via email if there is found something new.
Why? A little example: I bought Continuum (the series) season 1 in German as bluray on Amazon (Region 2). Continuum season 2 was not broadcasted in Germany, but in the UK which is also region 2. So I bought season 2 as UK import. Now I want season 3, but currently the only season 3 search hit is an US import (Region 1) which I cannot play on my region 2 bluray player. Additionally, I don't know when and if season 3 is released in UK, so I have to search for it periodically on Amazon by hand. For my use case there are plenty of other products I want to monitor in this way.
I've not thought deeper about implementation, but sending an email with the results (one email for all search terms that have updated) and a listing on the platform itself with the ability to directly add a product to the price monitor, should be the minimum.
[2015-08-17 20:20:41,161: ERROR/Worker-1] Chord 'f43bb10c-bffd-40d2-be25-2a79cd052691' raised: 'Dependency 061b0871-0fc5-43a4-9719-934ca8f286cc raised AttributeError("\'NoneType\' object has no attribute \'url\'",)'
Traceback (most recent call last):
File "/somewhere/lib/python3/site-packages/celery/backends/base.py", line 565, in on_chord_part_return
ret = j(timeout=3.0, propagate=propagate)
File "/somewhere/lib/python3/site-packages/celery/result.py", line 691, in join_native
raise value
AttributeError: 'NoneType' object has no attribute 'url'
[2015-08-17 20:20:41,166: ERROR/MainProcess] Task price_monitor.product_advertising_api.tasks.SynchronizeSingleProductTask[061b0871-0fc5-43a4-9719-934ca8f286cc] raised unexpected: AttributeError("'NoneType' object has no attribute 'url'",)
Traceback (most recent call last):
File "/somewhere/lib/python3/site-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/somewhere/lib/python3/site-packages/celery/app/trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
File "/somewhere/django-amazon-price-monitor/price_monitor/product_advertising_api/tasks.py", line 165, in run
for asin, amazon_data in ProductAdvertisingAPI().item_lookup(item_ids=list(products.keys())).items():
File "/somewhere/django-amazon-price-monitor/price_monitor/product_advertising_api/api.py", line 139, in item_lookup
'large_image_url': item_node.largeimage.url.string,
AttributeError: 'NoneType' object has no attribute 'url'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.