@dmitriy8720

Проверка подписки на канал для группы, как снять ограничения?

Подскажите, как снять ограничения с группы, для проверки подписки на канал. Стена в группе закрылась, подписался на канал, но ограничения не снимаются, стена все равно закрыта. Нужно сделать проверку через бд, собрал код, но открыть стену не могу.

1 фото пишу текст в группу, сообщение удаляется и закрывается стена.
62ac07045a2af869295584.jpeg

2 фото, 2 кнопки, но я уже подписан.
62ac071d1e963816761247.jpeg

62ac072c8b6f3503644151.jpeg

62ac073642a6f718027381.jpeg

Весь код
import aiogram
import logging
import markups as nav
import sqlite3
import cursor as cursor
from sqlite3 import connect
from aiogram import Bot, Dispatcher, executor
from time import time
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.types import CallbackQuery, ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton, ChatMember
from aiogram.dispatcher.middlewares import BaseMiddleware
from aiogram.contrib.fsm_storage.memory import MemoryStorage


API_TOKEN = 'moi_token'
logging.basicConfig(level=logging.INFO)

#bot = Bot(token=config.BOT_TOKEN)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())                


keyboard = types.InlineKeyboardMarkup(row_width=2)
subscribe = types.InlineKeyboardButton(text="Подписаться", url="https://t.me/URL_KANALA")
check = types.InlineKeyboardButton(text="Проверить", callback_data="check")
keyboard.add(subscribe)
keyboard.add(check)
#
menu = types.ReplyKeyboardMarkup(True, True)
menu.add("Вы уже подписаны")


#База Данных
conn = sqlite3.connect("usernamechat3.db")
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS users
        (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, username TEXT, first_name TEXT)''')
conn.commit()
conn.close()

class SQLither:

    def __init__(self, database) -> object:
        self.conn = sqlite3.connect(database)
        self.c = self.conn.cursor()

    def exists_user(self, user_id):
        """Проверка существования пользователя в БД"""
        return bool(self.c.execute("SELECT * FROM users WHERE user_id=?", (user_id,)).fetchone())

    def add_to_db(self, user_id, username, first_name):
        """Добавление пользователя в БД"""
        #self.c.execute("INSERT INTO users ('user_id') VALUES(?)", (user_id,)) and self.c.execute("INSERT INTO users ('username') VALUES(?)", (username,))
        self.c.execute("INSERT INTO users(user_id, username, first_name) VALUES(?,?,?)", (user_id, username, first_name))
        self.conn.commit()


#ID Вашего канала
chat_id = -10idмоегоканала32

@dp.message_handler(commands=["start"])
async def start(message):
    user_id = message.from_user.id
    username = message.from_user.username
    #first_name = message.chat.first_name
    first_name = message.from_user.first_name
    #last_name = message.from_user.last_name
    #chat_id = message.chat.id
    if not db.exists_user(user_id):
        db.add_to_db(user_id, username, first_name)
        await bot.send_message(message.chat.id, "Что-бы продолжить подпишитесь на канал", reply_markup=keyboard)
    else: #Уже в бд
        await bot.send_message(message.chat.id, "Вы уже подписаны", reply_markup=menu)


@dp.message_handler(content_types=["text"])
async def handler_text(message):
    for i in range(1):
        if message.chat.id:
            menu = types.InlineKeyboardMarkup(row_width=1)
            item = types.InlineKeyboardButton(text="Ссылка", url="https://t.me/url_bota")
            menu.add(item)
            await message.reply("Чтобы получить возможность писать в чате вам нужно подписаться на каналы по ссылке.".format(message.from_user), disable_notification=True, disable_web_page_preview=True, parse_mode='html', reply_markup=menu)
            member = await bot.get_chat_member(message.chat.id, message.from_user.id)
        if isinstance(member, types.ChatMemberMember):
            await bot.delete_message(message.chat.id, message.message_id)
            await bot.restrict_chat_member(message.chat.id, message.from_user.id, can_send_messages=False)
            return

@dp.callback_query_handler(lambda call: True)
async def c_listener(call):
    if call.data == "check":
        x = await bot.get_chat_member(chat_id, call.message.chat.id)

        if x.status == "member" or x.status == "creator" or x.status == "administrator":
            await bot.send_message(call.message.chat.id, "Добро пожаловать!", reply_markup=menu)
            c.execute("INSERT INTO users VALUES(?)", (call.message.chat.id, ))
            conn.commit()
        else:
            await bot.send_message(call.message.chat.id, "Вы не подписались!", reply_markup=keyboard)

db = SQLither("usernamechat3.db")

        
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)


Помогите пожалуйста, подскажите рабочий код, чтобы если пользователь не подписан на канал, не смог писать в группе телеграм.
  • Вопрос задан
  • 2230 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
bot.get_chat_member(chat_id, call.message.chat.id)
Логично, что эта функция принимает id чата и Id пользователя. Вы два раза передали id чата
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
24 нояб. 2024, в 18:08
1000 руб./за проект
24 нояб. 2024, в 17:52
3000 руб./за проект
24 нояб. 2024, в 16:14
1000 руб./за проект