Реализация уведомлений в telegram-боте на python
Всем добрый день! Пишу Telegram-бота на python c использованием библиотеки telebot, однако не удается реализовать функцию уведомлений, прошу помощи в этом вопросе. Я так понимаю, что нужно зациклить функцию notification_job в main. Тем не менее я не понимаю как правильно это сделать. Time.sleep() не подходит, а модуль schedule выводит в бесконечный цикл. Подскажите пожалуйста как это можно реализовать.
import telebot
from telebot import types
import requests
import json
import datetime
import pytz
import time
import requests
import apiinfo
import sqlite3
from collections import defaultdict
import schedule
from threading import Timer
time1 = int(time.time()) #взял время текущее
TOKEN = '1070701499:AAHJH6wiCiN9BUj4MqnzpM6L46OXReF9fGs'
TIMEZONE = 'Europe/Kiev'
CURRENT_TIMEZONE = 'Kiev'
A_TIMEZONE = pytz.timezone(TIMEZONE)
'''база данных'''
conn = sqlite3.connect('Test.db')
cursor = conn.cursor()
cursor.execute("""CREATE TABLE IF NOT EXISTS Btcbot ('name', 'price', 'date', 'time')""")
conn.commit()
#cursor.execute("""INSERT INTO Btcbot VALUES ('Ethereum', '0', 'date', 'time')""")
#conn.commit()
#sql = "DELETE FROM Btcbot WHERE name = 'Bitcoin'"
#cursor.execute(sql)
#conn.commit()
'''клавиатуры'''
keyboard_1 = telebot.types.ReplyKeyboardMarkup(True, True)
keyboard_1.row('BTC info', 'ETH info', 'XRP info')
'''Установленные команды'''
COMMANDS = ['/start', '/help', '/add']
'''Класс бота'''
class Bothandler:
def __init__(self, TOKEN):
print('я создан')
self.token = TOKEN
self.api_url = "https://api.telegram.org/bot{}/".format(TOKEN)
def get_updates(self, offset=None, timeout=110): #offset - сдвиг просмотренного
method = 'getUpdates'
params = {'timeout': timeout, 'offset': offset}
resp = requests.get(self.api_url + method, params)
result_json = resp.json()['result']
return result_json
def send_message(self, chat_id, text, reply_markup=None):
params = {'chat_id': chat_id, 'text': text, 'reply_markup': reply_markup}
method = 'sendMessage'
resp = requests.post(self.api_url + method, params)
return resp
def get_last_update(self):
get_result = self.get_updates()
if len(get_result) > 0:
last_update = get_result[-1]
else:
last_update = get_result[len(get_result)]
return last_update
crypto_bot = Bothandler(TOKEN)
now = datetime.datetime.now()
def main():
new_offset = None
while True:
print(time.time())
if int(time.time()) - 60 == time1:
minute()
else:
crypto_bot.get_updates(new_offset)
last_update = crypto_bot.get_last_update()
last_update_id = last_update['update_id']
last_chat_text = last_update['message']['text']
last_chat_id = last_update['message']['chat']['id']
last_chat_name = last_update['message']['chat']['first_name']
'''команды'''
if last_chat_text.lower() == COMMANDS[0]:
crypto_bot.send_message(last_chat_id, 'Здравствуйте, {}'.format(last_chat_name) + '!\n' \
'Я могу показать Вам цены криптовалют, а также могу следить за ценой биткоина \n' +
'Для просмотра инструкции пользователя нажмите /help.')
if last_chat_text.lower() == COMMANDS[1]:
crypto_bot.send_message(last_chat_id, 'Итак, в настоящий момент бот имеет такие функции: \n' +
'1) Вы можете узнать текущую цену криптовалют нажав команду /exchange и выбрав интересующую вас криптовалюту\n'+
'2) Вы можете задать два порога цен(верхний и нижний) с помощью команды /add и бот будет отслеживать поведение'+
'конкретной криптовалюты (пока что биткоина) и сигнализировать об этом')
if last_chat_text.lower() == 'btc info':
crypto_bot.send_message(last_chat_id, 'Загружаю актуальную информацию......')
res = last_chat_text[:3]
print(res)
price_usd = apiinfo.get_btc()
crypto_bot.send_message(last_chat_id,
'? BITCOIN INFO ?\n'+
'? Информация с биржи ?Binance?\n'+
'Пара ?BTC-USDT? ?\n'+
'?' + price_usd +'\n')
apiinfo.write_btc_to_db(price_usd)
if last_chat_text.lower() == 'eth info':
crypto_bot.send_message(last_chat_id, 'Загружаю актуальную информацию......')
res = last_chat_text[:3]
print(res)
price_usd = apiinfo.get_eth()
crypto_bot.send_message(last_chat_id,
'? ETHEREUM INFO ?\n'+
'? Информация с биржи ?Binance?\n'+
'Пара ?ETH-USDT? ?\n'+
'?' + price_usd +'\n')
apiinfo.write_eth_to_db(price_usd)
'''словарь для запоминания верхней и нижней границы'''
NOTIFICATION_DATA = [9900, 9600]
'''процедура добавления напоминаний'''
def notification_job():
print('yes')
high = NOTIFICATION_DATA[0]
low = NOTIFICATION_DATA[1]
current = float(apiinfo.get_btc())
if current >= high:
crypto_bot.send_message(last_chat_id, 'ЕСЛИ БОЛЬШЕ ВЕРХНЕЙ ТОЧКИ')
if current <= low:
crypto_bot.send_message(last_chat_id, 'ЕСЛИ МЕНЬШЕ НИЖНЕЙ ТОЧКИ')
new_offset = last_update_id + 1
def minute():
schedule.run_pending()
time.sleep(1)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
exit()