As I sit here, anxious for the new AMD Vega 64 to be released, I decide to keep myself busy writing some Python code….designed to text me as soon as a new “rx vega 64” search term showed up on Amazon (I have the patience of a child on Christmas Eve, so sue me.)
When writing code, I try to be as lazy efficient as possible. That means I look for other’s to do the hard part for me. Other people might phrase it more kindly like “don’t reinvent the wheel,” but let’s be real, you are receiving benefit for no cost. So next time a project saves your bacon, consider sending a little cash or cryptocoin to the dev(s). Or throw your hat into the open source community and provide dev work yourself, it’s a great way to learn a lot more about the coding community and gain a lot of experience along the way while still giving back.
Back to the Vega 64 stock tracking tool. It would totally be possible to do that all with the Python internals; using urllib
and re
to download and find stuff on the page, then using email
to send a message to my phone’s SMS; but that would take forever, and is honestly stupid to do. There are much better tools for that at this point, like requests
and BeautifulSoup
, then using some gmail or other common email provider library.
But as Amazon is a rather big website with an API available, there are Python libraries for that API. There are also different ways to easily send a text message to yourself via online services, like twilo. In the end, I created the script using Python 3.6 on Windows (should be cross-platform compatible), and the libraries I used for this were:
python-amazon-simple-product-api twilio reusables python-box
If you are interested in using this as well (comes as-is, no promises it works or won’t bite you) before using the script you will need to get AWS access keys and sign up for twilio, then fill in the appropriate variables at the top of the script.
from datetime import datetime from time import sleep from amazon.api import AmazonAPI from twilio.rest import Client from box import Box, BoxList from reusables import setup_logger amazon_access_key = "XXXXXXXXXXXXXXXXXXXX" amazon_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" amazon_associate_tag = "codecalamity-20" twilio_from = "+" # Twilio phone number twilio_to = "+" # Phone number to text twilio_key = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" twilio_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" search_product_keywords = "rx vega 64" search_product_name_includes = "vega" search_product_brand = "amd" search_index = 'Electronics' search_region = 'US' log = setup_logger("vega") def update(search, saved_data): new_prods = BoxList() for x in (product for product in search if search_product_name_includes in product.title.lower() and (search_product_brand in product.brand.lower() or search_product_brand in product.manufacturer.lower())): if x.title not in saved_data: data = Box({"price": float(x.price_and_currency[0]), "url": x.detail_page_url, "updated": datetime.now().isoformat()}) log.info(f"New item: {x.title} - {data}") new_prods.append((x.title, data)) saved_data[x.title] = data saved_data.to_json(filename="products.json") return new_prods def format_message(new_prods): product_list = [f"{prod[0]}-{prod[1].price}-{prod[1].url}" for prod in new_prods] return f"New Prods: {', '.join(product_list)}" def send_message(client, message): log.info(f"About to send message: '{message}'") client.messages.create(to=twilio_to, from_=twilio_from, body=message) def main(): amazon = AmazonAPI(amazon_access_key, amazon_secret, amazon_associate_tag) # Only search the first two pages to not spam the server products = amazon.search_n(2, Keywords=search_product_keywords, SearchIndex=search_index, region=search_region) twilio_client = Client(twilio_key, twilio_secret) try: prods = Box.from_json(filename="products.json") except FileNotFoundError: prods = Box() while True: new_prods = update(products, prods) if new_prods: message = format_message(new_prods) send_message(twilio_client, message) sleep(60) if __name__ == '__main__': main()
So now that possibly huge pure python standard library multifaceted application has turned into fifty lines of code (not counting imports / globals) designed to do nothing but feed my anxiety as efficiently as possible. Luckily it’s self testing to make sure it works, as it will find the result for the Vega Frontier Edition first, so if you chose to use it, make sure you get that text.
2017-08-07 22:09:23,938 - vega INFO About to send message: 'New Prods: Radeon Vega Frontier Edition Liquid Retail-1579.48- https://www.amazon.com/Radeon-Vega-Frontier-Liquid-Retail/dp/B072XLR2K7?SubscriptionId=AKIAIF3WXFESZ53UZKDQ&tag=codecalamity-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B072XLR2K7'
Be warned that this may spam your phone a lot when the product does drop, and that the code doesn’t have a lot of safety checks as-is so may fail and stop reporting. It also doesn’t check if it is available to buy yet, just that the product page for the Vega 64 exists.
If you don’t want to have your own script constantly running, try out sites like nowinstock.net, as they have great options to text or email you when products are available.