@romka13323

Как создать проверку создателя группы Telegram на подписку, на определенную Telegram Группу?

Есть Telegram бот со своим функционалом, который работает только в личных сообщениях с ботом. В бота перед запуском его основного функционала добавлено действие, которое проверяет подписку на определенную группу. В личных сообщениях подписка проверяется отлично, но в группах..

Хочу расширить возможности бота и сделать возможность его доступным в частных группах тоже. В частных группах он работает корректно, но не получается добавить проверку подписки на определенную группу.

Необходимо проверять статус подписки владельца частной группы. Владелец группы имеет статус creator в своей, и должен являться участником моей группы.

Код для личных сообщений с ботом (с возможностью проверки подписки):
import cryptoo_parser

from keyboards import sub_verification_menu
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor



API_TOKEN = 'токен'



bot = Bot(token=API_TOKEN, parse_mode='HTML')
dp = Dispatcher(bot)


def sub_verification(chat_member):
    if chat_member["status"] != "left":
        return True
    else:
        return False


@dp.message_handler(commands=["start"])
async def send_welcome(message: types.Message):
    if sub_verification(await bot.get_chat_member(chat_id="-1001111111", user_id=message.from_user.id)):
        await message.reply(" Hi! I’m here and ready to work! Send me any token address\n")
    else:
        await message.answer("Чтобы получить доступ к боту, подпишись на канал", reply_markup=sub_verification_menu)


@dp.callback_query_handler(text="sub_check")
async def sub_check(message: types.Message):
    await bot.delete_message(message.from_user.id, message.message.message_id)
    if sub_verification(await bot.get_chat_member(chat_id="-1001111111", user_id=message.from_user.id)):
        await bot.send_message(message.from_user.id, " Hi! I’m here and ready to work! Send me any token address\n")
    else:
        await bot.send_message(message.from_user.id, "Чтобы получить доступ к боту, подпишись на канал", reply_markup=sub_verification_menu)


@dp.message_handler()
async def echo_message(msg: types.Message):
    if sub_verification(await bot.get_chat_member(chat_id="-1002255513223", user_id=msg.from_user.id)):
        local_parser = cryptoo_parser.Parser()
        coin_address = msg.text
        wait_message = await msg.reply(" Looking for matches...", parse_mode='HTML')
        coin_info = local_parser.parse_coin(coin_address)
        print(coin_info)
        if coin_info == "BAD_ADDRESS":
            await bot.edit_message_text("‍♂️ Oops! It seems you entered the wrong token address...\nCheck and try again!",
                                        msg.from_user.id, message_id=wait_message.message_id, parse_mode='HTML',
                                        disable_web_page_preview=True)
        elif coin_info == "BAD_PASR":
            await bot.edit_message_text("☹️ Oops! Looks like something went wrong...\nTry again!",
                                        msg.from_user.id, message_id=wait_message.message_id, parse_mode='HTML',
                                        disable_web_page_preview=True)
        else:
                target_coin_cap_round = f'{round(coin_info["target_coin_info"]["target_coin_cap"], 2):,}'
                target_length = len(target_coin_cap_round)
                post_head = f"""✍<b>Token name</b> – {coin_info["target_coin_info"]["target_coin_name"]} ({coin_info["target_coin_info"]["target_coin_symbol"]})
<b>Market Cap</b> – ${target_coin_cap_round}
<b>Holders</b> – {coin_info["target_coin_info"]["target_coin_holders"]}\n\n"""
                all_post = post_head
                for holder in coin_info["holders_info"]:
                    all_post += f"""<b><a href="{coin_info["holders_info"][holder]["holder_link"]}">{holder}</a> | {coin_info["holders_info"][holder]["holder_cap_percent"]}%</b>\n"""
                    all_post += f"""{coin_info["target_coin_info"]["target_coin_name"]} (${round(coin_info["holders_info"][holder]["target_coin"]["target_coin_value"], 2)}k)"""
                    # all_post += f"""{coin_info["target_coin_info"]["target_coin_name"]} (${"{:.{}f}".format(coin_info["holders_info"][holder]["target_coin"]["target_coin_value"], target_length - len(str(int(coin_info["holders_info"][holder]["target_coin"]["target_coin_value"]))) - 1)}k)"""
                    if coin_info["holders_info"][holder]["else_coins"]:
                        all_post += ";"
                        for else_coin in coin_info["holders_info"][holder]["else_coins"]:
                            all_post += f""" {else_coin} (${round(coin_info["holders_info"][holder]["else_coins"][else_coin], 2)}k);"""
                            # all_post += f""" {else_coin} (${"{:.{}f}".format(coin_info["holders_info"][holder]["else_coins"][else_coin], target_length - len(str(int(coin_info["holders_info"][holder]["else_coins"][else_coin]))) - 1)}k);"""
                    if all_post[-1] == ";":
                        all_post = all_post[:-1]
                    all_post += ".\n\n"
                print(all_post)
                await bot.edit_message_text(all_post, msg.from_user.id, message_id=wait_message.message_id, parse_mode='HTML',
                                            disable_web_page_preview=True)

        def round_coin_values(data):
            target_value = round(data['holders_info']['Holder 1']['target_coin']['target_coin_value'], 2)
            data['holders_info']['Holder 1']['target_coin']['target_coin_value'] = target_value

            target_length = len(str(target_value))

            for coin_name, coin_value in data['holders_info']['Holder 1']['else_coins'].items():
                formatted_value = "{:.{}f}".format(coin_value, target_length - len(str(int(coin_value))) - 1)
                data['holders_info']['Holder 1']['else_coins'][coin_name] = float(formatted_value)

            return data
    else:
        await msg.answer("Чтобы получить доступ к боту, подпишись на канал", reply_markup=sub_verification_menu)
            


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


Код для групп такой же, только без проверки подписки и работает по команде /ghg
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
@romka13323 Автор вопроса
В интернете мало информации. Поэтому решил попросить написать код у Gpt, получился код, который будет представлен ниже. Я его под себя изменил.

import logging
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor

API_TOKEN = 'ч'  # Замените на свой токен
GROUP_ID = -ч  # Замените на ID вашей группы (куда необходимо подписаться)

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['check_creator'])
async def check_creator(message: types.Message):
    try:
        # Получаем администраторов группы (куда был добавлен бот)
        admins = await bot.get_chat_administrators(chat_id=message.chat.id)
        
        # Находим создателя группы (куда был добавлен бот)
        creator_id = next(admin.user.id for admin in admins if admin.is_chat_creator)
        
        # Проверяем статус создателя 
        member = await bot.get_chat_member(GROUP_ID, creator_id)

        if member.status in ('member', 'administrator'):
            await bot.send_message(creator_id, text="Создатель группы является участником.")
        else:
            await bot.send_message(creator_id, text="Создатель группы не является участником.")
    except StopIteration:
        await message.reply("Не удалось найти создателя группы.")
    except Exception as e:
        await message.reply(f"Произошла ошибка: {str(e)}")

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


Бот проверяет подписан ли владелец группы на ваш канал, но только по команде. Код можно легко доработать под ваши нужды
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы