Не работает блок кода на сервере

Рейтинг: 0Ответов: 0Опубликовано: 15.02.2023

Не работает тг бот на сервере, на локалке все отлично работает Думал что проблема с бд или временем, поэтому попробовал скрипт из sms2 добавить в sms1 по команде, но все равно она не исполняется. При этом функция start отрабатывает нормально и в бд вносит изменения. Я только начал работать с серверами и не понимаю в чем возможна проблема.

Не всегда, но иногда выдает такую ошибку

RuntimeWarning: Enable tracemalloc to get the object allocation traceback Run time of job "sms2 (trigger: cron[hour='15', minute='24'], next run at: 2023-02-16 15:24:00 +03)" was missed by 0:05:05.893473

import asyncio
from aiogram import Bot, Dispatcher, types, executor
from db import Datebase
from config import BOT_TOKEN, API_KEY
from apscheduler.schedulers.asyncio import AsyncIOScheduler

import requests 
import datetime
from bs4 import BeautifulSoup
import lxml
import random

bot = Bot(BOT_TOKEN)
dp = Dispatcher(bot)

db = Datebase('database.db')

@dp.message_handler(commands=['start'])
async def start(msg: types.Message) -> None:
    if msg.chat.type == 'private':
        if not db.user_exists(msg.from_user.id):
            db.add_user(msg.from_user.id)
        await msg.answer('Добро пожаловать!')

@dp.message_handler(commands=['info'])
async def sms1(msg: types.Message) -> None:
    try:        
        URL= f'https://api.openweathermap.org/data/2.5/weather?lat=53.9&lon=27.5667&appid={API_KEY}&units=metric&lang=ru'
        headers = {
                'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41',
            }
        r = requests.get(url=URL, headers=headers)
        data = r.json()

        city = data['name']
        cur_weath = round(float(data['main']['temp']))
        feel_weth = round(float(data['main']['feels_like']))
        humidity = data['main']['humidity']
        wind = data['wind']['speed']
        description = data['weather'][0]['description']
        sunrise = datetime.datetime.fromtimestamp(data['sys']['sunrise']).strftime('%H:%M')
        sunset = datetime.datetime.fromtimestamp(data['sys']['sunset']).strftime('%H:%M')

        rub = requests.get('https://www.nbrb.by/api/exrates/rates/RUB?parammode=2', headers=headers)
        data1 = rub.json()
        price_rub = round(float(data1['Cur_OfficialRate']), 2)

        usd = requests.get('https://www.nbrb.by/api/exrates/rates/USD?parammode=2', headers=headers)
        data2 = usd.json()
        price_usd = round(float(data2['Cur_OfficialRate']), 2)

        eur = requests.get('https://www.nbrb.by/api/exrates/rates/EUR?parammode=2', headers=headers)
        data3 = eur.json()
        price_eur = round(float(data3['Cur_OfficialRate']), 2)

        req = requests.get('https://wikiphile.ru/570-fraz-o-motivacii/?ysclid=le2s2e8ouu459711332' ,headers=headers)
        
        soup = BeautifulSoup(req.text, 'lxml')

        lst = soup.find('ol').find_all('li')
        random_index = random.randint(0, len(lst) - 1)
        await msg.answer(
            f'---------------{datetime.datetime.now().strftime("%d-%m-%Y")}---------------\n'\
            '\n'\
            '-----Погода-----\n'\
            f'Город: {city}\n'\
            f'Описание: {description}\n'\
            f'Текущая погода: {cur_weath}°\n'\
            f'Ощущается как: {feel_weth}°\n'\
            f'Скорость ветра: {wind} м/с \n'\
            f'Влажность: {humidity}\n'\
            f'Рассвет: {sunrise}\n'\
            f'Закат: {sunset}\n'\
            '\n'\
            f'-----Курсы валют-----\n'\
            f'Доллар\n'\
            f'Курс по НБРБ: {price_usd} BYN\n'\
            f'Евро\n'\
            f'Курс по НБРБ: {price_eur} BYN\n'\
            f'Российский рубль(за 100р)\n'\
            f'Курс по НБРБ: {price_rub} BYN\n'\
            '\n'\
            f'-----Рандомная цитата-----\n'\
            f'{lst[random_index].text}'
            )
    except:
        await msg.answer('error')

@dp.message_handler()
async def sms2(msg: types.Message) -> None:
    users = db.get_users()
    for user in users:
        try:        
            URL= f'https://api.openweathermap.org/data/2.5/weather?lat=53.9&lon=27.5667&appid={API_KEY}&units=metric&lang=ru'
            headers = {
                'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41',
            }
            r = requests.get(url=URL, headers=headers)
            data = r.json()

            city = data['name']
            cur_weath = round(float(data['main']['temp']))
            feel_weth = round(float(data['main']['feels_like']))
            humidity = data['main']['humidity']
            wind = data['wind']['speed']
            description = data['weather'][0]['description']
            sunrise = datetime.datetime.fromtimestamp(data['sys']['sunrise']).strftime('%H:%M')
            sunset = datetime.datetime.fromtimestamp(data['sys']['sunset']).strftime('%H:%M')

            rub = requests.get('https://www.nbrb.by/api/exrates/rates/RUB?parammode=2', headers=headers)
            data1 = rub.json()
            price_rub = round(float(data1['Cur_OfficialRate']), 2)

            usd = requests.get('https://www.nbrb.by/api/exrates/rates/USD?parammode=2', headers=headers)
            data2 = usd.json()
            price_usd = round(float(data2['Cur_OfficialRate']), 2)

            eur = requests.get('https://www.nbrb.by/api/exrates/rates/EUR?parammode=2', headers=headers)
            data3 = eur.json()
            price_eur = round(float(data3['Cur_OfficialRate']), 2)

            req = requests.get('https://wikiphile.ru/570-fraz-o-motivacii/?ysclid=le2s2e8ouu459711332' ,headers=headers)
            
            soup = BeautifulSoup(req.text, 'lxml')

            lst = soup.find('ol').find_all('li')
            random_index = random.randint(0, len(lst) - 1)
            await bot.send_message(user[0], text=
                f'---------------{datetime.datetime.now().strftime("%d-%m-%Y")}---------------\n'\
                '\n'\
                '-----Погода-----\n'\
                f'Город: {city}\n'\
                f'Описание: {description}\n'\
                f'Текущая погода: {cur_weath}°\n'\
                f'Ощущается как: {feel_weth}°\n'\
                f'Скорость ветра: {wind} м/с \n'\
                f'Влажность: {humidity}\n'\
                f'Рассвет: {sunrise}\n'\
                f'Закат: {sunset}\n'\
                '\n'\
                f'-----Курсы валют-----\n'\
                f'Доллар\n'\
                f'Курс по НБРБ: {price_usd} BYN\n'\
                f'Евро\n'\
                f'Курс по НБРБ: {price_eur} BYN\n'\
                f'Российский рубль(за 100р)\n'\
                f'Курс по НБРБ: {price_rub} BYN\n'\
                '\n'\
                f'-----Рандомная цитата-----\n'\
                f'{lst[random_index].text}'
                )
            if int(user[1]) != 1:
                db.set_active(user[0], 1)
        except:
            db.set_active(user[0], 0)



if __name__ == '__main__':
    scheduler = AsyncIOScheduler(timezone='Europe/Minsk')
    scheduler.add_job(sms2, trigger='cron', hour=11, minute=58, start_date=datetime.datetime.now(), kwargs={'msg':types.Message, }, misfire_grace_time=3600 ) 
    scheduler.start()
    executor.start_polling(dp, skip_updates=True)

Код для бд ниже

import sqlite3
import pathlib
import sys

class Datebase:
    def __init__(self, db_file) -> None:
        script_path = pathlib.Path(sys.argv[0]).parent
        self.conection = sqlite3.connect(script_path / "database.db")
        self.cursor = self.conection.cursor()

    def user_exists(self, user_id):
        with self.conection:
            res = self.cursor.execute('SELECT * FROM "users" WHERE "user_id" = ?', (user_id,)).fetchmany(1)
            return bool(len(res))

    def add_user(self, user_id):
        with self.conection:
            return self.cursor.execute('INSERT INTO "users" ("user_id") VALUES (?)', (user_id,))

    def set_active(self, user_id, active):
        with self.conection:
            return self.cursor.execute('UPDATE "users" SET "active" = ? WHERE "user_id" = ?', (active, user_id,))
    
    def get_users(self):
        with self.conection:
            return self.cursor.execute('SELECT "user_id", "active" FROM "users"').fetchall()



Ответы

Ответов пока нет.