Untitled
unknown
plain_text
2 years ago
12 kB
10
Indexable
import telebot
from telebot import types
from bs4 import BeautifulSoup
import requests
# Устанавливаем токен бота
bot = telebot.TeleBot('6744280328:AAHGjkemKCC6IWtSDaU64gNhmg6sxejuNaA')
user_data = {}
# URL-адрес страницы с курсами валют Тинькофф
tinkoff_url = "https://www.tinkoff.ru/invest/currencies/USDRUB/"
# Классы для элементов с курсами валют
buy_class = "Money-module__money_p_VHJ" # Класс для покупки доллара и евро
sell_class = "crod3t" # Класс для продажи доллара и евро
# Обработка команды /start
@bot.message_handler(commands=['start'])
def handle_start(message):
user = message.from_user
bot.send_message(message.chat.id, f"Привет, {user.first_name}! Я бот, который знакомит с банковскими услугами по ключевым словам. "
f"Чтобы узнать больше о курсах валют, используйте команду /exchange.")
# Обработка команды /exchange
@bot.message_handler(commands=['exchange'])
def handle_exchange(message):
markup = types.InlineKeyboardMarkup()
button_usd = types.InlineKeyboardButton("USD", callback_data="usd")
button_eur = types.InlineKeyboardButton("EUR", callback_data="eur")
markup.add(button_usd, button_eur)
bot.send_message(message.chat.id, "Я умею работать с курсами валют. Выберите валюту:", reply_markup=markup)
# Функция для парсинга страницы и получения курсов валют с сайта Тинькофф
def parse_tinkoff_currency_rates():
response = requests.get(tinkoff_url)
soup = BeautifulSoup(response.content, 'html.parser')
# Находим элементы на странице, содержащие информацию о курсах валют
buy_rate_element = soup.find("span", class_=buy_class)
if buy_rate_element :
buy_rate = float(buy_rate_element.text.strip().replace(',', '.'))
return buy_rate
else:
return None, None
# Обработка выбора валюты из клавиатуры /exchange
@bot.callback_query_handler(func=lambda call: call.data in ['usd', 'eur'])
def choose_currency(call):
currency = call.data
# Получаем курсы покупки и продажи валюты с сайта Тинькофф
buy_rate= parse_tinkoff_currency_rates()
# Отправляем результат пользователю
markup = types.InlineKeyboardMarkup()
button_calculator = types.InlineKeyboardButton("Калькулятор валют", callback_data="calculator")
button_start = types.InlineKeyboardButton("В начало", callback_data="start")
markup.add(button_calculator, button_start)
message_text = f"Курсы валют в банке Тинькофф:\n\nПокупка {currency}: {buy_rate}"
bot.send_message(call.message.chat.id, message_text, reply_markup=markup)
# Функция для отправки информации о услуге
def send_service_info(chat_id, service_name, service_info):
if not service_info:
return
markup = types.InlineKeyboardMarkup()
button = types.InlineKeyboardButton("Перейти на сайт", url=service_info['url'])
markup.add(button)
bot.send_message(
chat_id,
f"{service_name}:\n{service_info['description']}",
reply_markup=markup
)
@bot.callback_query_handler(func=lambda call: call.data in ['calculator', 'start'])
def choose_action(call):
action = call.data
if action == "calculator":
handle_calculator(call)
elif action == "start":
handle_start(call.message)
@bot.callback_query_handler(func=lambda call: call.data == 'calculator')
def handle_calculator(call):
markup = types.InlineKeyboardMarkup()
button_buy = types.InlineKeyboardButton("Купить", callback_data="buy")
button_sell = types.InlineKeyboardButton("Продать", callback_data="sell")
button_start = types.InlineKeyboardButton("В начало", callback_data="start")
markup.add(button_buy, button_sell)
markup.add(button_start)
bot.send_message(call.message.chat.id, "Выберите операцию:", reply_markup=markup)
@bot.callback_query_handler(func=lambda call: call.data in ['buy', 'sell'])
def handle_currency_operation(call):
currency_operation = call.data
user_id = call.message.chat.id
user_data_entry = user_data.get(user_id, {})
user_data_entry["currency_operation"] = currency_operation
user_data[user_id] = user_data_entry
currencies_markup = types.InlineKeyboardMarkup()
button_usd = types.InlineKeyboardButton("USD", callback_data="USD")
button_eur = types.InlineKeyboardButton("EUR", callback_data="EUR")
currencies_markup.add(button_usd, button_eur)
bot.send_message(user_id, "Выберите валюту:", reply_markup=currencies_markup)
@bot.callback_query_handler(func=lambda call: call.data in ['USD', 'EUR'])
def handle_currency_selection(call):
currency = call.data
user_id = call.message.chat.id
user_data_entry = user_data.get(user_id, {})
user_data_entry["currency"] = currency
user_data[user_id] = user_data_entry
bot.send_message(user_id, "Введите сумму в выбранной валюте (например, 100):")
@bot.message_handler(func=lambda message: message.text.isdigit())
def handle_amount_input(message):
user_id = message.chat.id
amount = float(message.text)
user_data_entry = user_data.get(user_id, None)
if user_data_entry:
currency_operation = user_data_entry.get("currency_operation")
currency = user_data_entry.get("currency")
if currency_operation and currency:
buy_rate, sell_rate = parse_tinkoff_currency_rates()
if buy_rate and sell_rate:
if currency_operation == "buy":
result_rub = amount * buy_rate
else:
result_rub = amount * sell_rate
bot.send_message(
user_id,
f"Сумма в рублях: {result_rub:.2f} RUB\n\n"
f"Сравнение:\n"
f"При {currency_operation} {amount} {currency}, вы потратите:\n"
f"USD: {amount * buy_rate:.2f} RUB\n"
f"EUR: {amount * sell_rate:.2f} RUB"
)
else:
bot.send_message(user_id, "Не удалось получить курсы валют.")
else:
bot.send_message(user_id, "Ошибка. Пожалуйста, начните сначала.")
else:
bot.send_message(user_id, "Ошибка. Пожалуйста, начните сначала.")
# Обработка текстовых сообщений
@bot.message_handler(func=lambda message: True)
def handle_text(message):
print(f"Received message: {message.text}")
# Перечень ключевых слов для каждой услуги
keywords = {
"Кредиты": ["кредит", "займ", "кредитная карта", "потребительский кредит", "кредит наличными"],
"Депозиты": ["депозит", "вклад", "вклады с высокими процентами", "сберегательный счет", "долгосрочный депозит"],
"Ипотека": ["ипотека", "жилье", "недвижимость", "ипотечное кредитование", "ипотечный калькулятор"],
"Кредитные карты": ["кредитная карта", "пластиковая карта", "кредитный лимит", "карта с кэшбэком", "бесконтактная карта"],
"Вклады": ["вклад", "депозит", "вклад с капитализацией процентов", "краткосрочный вклад", "вклад на пенсию"],
}
# Поиск ключевых слов в тексте сообщения
found_services = []
for service, service_keywords in keywords.items():
if any(keyword.lower() in message.text.lower() for keyword in service_keywords):
found_services.append(service)
# Если найдены ключевые слова, отправляем информацию о найденных услугах
if found_services:
for service_name in found_services:
service_info = get_service_info(service_name)
send_service_info(message.chat.id, service_name, service_info)
def get_service_info(service_name):
services_info = {
"Кредиты":{ "description": "Кредит — это финансовые обязательства двух сторон, одна из которых предоставляет наличные или другие ресурсы, а вторая обещает вернуть их согласно принципам срочности, платности и возвратности.","url": "https://www.tinkoff.ru/credits/"},
"Депозиты":{ "description": "Депозит — один из способов получения прибыли от размещения в банке финансовых активов.","url": "https://www.tinkoff.ru/deposits/"},
"Ипотека":{ "description": "Ипотека — это залог недвижимости. То есть ипотечный кредит означает, что вы берете у банка деньги под процент (кредит), а гарантией того, что вы вернете эти деньги, становится залог вашего недвижимого имущества: дома, квартиры, земельного участка. Ипотеку обычно воспринимают как кредит на приобретение жилья.","url": "https://www.tinkoff.ru/mortgage/"},
"Кредитные карты":{ "description": "Кредитная карта — это пластиковый носитель, позволяющий распоряжаться средствами на кредитном счете держателя.","url": "https://www.tinkoff.ru/credit-cards/"},
"Вклады":{ "description": "Вклад () — сумма средств, которую банк принимает от клиента на определенный или неопределенный срок. Согласно Гражданскому кодексу, обязуется возвратить сумму вклада и выплатить проценты на нее на условиях и в порядке, предусмотренных договором.","url": "https://www.tinkoff.ru/deposits/"},
}
return services_info.get(service_name, {})
# Функция для отправки информации о услуге
def send_service_info(chat_id, service_name, service_info):
if not service_info:
return
markup = types.InlineKeyboardMarkup()
button = types.InlineKeyboardButton("Перейти на сайт", url=service_info['url'])
markup.add(button)
bot.send_message(
chat_id,
f"{service_name}:\n{service_info['description']}",
reply_markup=markup
)
# Запуск бота
bot.polling(none_stop=True)Editor is loading...
Leave a Comment