Загрузка...

Telegram bot for drawings

Thread in Python created by MALWARE May 26, 2022. (bumped Jul 20, 2025 at 6:00 PM) 7187 views

  1. MALWARE
    MALWARE Topic starter May 26, 2022 мяукаю 11,977 Mar 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

     
  2. smoketm
    smoketm May 26, 2022 10 Mar 30, 2019
  3. BENZ
    А парень годноту приносит на форум :anime_thumbs_up:
     
  4. id616053233
    +rep красавчик
     
  5. MartinEden
    MartinEden May 26, 2022 Banned 6348 Apr 9, 2019
    Будет авторской статьей. Очень годно, побольше бы подобных тем
     
    1. MALWARE Topic starter
      MartinEden, не будет, тема не в разделе статьи)
  6. Oni_Hige
    Oni_Hige May 26, 2022 Welcome, all you low-lifes of the nation!! 14,338 Jul 25, 2021
    Годно,особенно для тех кто делает дохуя розыгрышей:+rep:
     
  7. BarlCoder
    BarlCoder Jun 12, 2022 Banned 3 Jun 8, 2022
    А я думал это бот по автоучастию(
     
  8. CoDZXzz
    CoDZXzz Oct 10, 2022 0 Oct 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 Topic starter
      CoDZXzz, переименуй файл:BrainCosmic:
  9. TELEGABOTSHOP
    какой версии JSON?
    The post was merged to previous Oct 11, 2022
    Бот рабочий?
     
    1. MALWARE Topic starter
      TELEGABOTSHOP, рабочий, какая у тебя ошибка?
  10. devor
    devor Oct 12, 2022 <— видишь зеленый кружок? 4604 Sep 26, 2021
    Я думал ау сделали и не удалили все еще
     
  11. Msthevred
    Msthevred Nov 20, 2022 Обсуждаем финансы - https://t.me/FinTrafic 67 Aug 23, 2019
    1. MALWARE Topic starter
    2. Msthevred
      MALWARE, пон, но проблема из-за него не решилась :)
    3. MALWARE Topic starter
      Msthevred, найди файл participants.malw, удали его и заново создай, внутри напиши просто []
  12. AGO
    AGO Dec 19, 2022 Work 374 Aug 27, 2022
    Использовать FSM: :finger_down:
    Использовать глобалы: :finger_up:
    А и еще:
    Использовать with open: :cool_bun:
    Использовать async with aiofiles.open :clown:
     
  13. 150506
    150506 Jan 18, 2023 11,117 Sep 18, 2019
    Неплохо, годно, думаю что фкопик добавит похожее в свой канал и чат
     
  14. psggkgm
    psggkgm Jan 20, 2023 0 Jan 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, помогите пожалуйста, как это исправить?
     
    1. MALWARE Topic starter
      с хера ли у тебя тут запятая?
    2. psggkgm
      MALWARE, извиняюсь, спасибо за помощь, просто я в этой теме начинающий, где то месяц назад начал заниматься, так что спасибо за полезную статью.
  15. Brokkk_inactive6487120
    Привет, статья годная, но как например сделать так что бы пока розыгрыш не был опубликован в тг канале, в нем нельзя было участвовать через бота?
     
    1. MALWARE Topic starter
  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. MALWARE Topic starter
      Mrkrotik007, очень странно, попробуй пересоздать файл
    2. Mrkrotik007
    3. MALWARE Topic starter
      Mrkrotik007, че за херь, потом посмотрю, напиши в тг
  17. MALWARE
    MALWARE Topic starter Mar 5, 2023 мяукаю 11,977 Mar 12, 2021
    Полностью обновил бота!
    Добавил /testend и /list
    Исправил ту самую ошибку с файлом
    Исправил ошибки с засранными никами пользователей
    Исправил ошибки, когда некоторых пользователей бот не упоминал
    Поднял тему кнопкой
     
  18. milko_inactive6524500
    а есть ли возможность сделать розыгрышь на выбывание? что бы участиники отсеевались под 1-му, к конечному победителю
     
  19. renameduser_3623152
    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)
    The post was merged to previous Apr 17, 2023
    что нужно импортировать для работы бота?
     
    1. MALWARE Topic starter
  20. Bleed_inactive5656036
    Bleed_inactive5656036 May 2, 2023 Саттва Гуна 337 Jul 21, 2022
    пушечная пушка. а прикрутить платеж, например, чтобы участие стоило 100р, а выиграть можно было 1000р возможно?
     
    1. MALWARE Topic starter
Loading...
Top