@Karpblch

Бот для уведомлений с ютуба не работает больше 3х дней, где я мог ошибиться?

код бота
import disnake
from disnake.ext import commands,tasks
from token_for_bot import *
from bd import *
from pars import *
bot = commands.Bot(command_prefix='.',help_command=None,intents=disnake.Intents.all())

@bot.event
async def on_ready():
    auto_send.start()

@tasks.loop(seconds=1)
async def auto_send():
    user,_ = User.get_or_create()
    channel = bot.get_channel(509046479571386369) #id канала, куда будут приходить уведомления
    video = new_video()
    if video != None:
        await channel.send(f"@here **Новое видео уже на канале**\n{video}\n")
    else:
        None

bot.run(TOKEN)

Парсер
from yt_dlp import YoutubeDL
from bd import *

options = {
    'extract_flat': True,
    'playlistend': 1,
    'quiet': True, 
    'noprogress': True,
}

def get_channel_videos(channel_url: str) -> list[dict[str, str]]:
    with YoutubeDL(options) as ydl:
        channel_data = ydl.extract_info(channel_url, download=False)
        return [
            {'url': video.get('url')}
            for video in channel_data['entries']
        ]

def new_video():
    for video in get_channel_videos('https://www.youtube.com/@MrMarmok/videos'):
        user,_ = User.get_or_create()
        videoo = video['url']
        if videoo != user.url:
            user.url = videoo
            user.save()
            return user.url

Бд где хранится ссылка
from peewee import *

db = SqliteDatabase('url.db')

class User(Model):
    url = CharField(null=True)
   
    class Meta:
        database = db  

User.create_table()
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Во-первых, научись регистрировать проблемы. Почитай про logging, как его настраивать. Расставь в боте и в парсере try-except и записывай в лог возникающие ошибки. Тогда у тебя будет текст ошибки, с которым уже можно как-то работать.

Но я подозреваю, что дело в доступе к базе Sqlite из двух процессов. Sqlite, в отличие от "взрослых" БД, не является ни процессо-, ни даже потоко-безопасной. К ней можно безопасно обращаться только строго по очереди.
Как только звёзды сойдутся так, что оба твоих процесса обращаются к базе одновременно - кому-то из них не повезёт. Если не повезёт парсеру, ты просто не увидишь инфу о новом видео при этом запуске. Если не повезёт боту - бот упадёт.

Тут вопрос такой: а нужна ли вообще тут БД? Если да, то для чего она нужна?
yt-dlp, к сожалению, синхронный - но ты ведь можешь выполнять этот код через run_in_executor(). Тогда получится интегрировать парсер прямо в бот, и отправлять сообщения немедленно.

Альтернативно, можно схитрить так: сделать боту учётку на ютубе, подписать его на нужные каналы и настроить уведомления о новых видео по почте, а в боте мониторить почтовый ящик через email-monitor или подобное.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sotvm
@sotvm
Умный поймёт, а дураку и так всё равно.
зы
тут только делать запрос к сайту, как минимум 1-3суток,
очевидно, куки протухли(или ты их удалил))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы