Получение пользователей канала - метод getChatMember

Рейтинг: 0Ответов: 1Опубликовано: 13.04.2023

Всем привет. Есть код бота на nodejs + telegraf. Хочу проверить статус (подписку) пользователя на канал, если он пишет в чате (думаю в курсе про какой бот идет речь). Проблема в том, что он проверяет статус пользователя в чате, но не в канале, хотя в метод закидываю id канала. Как это проправить или что я делаю не так? Собственно код:

const { Telegraf } = require('telegraf')
const conf = require('./conf')

const bot = new Telegraf('токен')
bot.start((ctx) => ctx.reply('Welcome'))

bot.on('message', async (ctx) => {
    let members_id = ctx.message.from.id
    let user = ctx.message.from.first_name
    let pass = await ctx.getChatMember(members_id, conf.chatId)
    if (pass.status == 'left') {
        ctx.reply(`${user}, подпишись на канал`)
    }
})

bot.launch()

// Enable graceful stop
process.once('SIGINT', () => bot.stop('SIGINT'))
process.once('SIGTERM', () => bot.stop('SIGTERM'))

Ответы

▲ 1

Проблема заключается в том, что вы используете метод getChatMember() для проверки статуса подписки пользователя на канал, но в качестве аргументов вы передаете идентификатор чата и идентификатор пользователя. Вместо этого вам нужно использовать идентификатор канала и идентификатор пользователя, чтобы проверить, подписан ли пользователь на канал.

Вот исправленный код:

const { Telegraf } = require('telegraf')
const conf = require('./conf')

const bot = new Telegraf('токен')
bot.start((ctx) => ctx.reply('Welcome'))

bot.on('message', async (ctx) => {
    let user_id = ctx.message.from.id
    let user = ctx.message.from.first_name
    let chat_member = await ctx.getChatMember(conf.channelId, user_id)
    if (chat_member.status == 'left') {
        ctx.reply(`${user}, подпишись на канал`)
    }
})

bot.launch()

// Enable graceful stop
process.once('SIGINT', () => bot.stop('SIGINT'))
process.once('SIGTERM', () => bot.stop('SIGTERM'))

Обратите внимание, что я поменял название переменной members_id на user_id, чтобы лучше отражать ее назначение. Также я заменил переменную pass на chat_member, чтобы лучше отражать, что возвращается из метода getChatMember(). Вместо этого я просто проверяю свойство status объекта chat_member, чтобы узнать, подписан ли пользователь на канал или нет.