stockbot-buyvm/stockbot-buyvm.py

102 lines
2.8 KiB
Python
Raw Normal View History

2023-12-02 19:49:46 +00:00
"""buyvm stock checker"""
2024-09-15 22:31:30 +00:00
import json
import asyncio
2023-12-02 20:33:07 +00:00
import requests
2023-12-02 19:49:46 +00:00
from bs4 import BeautifulSoup
2023-12-02 21:37:52 +00:00
from loguru import logger
2024-09-15 22:31:30 +00:00
from matrix import MatrixBot
2023-12-02 20:33:07 +00:00
BASE_URL = 'https://my.frantech.ca/'
URLS = [
'https://my.frantech.ca/cart.php?gid=37', # Las Vegas
'https://my.frantech.ca/cart.php?gid=38', # New York
'https://my.frantech.ca/cart.php?gid=48', # Miami
'https://my.frantech.ca/cart.php?gid=39', # Luxembourg
]
def get_url(url):
try:
response = requests.get(url)
response.raise_for_status()
except requests.RequestException as e:
2023-12-02 21:37:52 +00:00
logger.error(f'error fetching {url}: {str(e)}')
2023-12-02 20:33:07 +00:00
return None
return response.text
2023-12-02 19:49:46 +00:00
def get_packages(html):
soup = BeautifulSoup(html, 'html.parser')
packages = []
package_elements = soup.find_all('div', class_='package')
for package_element in package_elements:
package = {}
package_name = package_element.find('h3', class_='package-name').text.strip()
package['name'] = package_name
package_quantity = package_element.find('div', class_='package-qty').text.strip()
package['qty'] = int(package_quantity.split()[0])
2023-12-02 19:49:46 +00:00
order_button = package_element.find('a', class_='btn-primary')
if order_button:
order_url = order_button['href']
2023-12-02 20:33:07 +00:00
package['url'] = BASE_URL + order_url
2023-12-02 19:49:46 +00:00
else:
package['url'] = ''
packages.append(package)
return packages
2024-09-15 22:31:30 +00:00
def load_config(filename):
with open(filename) as f:
return json.load(f)
async def main():
2023-12-02 21:37:52 +00:00
logger.info('checking buyvm stocks')
2024-09-15 22:31:30 +00:00
config = load_config('config.json')
bot = MatrixBot(config['matrix'])
memory_filter = config.get('memory', [512, 1, 2, 4]) # Defaults to price <= $15.00
2023-12-02 20:33:07 +00:00
for url in URLS:
html = get_url(url)
if not html:
continue
2023-12-02 20:33:07 +00:00
packages = get_packages(html)
for package in packages:
2024-09-15 22:31:30 +00:00
qty = package['qty']
memory = int(package['name'].split()[-1][:-2])
if qty > 0 and (memory in memory_filter):
2023-12-02 21:37:52 +00:00
logger.info(f"{package['name']}: {package['qty']} in stock")
2024-09-15 22:31:30 +00:00
await bot.send_message(f"🚨 {package['name']}: {package['qty']} in stock 🚨\n{package['url']}")
await bot.close()
def main_with_shutdown():
loop = asyncio.get_event_loop()
main_task = loop.create_task(main())
try:
loop.run_until_complete(main_task)
except asyncio.CancelledError:
logger.info("Main task has been cancelled.")
finally:
pending_tasks = [t for t in asyncio.all_tasks(loop) if not t.done()]
if pending_tasks:
loop.run_until_complete(asyncio.gather(*pending_tasks, return_exceptions=True))
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
2023-12-02 19:49:46 +00:00
if __name__ == '__main__':
2024-09-15 22:31:30 +00:00
main_with_shutdown()