Учусь программированию на python,только написала свой первый тг-бот с использованием базы данных,выбор хостинга пал на яндекс,интерфейс удобный,с впн не надо заходить как на heroku. Яндекс требует указать точку входа в формате имя_файла.обработчик_запросов. Столько с этим у меня мучений. Я использую асинхронную функцию,так что сначала точка входа была имя_файла.async,яндекс выдал ошибку,в поддержке мне сказали использовать в качестве обработчика main,так как async уже зарезервирован python,и это не сработало,поддержка начала меня откровенно игнорить,создавать какие-то обращения,в которых рекомендавали мне обратиться к их фрилансерам. Может хоть здесь кто-то действительно сможет помочь,ниже предоставлю код,может я действительно туплю,такого факта не исключаю,опыта то у меня вообще нет
import asyncio
import datetime
import sqlite3
import requests
from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import Command
TOKEN = '-'
WEATHER_API_KEY = '-'
bot = Bot(token=TOKEN)
dp = Dispatcher()
def create_db():
con = sqlite3.connect('wbuser.db')
cursor = con.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
city TEXT NOT NULL,
time_user TEXT NOT NULL
)
''')
con.commit()
con.close()
def request_weather(city):
"""Makes a request to OpenWeatherMap API and returns weather data."""
try:
result = requests.get(
"https://api.openweathermap.org/data/2.5/forecast",
params={
'q': city,
'units': 'metric',
'lang': 'ru',
'APPID': WEATHER_API_KEY,
}
).json()
if result.get('cod') != "200":
return 0, f"Ошибка: населённый пункт '{city}' не найден."
return result, None
except requests.exceptions.RequestException as e:
return 0, f"Ошибка запроса погоды: {e}"
def generate_result(data, city):
"""Generates a formatted string with weather information."""
result_string = f"<b>Прогноз погоды в городе {city}</b>\n\n"
for i in data['list'][:24]:
cloudy = 'ㅤ' if i.get('cloudy') is None else '⛅️'
clear = 'ㅤ' if i.get('clear') is None else '☀️'
temp = int(i['main']['temp'])
rain = 'ㅤ' if i.get('rain') is None else ''
snow = 'ㅤ' if i.get('snow') is None else '❄️'
lightning = 'ㅤ' if i.get('lightning') is None else '️⚡️'
time = datetime.datetime.fromtimestamp(i['dt']).strftime('%H:%M')
result_string += (
f"ㅤ: {cloudy}, ㅤ: {clear}, "
f"{time} {temp}°C, "
f" ㅤ: {rain}, ㅤ: {snow}, ㅤ: {lightning}\n "
)
return result_string
@dp.message(Command('start'))
async def cmd_start(message: types.Message):
await message.answer("Привет! Для получения самого точного прогноза погоды, укажи, пожалуйста, свой населённый пункт и время, в которое ты бы хотел получать прогноз :\n"
"<населённый пункт>, <время> Например: «Нижнекамск, 08:00», это значит, что прогноз в городе Нижнекамск будет приходить тебе каждый день в 8 утра"
)
@dp.message()
async def save_user_data(message: types.Message):
"""Saves user's city and desired time for weather updates."""
try:
user_id = message.from_user.id
city, time_user = message.text.split(',')
con = sqlite3.connect('wbuser.db')
cursor = con.cursor()
cursor.execute('''
INSERT OR REPLACE INTO users (user_id, city, time_user) VALUES (?, ?, ?)
''', (user_id, city.strip(), time_user.strip()))
con.commit()
con.close()
await message.answer(f"Город {city.strip()} и время {time_user.strip()} успешно сохранены!")
except (ValueError, sqlite3.OperationalError) as e:
await message.answer(f"Ошибка при записи данных: {e}. Попробуйте еще раз. Введите данные в формате 'город, время' (например: Нижнекамск, 08:00)")
async def send_weather_updates():
while True:
now = datetime.datetime.now().strftime('%H:%M')
con = sqlite3.connect('wbuser.db')
cursor = con.cursor()
cursor.execute('SELECT user_id, city FROM users WHERE time_user = ?', (now,))
users = cursor.fetchall()
con.close()
await asyncio.sleep(60)
async def main():
create_db()
await dp.start_polling(bot)
asyncio.create_task(send_weather_updates())
if __name__ == '__main__':
asyncio.run(main())