Как правильно передать данные в Telegram bot?
Подскажите пожалуйста новичку, как правильно отправить данные в сообщении через бота.
freesteam.py парсер в результате которого получается массив в котором 10 картежей, в каждом картеже по 3 значения. Далее то что у меня не получается реализовать:
Их нужно записать в БД, при последующем парсинге мне нужно чтобы в БД из game_info записались лишь те кортежи которых нет в бд, а после они вывелись сообщением у подписчиков бота.
Для того чтобы это реализовать, я решил отсортировать БД по post_id и получить последний добавленный post_id. Далее сравнивать в цикле for после добавить в БД запись и отправить сообщение подписчикам
Что-то вроде этого.
# проверяем наличие новых игр и делаем рассылки
async def scheduled(wait_for):
while True:
await asyncio.sleep(wait_for)
# проверяем наличие новых игр
new_games = fg.get_free_game()
if(new_games):
for ng in new_games:
# здесь код цикла и записи в БД который не получается реализовать
# получаем список подписчиков бота
subscriptions = db.get_subscriptions()
# здесь код отправки сообщений который не получается реализовать
Пробовал много разных вариантов, но так ничего и не вышло. Укажите на ошибки и киньте линки, пожалуйста где можно по подробнее почитать.
bot.py -
import config
import logging
import asyncio
from datetime import datetime
from aiogram import Bot, Dispatcher, executor, types
from sqlighter import SQLighter
from freesteam import FreeGame
# задаем уровень логов
logging.basicConfig(level=logging.INFO)
# инициализируем бота
bot = Bot(token=config.API_TOKEN)
dp = Dispatcher(bot)
# инициализируем соединение с БД
db = SQLighter('botgamebd.db')
# инициализируем парсер
fg = FreeGame()
# Команда активации подписки
@dp.message_handler(commands=['subscribe'])
async def subscribe(message: types.Message):
if (not db.subscriber_exists(message.from_user.id)):
# если юзера нет в базе, добавляем его
db.add_subscriber(message.from_user.id)
else:
# если он уже есть, то просто обновляем ему статус подписки
db.update_subscription(message.from_user.id, True)
await message.answer(
"Вы успешно подписались на рассылку!\nЖдите, скоро будут новые раздачи Игр и Софта, вы узнаете о них первыми =)")
# Команда отписки
@dp.message_handler(commands=['unsubscribe'])
async def unsubscribe(message: types.Message):
if (not db.subscriber_exists(message.from_user.id)):
# если юзера нет в базе, добавляем его с неактивной подпиской (запоминаем)
db.add_subscriber(message.from_user.id, False)
await message.answer("Вы итак не подписаны.")
else:
# если он уже есть, то просто обновляем ему статус подписки
db.update_subscription(message.from_user.id, False)
await message.answer("Вы успешно отписаны от рассылки.")
# эхо
@dp.message_handler()
async def echo(message: types.Message):
await message.answer(message.text)
# запускаем лонг поллинг
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
freesteam.py -
import requests
from bs4 import BeautifulSoup
from sqlighter import SQLighter
# инициализируем соединение с БД
db = SQLighter('botgamebd.db')
url = "https://freesteam.ru/"
class FreeGame:
def get_html(url):
r = requests.get(url)
html = r.text
return html
def get_free_game(html):
soup = BeautifulSoup(html, 'lxml')
card = soup.find('div', class_='row content-grid').find_all('div', class_='post-box')
game_info = []
for post_data in card:
# post_id, entry-title, entry-content
try:
data = post_data.find('article', class_=lambda class_name: class_name in ('post', 'type-post'))
post_id_number = data.get('id')
post_id = post_id_number.split('-')[1]
except:
post_id = ''
try:
title = post_data.find('h2', class_='entry-title').find('a').text.strip()
except:
title = ''
try:
content = post_data.find('div', class_='entry-content').find('p').text.strip()
except:
content = ''
game_info.append((post_id, title, content))
return game_info
def new_post_game(self, game_info):
for end_id in game_info:
end_id = db.end_game()
if end_id < game_info[0]:
db.add_game(game_info())
else:
continue
Запросы в базу данных.
sqlighter.py -
import sqlite3
class SQLighter:
def __init__(self, database):
"""Подключаемся к БД и сохраняем курсор соединения"""
self.connection = sqlite3.connect(database)
self.cursor = self.connection.cursor()
def get_subscriptions(self, status = True):
"""Получаем всех активных подписчиков бота"""
with self.connection:
return self.cursor.execute("SELECT * FROM `subscriptions` WHERE `status` = ?", (status,)).fetchall()
def subscriber_exists(self, user_id):
"""Проверяем, есть ли уже юзер в базе"""
with self.connection:
result = self.cursor.execute('SELECT * FROM `subscriptions` WHERE `user_id` = ?', (user_id,)).fetchall()
return bool(len(result))
def add_subscriber(self, user_id, status = True):
"""Добавляем нового подписчика"""
with self.connection:
return self.cursor.execute("INSERT INTO `subscriptions` (`user_id`, `status`) VALUES(?,?)", (user_id,status))
def update_subscription(self, user_id, status):
"""Обновляем статус подписки пользователя"""
with self.connection:
return self.cursor.execute("UPDATE `subscriptions` SET `status` = ? WHERE `user_id` = ?", (status, user_id))
def end_game(self):
"""Берём последни post_id"""
with self.connection:
order_post_id = self.cursor.execute('SELECT * FROM `free_game` ORDER BY `post_id` DESC').fetchall()
end_post = order_post_id[0]
end_post_id = end_post[1]
return end_post_id
def game_exists(self, post_id):
"""Проверяем, есть ли уже ига в базе"""
with self.connection:
result = self.cursor.execute('SELECT * FROM `free_game` WHERE `post_id` = ?', (post_id,)).fetchall()
return bool(len(result))
def add_game(self, post_id, title, content):
"""Добавляем новую игру"""
with self.connection:
return self.cursor.executemany("INSERT INTO `free_game` (`post_id`, `title`, `content`) VALUES(?,?,?)", (post_id, title, content))
def close(self):
"""Закрываем соединение с БД"""
self.connection.close()