diff --git a/docker-compose.yml b/docker-compose.yml index 7aa113c..a8b58fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,5 +13,7 @@ services: - TELEGRAM_TOKEN=${TELEGRAM_TOKEN} - SLEEP_TIME=${SLEEP_TIME} - TELEGRAM_GROUP_ID=${TELEGRAM_GROUP_ID} + - MODEL_3_GROUP_ID=${MODEL_3_GROUP_ID} + - MODEL_Y_GROUP_ID=${MODEL_Y_GROUP_ID} dns: - 8.8.8.8 \ No newline at end of file diff --git a/inventtesla/constants.py b/inventtesla/constants.py index 1a01232..4276b24 100644 --- a/inventtesla/constants.py +++ b/inventtesla/constants.py @@ -3,6 +3,24 @@ import os TELEGRAM_ESCAPE_CHARACTERS = ['_', '*', '[', ']', '(', ')', '~', '>', '+', '-', '=', '|', '{', '}', '.', '!'] TELEGRAM_REMOVE_CHARACTERS = ['#'] TELEGRAM_GROUP_ID = os.getenv("TELEGRAM_GROUP_ID") +MODEL_3_GROUP_ID = os.getenv("MODEL_3_GROUP_ID") +MODEL_Y_GROUP_ID = os.getenv("MODEL_Y_GROUP_ID") TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN") SLEEP_TIME = int(os.getenv("SLEEP_TIME")) -MODELS = ["m3", "my"] \ No newline at end of file +MODELS = ["m3", "my"] + +CHAT_IDS = {"m3": MODEL_3_GROUP_ID, + "my": MODEL_Y_GROUP_ID} + +MONTHS = {'January': 'enero', + 'February': 'febrero', + 'March': 'marzo', + 'April': 'abril', + 'May': 'mayo', + 'June': 'junio', + 'July': 'julio', + 'August': 'agosto', + 'September': 'septiembre', + 'October': 'octubre', + 'November': 'noviembre', + 'December': 'diciembre'} \ No newline at end of file diff --git a/inventtesla/helpers.py b/inventtesla/helpers.py index 8972fa7..36719b5 100644 --- a/inventtesla/helpers.py +++ b/inventtesla/helpers.py @@ -3,7 +3,9 @@ import requests import logging import constants import json +#import locale +from datetime import datetime from telegram.ext import Application from telegram.constants import ParseMode @@ -29,7 +31,22 @@ def telegram_escape_characters(text): def get_inventory(model="m3"): ret_json = False - headers = {'authority': 'www.tesla.com'} + #headers = {'authority': 'www.tesla.com'} + headers = { + 'authority': 'www.tesla.com', + 'accept': '*/*', + 'accept-language': 'en-US,en;q=0.9,es;q=0.8', + # 'cookie': 'ip_info={"ip":"79.154.216.12","location":{"latitude":28.1,"longitude":-15.4113},"region":{"longName":"Canary Islands","regionCode":"CN"},"city":"Las Palmas de Gran Canaria","country":"Spain","countryCode":"ES","postalCode":"35003"}; has_js=1; BIGipServer~DMZ_WWW_PRD~ORIGIN-DMZ-WWW-HTTP=!ZigEBW47EdewyoGd8dJnK9m9hdilyCUpRew4zyCnC1DWDlH4X3psLdtPL6wDwbJe58ZOkPzPOjddxw==; q_mail=lgray.foxl%40gmail.com; q_first_name=Joan; q_last_name=Cano; TeslaUser=%7B%22username%22%3A%22lgray.foxl%40gmail.com%22%2C%22email%22%3A%22lgray.foxl%40gmail.com%22%2C%22first_name%22%3A%22%22%2C%22last_name%22%3A%22%22%7D; oxpOriUrl=https%3A%2F%2Fwww.tesla.com%2Fes_es%2Fteslaaccount; _csrf=h9KC31yYX_w53xKDvtqxbPXd; iterableEndUserId=lgray.foxl%40gmail.com; q_mail=lgray.foxl%40gmail.com; q_first_name=Joan; q_last_name=Cano; _pk_id.1.3c49=c455bf03b76fc0eb.1685021236.; _abck=A4DF1A0C23E8EC90A8DD97FF4B8F7BFD~0~YAAQVdXdWL4EvL6JAQAAGsS7vwqsfX09zM4oSMmXoR7DKmbAt+uRcTMpRYw/QwGuBMCAvHePNw02knUgkvz38ZL9qQIxCSo6DjpQ9aUAG/fOSbATj6WsZcIw6Ltt8ayS+RKxaf0G0/4IIN4TfKokeW4QLVa2C8FZRJBIW9TSsVMYRTTAenPnO/xlQgYCoIGVVmFl3YDY1UaJ22rd1kWAqwdDPh97hu4vkkKg8kT2Qo/0VrT/oVGvzSoGfPwAEgGSdlTdMQcEa957sDqhyQPriRYqcGuyl3BDRKTAUv3hZE1jyvGAozclQoCeZA6tEby16W9yCluuiYGhsRer6iaBzk4CD1ovHh5n4o4Avj/oGDSTrSIIqNrMS4iVW29/zPo4i8VFVWDgXlS66Bz1JWSu3nLMp8l9fyw=~-1~||-1||~-1; ak_bmsc=FC9970F2D20FD1B2CB45D53628A3C000~000000000000000000000000000000~YAAQ321lX3S4SR+KAQAAWAXzIRSIXagxMslNKx6cMX3R9K3lY5kuKzASGKWf05BGHZIyB4pXQDB0P7u9C7XotlnlQMxHKgfwUevjuwj+qD44hoDr705ioFWYOJAaj6T2bL2oX+nF9N+3MW35WMKkRCKooYT3H+ovz/NMPXo6w72o2t/rX4r11Tv+JnyjT7DEVvKF6rNDywh3kvOJYqiDVD2oGoyS6xGpApfKLzuf7pWKSMnMz9HjdQCm/QqCqSb3lvCjj/5do1wfTb5QvDkGi40/nDLY6llHufuATMT6u1/Ad8cc5EgIXmW1JdQefoTwiiwHiOCHrbnDzt655wQ7ewRhfmyCBxGYaQ1LWRUmRqb0g3riKH86Q5ZspNRY0HfUYyOxWNEB/D7K; _pk_ref.1.3c49=%5B%22%22%2C%22%22%2C1692786691%2C%22https%3A%2F%2Fwww.google.com%2F%22%5D; _pk_ses.1.3c49=1; cua_sess=1765a8ac2341c78da7d8c57b3bb2fd7a; bm_mi=95CBC2038AB4706E13666EB9E9FAE657~YAAQ321lX8MCSx+KAQAAf0T1IRTaq3hnJQcl7cVYBRNOrsOUHxBfmn8AQ5cUNQtQhbjpbOCiiTBqR9RBQOEENTXPz968raeT0NKPC93Ii5o9O10WkBX4HuVSdG8UEhsKN6PnqMEsaosHTrM6XYEYH2S0xnOWPXwttnv1kBleDG71/XYykMOAKn/Mc/uthG7RzPgcuQKxl/xCLKzZTPonPmhGwUYO2cnwuq95AmH+WRUKcHNAnjbFhH3+Qr8yuKHetMhZqCdW1PCrHkiekgSUGF6wCDoOX05mSc886IB+LaMTzXQyO0ZsXarCepU10/xHLZGFcluqI3sN61524poQQ6dI~1; bm_sv=BBFFD0295B2555FE081C8E00B8A125F0~YAAQ321lX8MESx+KAQAAvUf1IRRU/qRFXARdEdc9bSIHbrqOMQBRpsHWzNs9eBnmCfELoByxU0yFb8FMIV/z1ZRlWQj8Lzh4XQA0cospNb67SUvbJjGwr2JQ/oNjeAVmN7SefYSi+Kw62O6u5vIPCvp160F5XKHXFs3tpg+EOyIN1BbtYSilorkoHWm4OTvoO5Rs/QLzqZDFSZkb/QC+YGmx9prO7COmoefVF/Dp+zsvlMERsZc2Zqs2i4ummhmS~1', + 'referer': 'https://www.tesla.com/es_ES/inventory/new/m3?arrangeby=plh&zip=08290&range=0', + 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', +} + url = f"https://www.tesla.com/inventory/api/v1/inventory-results?query=%7B%22query%22%3A%7B%22model%22%3A%22{model}%22%2C%22condition%22%3A%22new%22%2C%22options%22%3A%7B%7D%2C%22arrangeby%22%3A%22Price%22%2C%22order%22%3A%22asc%22%2C%22market%22%3A%22ES%22%2C%22language%22%3A%22es%22%2C%22super_region%22%3A%22north%20america%22%2C%22lng%22%3A2.1449%2C%22lat%22%3A41.4888%2C%22zip%22%3A%2208290%22%2C%22range%22%3A0%2C%22region%22%3A%22ES%22%7D%2C%22offset%22%3A0%2C%22count%22%3A50%2C%22outsideOffset%22%3A0%2C%22outsideSearch%22%3Afalse%7D" for _ in range(10): try: @@ -64,9 +81,9 @@ def check_inventory(new_inventory, old_inventory): return new_deals def send_deal(car, model): - application = Application.builder().get_updates_http_version('1.1').http_version('1.1').token(constants.TELEGRAM_TOKEN).build() + #application = Application.builder().get_updates_http_version('1.1').http_version('1.1').token(constants.TELEGRAM_TOKEN).build() title = telegram_escape_characters(car['TrimName']) - price = f"*💰 Precio:* {telegram_escape_characters(car['Price'])}€" + price = f"*💰 Precio de inventario:* {car['Price']}€\n*💰 Precio de compra:* {car['PurchasePrice']}€" odometer = f"*Cuentakilómetros:* {car['Odometer']}{car['OdometerType']}" options = "*Opciones:*" @@ -81,22 +98,55 @@ def send_deal(car, model): for callout in car['OptionCodeSpecs']['C_CALLOUTS']['options']: callouts = f"{callouts}\n• {telegram_escape_characters(callout['name'])}" - message = f"{title}\n\n{odometer}\n\n{options}\n\n{specs}\n\n{callouts}\n\n{price}" + if car['IsDemo']: + demo = "*Vehículo de demostración*" + else: + demo = "*Vehículo nuevo*" + + #locale.setlocale(locale.LC_TIME, 'es_ES') + + warranty_drive_unit_batt = car['WarrantyData']['WarrantyDriveUnitExpDate'] + date_warranty_drive_unit_batt = datetime.strptime(warranty_drive_unit_batt, '%Y-%m-%dT%H:%M:%SZ').strftime('%d de %B del %Y') + warranty_general = car['WarrantyData']['WarrantyVehicleExpDate'] + date_warranty_general = datetime.strptime(warranty_general, '%Y-%m-%dT%H:%M:%SZ').strftime('%d de %B del %Y') + + for month in constants.MONTHS: + date_warranty_drive_unit_batt = date_warranty_drive_unit_batt.replace(month, constants.MONTHS[month]) + date_warranty_general = date_warranty_general.replace(month, constants.MONTHS[month]) + + if 'enero del 1' in date_warranty_drive_unit_batt: + date_warranty_drive_unit_batt = 'Sin información' + date_warranty_general = date_warranty_drive_unit_batt + + warranty = f"*Garantía de la unidad de tracción y batería:* {date_warranty_drive_unit_batt}\n*Garantía general del vehículo:* {date_warranty_general}" + + message = f"{title}\n\n{odometer}\n{demo}\n\n{warranty}\n\n{options}\n\n{specs}\n\n{callouts}\n\n{price}" image = get_image(car['OptionCodeList'], model) + referral = "?referral=joan81838" + keyboard = {'inline_keyboard':[[{'text':'Ir a la web','url':f'https://www.tesla.com/es_ES/{model}/order/{car["VIN"]}'}]]} files = { + 'chat_id': (None, constants.CHAT_IDS[model]), + 'photo': (None, image), + 'caption': (None, message), + 'parse_mode': (None, ParseMode.MARKDOWN_V2), + 'reply_markup': (None, json.dumps(keyboard)), + } + + files_seguimientos = { 'chat_id': (None, constants.TELEGRAM_GROUP_ID), - 'photo': image, + 'photo': (None, image), 'caption': (None, message), 'parse_mode': (None, ParseMode.MARKDOWN_V2), 'reply_markup': (None, json.dumps(keyboard)), } response = requests.post(f'https://api.telegram.org/bot{constants.TELEGRAM_TOKEN}/sendPhoto', files=files) - logging.info(response) + requests.post(f'https://api.telegram.org/bot{constants.TELEGRAM_TOKEN}/sendPhoto', files=files_seguimientos) + logging.info(response.content) def send_message(telegram_user_id, message): files = {