Загрузка...

Телеграм бот для проведения розыгрышей

Тема в разделе Python создана пользователем MALWARE 26 май 2022. (поднята 4 июн 2025 в 21:36) 6792 просмотра

Загрузка...
  1. MALWARE
    MALWARE Автор темы 26 май 2022 мяукаю 11 480 12 мар 2021
    [IMG]
    Python
    from aiogram import Bot, Dispatcher, executor, types
    from aiogram.utils.markdown import link
    import json
    from os.path import isfile
    from random import choice
    from re import sub
    bot = Bot(token='token')
    dp = Dispatcher(bot)
    channels = [-1001682799926]
    admins = [657195904]

    if not isfile('participants.malw'):
    with open('participants.malw', 'w') as file:
    file.write('[]')
    with open('participants.malw', 'r') as file:
    participants = json.loads(file.read())

    @dp.message_handler(commands='start')
    async def start(message: types.Message):
    global participants, channels
    if str(message['from']['id']) in participants:
    await message.reply('✅Ты уже участвуешь в розыгрыше', disable_web_page_preview=True)
    return
    for channel in channels:
    try:
    user_info = await bot.get_chat_member(channel, message['from']['id'])
    if user_info['status'] not in ['member', 'creator', 'administrator']:
    raise
    except Exception as e:
    channel_info = await bot.get_chat(channel)
    await message.reply('⛔Ты не подписан на '+link(channel_info['title'], 'https://t.me/'+channel_info['username']), parse_mode='markdown', disable_web_page_preview=True)
    return
    participants.append(str(message['from']['id']))
    with open('participants.malw', 'w') as file:
    file.write(json.dumps(participants))
    await message.reply('✅Ты принял участие в розыгрыше', disable_web_page_preview=True)

    @dp.message_handler(commands='check')
    async def check(message: types.Message):
    global participants, channels
    if message['from']['id'] in admins:
    for participant in participants:
    for channel in channels:
    try:
    user_info = await bot.get_chat_member(channel, participant)
    if user_info['status'] not in ['member', 'creator', 'administrator']:
    raise
    except Exception as e:
    channel_info = await bot.get_chat(channel)
    try:
    await bot.send_message(participant, '⛔Ты вышел из канала '+link(channel_info['title'], 'https://t.me/'+channel_info['username'])+', поэтому больше не участвуешь в розыгрыше', parse_mode='markdown', disable_web_page_preview=True)
    except: pass
    participants.remove(participant)
    break
    with open('participants.malw', 'w') as file:
    file.write(json.dumps(participants))
    await message.reply('Проверка завершена', disable_web_page_preview=True)

    @dp.message_handler(commands='end')
    async def end(message: types.Message):
    global participants
    if message['from']['id'] in admins:
    if participants == []:
    await message.reply('В розыгрыше никто не участвует', disable_web_page_preview=True)
    return
    winner = choice(participants)
    winner_name = await bot.get_chat(winner)
    for ts in sub('[A-Za-zА-Яа-я0-9 ]', '', winner_name['first_name']):
    winner_name['first_name'] = winner_name['first_name'].replace(ts, '')
    if winner_name['first_name'].replace(' ', '') == '':
    winner_name['first_name'] = 'Пустой или засранный ник'
    if 'username' in winner_name:
    name = link(winner_name['first_name'], 'https://t.me/'+winner_name['username'])+'\n'
    elif not "has_private_forwards" in winner_name:
    name = link(winner_name['first_name'], 'tg://user?id='+winner)+'\n'
    else:
    name = winner_name['first_name']+' (невозможно упомянуть)'+'\n'
    for participant in participants:
    try:
    await bot.send_message(int(participant), 'Честная система рандома определила победителя этого розыгрыша. Им становится '+name, parse_mode='markdown', disable_web_page_preview=True)
    except:
    pass
    await message.reply('Честная система рандома определила победителя этого розыгрыша. Им становится '+link(winner_name['first_name'], 'tg://user?id='+winner), parse_mode='markdown', disable_web_page_preview=True)
    with open('participants_old.malw', 'w') as file:
    file.write(json.dumps(participants))
    participants = []
    with open('participants.malw', 'w') as file:
    file.write(json.dumps(participants))

    @dp.message_handler(commands='testend')
    async def end(message: types.Message):
    global participants
    if message['from']['id'] in admins:
    if participants == []:
    await message.reply('В розыгрыше никто не участвует', disable_web_page_preview=True)
    return
    winner = choice(participants)
    winner_name = await bot.get_chat(winner)
    for ts in sub('[A-Za-zА-Яа-я0-9 ]', '', winner_name['first_name']):
    winner_name['first_name'] = winner_name['first_name'].replace(ts, '')
    if winner_name['first_name'].replace(' ', '') == '':
    winner_name['first_name'] = 'Пустой или засранный ник'
    if 'username' in winner_name:
    name = link(winner_name['first_name'], 'https://t.me/'+winner_name['username'])+'\n'
    elif not "has_private_forwards" in winner_name:
    name = link(winner_name['first_name'], 'tg://user?id='+winner)+'\n'
    else:
    name = winner_name['first_name']+' (невозможно упомянуть)'+'\n'
    await message.reply('Тестовое завершение. Список участников не очищается и сообщения не рассылаются. Честная система рандома определила победителя этого розыгрыша. Им становится '+name, parse_mode='markdown', disable_web_page_preview=True)


    @dp.message_handler(commands='list')
    async def list(message: types.Message):
    global participants
    if message['from']['id'] in admins:
    if participants == []:
    await message.reply('В розыгрыше никто не участвует', disable_web_page_preview=True)
    return
    list = ''
    for participant in participants:
    participant_info = await bot.get_chat(participant)
    for ts in sub('[A-Za-zА-Яа-я0-9 ]', '', participant_info['first_name']):
    participant_info['first_name'] = participant_info['first_name'].replace(ts, '')
    if participant_info['first_name'].replace(' ', '') == '':
    participant_info['first_name'] = 'Пустой или засранный ник'
    if 'username' in participant_info:
    list += link(participant_info['first_name'], 'https://t.me/'+participant_info['username'])+'\n'
    elif not "has_private_forwards" in participant_info:
    list += link(participant_info['first_name'], 'tg://user?id='+participant)+'\n'
    else:
    list += participant_info['first_name']+' (невозможно упомянуть)'+'\n'
    await message.reply('Список участников розыгрыша:\n'+list, parse_mode='markdown', disable_web_page_preview=True)

    executor.start_polling(dp, skip_updates=True)
    Использование:
    1. Создаем бота. Пишем t.me/BotFather, по стандарту.[IMG]
    2. По желанию можно сделать список команд[IMG]
      start - Принять участие в розыгрыше
      check - Проверить подписку пользователей на каналы (доступно только администраторам)
      end - Подвести итоги (доступно только администраторам)
      testend - Тестовые итоги (доступно только администраторам)
      list - Показать список участников розыгрыша (доступно только администраторам)
    3. В token подставляем токен бота
    4. admins - список айди пользователей, которые могут использовать команды /check, /end, testend, /list. Чтобы узнать свой айди, нужно написать боту t.me/myidbot. Чтобы узнать чужой айди, нужно переслать ему сообщение пользователя. Но не у каждого пользователя можно узнать айди, пользователям нужно в настройках приватности сделать вот что:[IMG] [IMG]
    5. channels - список айди каналов, на которые пользователь должен подписаться для участия в розыгрыше. Естественно бота нужно добавить в каждый канал. Узнать айди канала можно через того же IDBota[IMG]
    Всё! Бот запущен, люди могут поучаствовать в розыгрыше, написав боту /start в ЛС. Либо можно добавить бота в группу, и люди смогут участвовать, например, в комментариях к посту в канале
    [IMG]
    Вы можете время от времени использовать команду /check, чтобы проверить, не отписался ли кто-то из участников от каналов.
    [IMG]
    Для завершения розыгрыша используйте команду /end
    [IMG]

    Для просмотра списка участников розыгрыша используйте /list
    Для тестового завершения используйте /testend

     
    26 май 2022 Изменено
  2. smoketm
    smoketm 26 май 2022 10 30 мар 2019
  3. BENZ
    А парень годноту приносит на форум :anime_thumbs_up:
     
  4. id616053233
    id616053233 26 май 2022 4 21 дек 2020
    +rep красавчик
     
  5. MartinEden
    MartinEden 26 май 2022 Заблокирован(а) 6350 9 апр 2019
    Будет авторской статьей. Очень годно, побольше бы подобных тем
     
    1. MALWARE Автор темы
      MartinEden, не будет, тема не в разделе статьи)
  6. Oni_Hige
    Oni_Hige 26 май 2022 Welcome, all you low-lifes of the nation!! 13 639 25 июл 2021
    Годно,особенно для тех кто делает дохуя розыгрышей:+rep:
     
  7. BarlCoder
    BarlCoder 12 июн 2022 Заблокирован(а) 3 8 июн 2022
    А я думал это бот по автоучастию(
     
  8. CoDZXzz
    CoDZXzz 10 окт 2022 0 10 окт 2022
    Traceback (most recent call last):
    File "C:\Users\zzz\Desktop\aiogram.py", line 1, in <module>
    from aiogram import Bot, Dispatcher, executor, types
    File "C:\Users\zzz\Desktop\aiogram.py", line 1, in <module>
    from aiogram import Bot, Dispatcher, executor, types
    ImportError: cannot import name 'Bot' from partially initialized module 'aiogram' (most likely due to a circular import) (C:\Users\zzz\Desktop\aiogram.py)

    что за ошибка? подскажите
     
    1. MALWARE Автор темы
      CoDZXzz, переименуй файл:BrainCosmic:
  9. TELEGABOTSHOP
    какой версии JSON?
    --- Сообщение объединено с предыдущим 11 окт 2022
    Бот рабочий?
     
    1. MALWARE Автор темы
      TELEGABOTSHOP, рабочий, какая у тебя ошибка?
  10. devor
    devor 12 окт 2022 <— видишь зеленый кружок? 4604 26 сен 2021
    Я думал ау сделали и не удалили все еще
     
  11. Msthevred
    Msthevred 20 ноя 2022 Обсуждаем финансы - https://t.me/FinTrafic 67 23 авг 2019
    1. Msthevred
      MALWARE, пон, но проблема из-за него не решилась :)
    2. MALWARE Автор темы
      Msthevred, найди файл participants.malw, удали его и заново создай, внутри напиши просто []
  12. AGO
    AGO 19 дек 2022 Work 379 27 авг 2022
    Использовать FSM: :finger_down:
    Использовать глобалы: :finger_up:
    А и еще:
    Использовать with open: :cool_bun:
    Использовать async with aiofiles.open :clown:
     
  13. 2017
    2017 18 янв 2023 Заблокирован(а) 11 032 18 сен 2019
    Неплохо, годно, думаю что фкопик добавит похожее в свой канал и чат
     
  14. psggkgm
    psggkgm 20 янв 2023 0 20 янв 2023
    Всем привет, статья очень хорошая, и даже немного полезная, но у меня возникла проблема, при выполнении команды
    executor.start_polling(dp, skip_updates=True), терминал выдает ошибку вида:
    Task exception was never retrieved
    future: <Task finished name='Task-7' coro=<Dispatcher._process_polling_updates() done, defined at C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=TypeError("str() argument 'encoding' must be str, not list")>
    Traceback (most recent call last):
    File "C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Program Files\Python311\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "c:\Program Files\Python311\CHAT-BOT\new bot.py", line 39, in start
    participants.append(str(message['from'],['id']))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: str() argument 'encoding' must be str, not list, помогите пожалуйста, как это исправить?
     
    20 янв 2023 Изменено
    1. MALWARE Автор темы
      с хера ли у тебя тут запятая?
    2. psggkgm
      MALWARE, извиняюсь, спасибо за помощь, просто я в этой теме начинающий, где то месяц назад начал заниматься, так что спасибо за полезную статью.
  15. Brokkk_inactive6487120
    Привет, статья годная, но как например сделать так что бы пока розыгрыш не был опубликован в тг канале, в нем нельзя было участвовать через бота?
     
  16. Mrkrotik007
    Подскажите где я накосячил?
    Traceback (most recent call last):
    File "C:\Users\mrkrotik007\Desktop\piton\tgrandomizer.py", line 15, in <module>
    participants = json.loads(file.read())
    ^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\mrkrotik007\Desktop\piton\Lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\mrkrotik007\Desktop\piton\Lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\mrkrotik007\Desktop\piton\Lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
     
    1. Посмотреть предыдущие комментарии (2)
    2. MALWARE Автор темы
      Mrkrotik007, очень странно, попробуй пересоздать файл
    3. MALWARE Автор темы
      Mrkrotik007, че за херь, потом посмотрю, напиши в тг
  17. MALWARE
    MALWARE Автор темы 5 мар 2023 мяукаю 11 480 12 мар 2021
    Полностью обновил бота!
    Добавил /testend и /list
    Исправил ту самую ошибку с файлом
    Исправил ошибки с засранными никами пользователей
    Исправил ошибки, когда некоторых пользователей бот не упоминал
    Поднял тему кнопкой
     
    5 мар 2023 Изменено
  18. milko_inactive6524500
    а есть ли возможность сделать розыгрышь на выбывание? что бы участиники отсеевались под 1-му, к конечному победителю
     
  19. r04dster_
    r04dster_ 17 апр 2023 0 27 окт 2020
    File "C:\Users\4\PycharmProjects\roz\main.py", line 26, in start
    user_info = await bot.get_chat_member(channel, message['from']['id'])
    File "C:\Users\4\PycharmProjects\roz\main.py", line 30, in start
    channel_info = await bot.get_chat(channel)
    --- Сообщение объединено с предыдущим 17 апр 2023
    что нужно импортировать для работы бота?
     
    1. MALWARE Автор темы
      r04dster_, ошибку покажи до конца
  20. Bleed_inactive5656036
    Bleed_inactive5656036 2 май 2023 Саттва Гуна 337 21 июл 2022
    пушечная пушка. а прикрутить платеж, например, чтобы участие стоило 100р, а выиграть можно было 1000р возможно?
     
Top