Загрузка...

Help with telegram bot

Thread in Node.js created by linakloch Oct 30, 2022. 333 views

  1. linakloch
    linakloch Topic starter Oct 30, 2022 0 Oct 19, 2022
    Всем привет.
    Такая ситуация, поставил бота, работает все хорошо. Но есть функция проверки подписки на канал. Когда вызываешь ее, крашится весь бот и потом нужно перезапускать его на сервере. Как я понял проблема в том, что ctx.chat.id не работает в следующем коде(я проверял его даже обычное reply не выводит). Помогите кто-нибудь разобраться в чём дело.

    const checkMember = async (chatId, memberId) => {
    const info = await bot.telegram.getChatMember(chatId, memberId);
    if(info.status == "left") return false;
    return true;
    }

    bot.action("podpiska", async (ctx) => {
    const checked = await checkMember(channelid, ctx.chat.id)
    if(!checked) return ctx.editMessageText("❌ТЫ НЕ ПОДПИСАЛСЯ НА КАНАЛ❌");
    ctx.replyWithHTML('<b>Добро пожаловать ' + ctx.from.first_name + '</b>!\n\n<i>Доступ к базе данных открыт\n\nНажмите на кнопку </i><b> Найти фильм</b>',
    Markup.keyboard([
    [' Найти фильм']
    ]).resize()
    )
    })
     
  2. BusDriver
    BusDriver Oct 30, 2022 :pepedrive: За рулем. Не беспокоить. 516 Dec 9, 2020
    Если это каллбек кнопка, то там вроде ид получается по другому. Чекни структуру ctx и найди там id юзера
     
    1. View previous comments (2)
    2. linakloch Topic starter
      BusDriver, попробовал и то и то, не помогло
    3. linakloch Topic starter
      BusDriver, слушай а для этой функции await bot.telegram.getChatMemberCount(chatId); какая библиотека нужна ?
  3. mulyar_trx
    mulyar_trx Oct 30, 2022 Banned 3 Jul 13, 2022
    ctx.chat.id работает абсолютно всегда в любом методе,
    Скинь лог из консольки, и если ты хочешь проверять человека конкретного, лучше используй ctx.from.id
    JavaScript
    bot.use(subMiddleware);


    async function subMiddleware(ctx, $next){
    let user = await ctx.telegram.getChatMember(process.env.CHECK_CHAT, ctx.from.id);
    if(user.status == 'left'){
    if(typeof ctx.callback_query != 'undefined') ctx.answerCbQuery('Вы не подписались на мой самый крутой в мире канал', {show_alert: true})
    return ctx.replyWithHTML('Для начала подпишитесь на мой самый лучший паблик :)')
    }
    return $next();
    }
    Выше код, он должен работать если я где-то не опечатался
    По рекомендации советую добавить фильтрацию на методы, ибо если ты используешь инвойсы и прочую херню в боте, то если чел не подписан на паблик то его платеж не пройдет
    + Оберни код в try catch, ибо если бот каким-то образом не будет в твоем паблике, то он вообще всех и вся будет нахуй слать
    (А если ты не используешь свою обработку ошибок или pm2 то он впринципе спать уйдет на неопределнный срок)
     
Loading...
Top