
Фронтенд-разработка
Здравствуйте, описываю ситуацию: есть сайт https://csgo-guides.ru/blog/grow-a-garden-stock/ , который показывает автосток из режима в рб (то, что есть в магазине), попросили сделать бота для телеграм, но я в пайтоне не сильно харош, как можно запарсить этот сайт? Как понял для названий используется html файл, а вот для количества и времени обновления уже API (ну, повторюсь, я так понял), и хотелось бы, чтобы в боте в тг можно было выбрать, что отслеживать, может подскажите как нормально парсить? Или как-то по другому бота создать? Вот пример: @Grow_Garden_Abot
Выдает бесконечные ошибки в коде, не знаю уже что делать, устал голову ломать , установлен aiogram 3.0, знатоки подскажите пожалуйста, бот по меркам реалий не такой уж и сложный
Пишу через Replit
main.ru:
import asyncio
from aiogram import Bot, Dispatcher
from aiogram.enums import ParseMode
from aiogram.types import Message
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.filters import Command
from handlers import blog, broadcast, poll
TOKEN = "Мой токен"
CHANNEL_ID = "@Serquor_DevLog"
async def main():
bot = Bot(token=TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher(storage=MemoryStorage())
dp.include_routers(blog.router, broadcast.router, poll.router)
@dp.message(Command("start"))
async def start(message: Message):
await message.answer("Привет! Я — бот для блога Serquor.")
await dp.start_polling(bot)
if name == "__main__":
asyncio.run(main())
blog.py;
from aiogram import Router, F
from aiogram.types import Message
from aiogram.filters import Command
from main import CHANNEL_ID
router = Router()
@router.message(Command("publish"))
async def publish_blog(message: Message):
if message.from_user.id != Мой id:
await message.answer("Нет доступа.")
return
lines = message.text.split("\n", 1)
if len(lines) < 2:
await message.answer("Формат: /publish\nТекст блога")
return
text = lines[1]
await message.bot.send_message(CHANNEL_ID, text)
await message.answer("✅ Опубликовано в канал.")
broadcast.pu
from aiogram import Router, F
from aiogram.types import Message
from aiogram.filters import Command
import json
import os
router = Router()
DATA_FILE = "data/users.json"
def save_user(user_id):
users = []
if os.path.exists(DATA_FILE):
with open(DATA_FILE, "r") as f:
users = json.load(f)
if user_id not in users:
users.append(user_id)
with open(DATA_FILE, "w") as f:
json.dump(users, f)
@router.message(Command("start"))
async def track_user(message: Message):
save_user(message.from_user.id)
await message.answer("Вы подписались на обновления.")
@router.message(Command("broadcast"))
async def broadcast(message: Message):
if message.from_user.id != Мой Id:
return
parts = message.text.split("\n", 1)
if len(parts) < 2:
await message.answer("Формат: /broadcast\nТекст рассылки")
return
text = parts[1]
with open(DATA_FILE, "r") as f:
users = json.load(f)
for uid in users:
try:
await message.bot.send_message(uid, text)
except:
continue
await message.answer("✅ Рассылка отправлена.")
poll.py
from aiogram import Router
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram.filters import Command
from aiogram.utils.keyboard import InlineKeyboardBuilder
router = Router()
votes = {"yes": 0, "no": 0, "maybe": 0}
@router.message(Command("poll"))
async def send_poll(message: Message):
keyboard = InlineKeyboardBuilder()
keyboard.button(text="✅ Да", callback_data="vote_yes")
keyboard.button(text="❌ Нет", callback_data="vote_no")
keyboard.button(text="🤔 Не уверен", callback_data="vote_maybe")
await message.answer("Что ты думаешь о блоге?", reply_markup=keyboard.as_markup())
@router.callback_query(F.data.startswith("vote_"))
async def handle_vote(callback: CallbackQuery):
vote_type = callback.data.split("_")[1]
votes[vote_type] += 1
text = f"✅ Да: {votes['yes']} | ❌ Нет: {votes['no']} | 🤔 Не уверен: {votes['maybe']}"
await callback.message.edit_text("Что ты думаешь о блоге?\n" + text, reply_markup=callback.message.reply_markup)
await callback.answer("Спасибо за голос!")