Задать вопрос
Ответы пользователя по тегу Python
  • Как в Telethon обработать список с entities при пересылке группы сообщений?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Решил проблему под свои нужды изменением кода в библиотеке. Оказалось, если передаётся список медиа, то он обрабатывается в этом блоке через цикл, с помощью вызова метода _send_album(), который даже не принимает переданные ранее formatting_entities .

    Поэтому, я дописал в аргументы метода _send_album() аргумент formatting_entities:
    async def _send_album(self: 'TelegramClient', entity, files, caption='',
                              formatting_entities=None,
                              progress_callback=None, reply_to=None,
                              parse_mode=(), silent=None, schedule=None,
                              supports_streaming=None, clear_draft=None,
                              force_document=False, background=None, ttl=None):

    И в сам вызов _send_album() тоже дописал передачу наших formatted_entities
    result = []
                while file:
                    result += await self._send_album(
                        entity, file[:10], caption=captions[:10], formatting_entities=formatting_entities,
                        progress_callback=used_callback, reply_to=reply_to,
                        parse_mode=parse_mode, silent=silent, schedule=schedule,
                        supports_streaming=supports_streaming, clear_draft=clear_draft,
                        force_document=force_document, background=background,
                    )
                    file = file[10:]
                    captions = captions[10:]
                    sent_count += 10
    
                return result

    Затем, внутри метода _send_album() после обработки подписей вставил код, чтобы formatted_entities к первому сообщению, если оно содержит текст:
    if captions and captions[0]:
                captions[0] = (captions[0][0], formatting_entities)

    Ну и всё заработало. Теперь группа отправляется с форматированием. Но эти изменения тоже необходимо немного подкорректировать чтобы они универсально работали в разных случаях.
    Ответ написан
  • Почему зависает авторизация Telethon на двухфакторной аутентификации?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Основная проблема в файле библиотеки /telethon/client/auth.py в строке 23 - библиотека и метод getpass.getpass() не работает в консоли PyCharm в которой запускается бот, на этом месте программа и зависает.

    Возможное решение проблемы - изменить 23 строку:
    password: typing.Union[typing.Callable[[], str], str] = lambda: getpass.getpass('Please enter your password: '),
    на
    password: typing.Union[typing.Callable[[], str], str] = lambda: input('Please enter your password: '),

    * после переустановки или обновления Telethon нужно будет делать это повторно

    Вторая проблема - если явно передать строку с паролем в метод start(), то он должен работать, НО при проверке кода, внутри того же файла, атрибут password почему-то всеравно остаётся lambda-функцией. Позже попробую найти почему так и как это исправить.
    Ответ написан
    Комментировать
  • Задача про часы, почему решается именно так?

    EntireMusic
    @EntireMusic
    (:
    hours = n % (60 * 24) // 60
    minutes = n % 60


    Допустим n = 2000 минут

    1. 60 * 24 = 1440
    — это общее количество минут в сутках. Работаем с минутами, т.к. твоё число "n" в минутах.

    2. 2000 % 1440 = 560
    Остаток от деления (%) твоего "n" на общее количества минут в сутках, так как суток может быть несколько, если число "n" велико.

    3. 560 // 60 = 9
    Оставшееся значение минут поделено целочисленным делением на 60 (//60), чтобы узнать значение для часов, поэтому сколько бы минут небыло, у тебя останется только целая часть - часы.

    4. 2000 % 60 = 20
    С минутами наоборот — часы нам не нужны, поэтому просто получаем остаток от деления на 60, сокращая часы. Остаются только минуты.

    Время на часах 9:20
    Ответ написан
    Комментировать
  • Не импортирует router из другого файла проекта в aiogram 3. В чём ошибка?

    EntireMusic
    @EntireMusic
    (:
    Сделай так в этом месте
    @router.message(Reg.number)
    async def two_three(message: Message, bot: Bot, state: FSMContext):
        await state.update_data(number=message.text)
        data=await state.get_data()
    
        await bot.send_message(chat_id='нужный айди', text=f'Спасибо, регистрация завершена. \n Имя: {data["name"]} \n Номер: {data ["number"]}')
        await state.clear()


    И удали это
    from run import bot
    Ответ написан
    Комментировать
  • Как сделать уведомление в Aiogram?

    EntireMusic
    @EntireMusic
    (:
    https://docs.aiogram.dev/en/latest/telegram/types/...
    await bot.answer_callback_query(callback_query_id=cmd.id, text="Уведомление", show_alert=True)

    либо
    await callback_query.answer("Уведомление", show_alert=True)
    Ответ написан
    4 комментария
  • Как проверять что введен русский язык?

    EntireMusic
    @EntireMusic
    (:
    Решил написать свой вариант такой функции, чтобы продемонстрировать её несовершенство. Вариант с флагом и только русскими буквами делать не стал, сделал с процентами. Третья проверка не проходит, тк русских букв слишком мало в соотношении с другими, хотя текст по сути русский. Но это скорее исключение, в целом такая функция имеет место быть, но лучше перестраховаться от разных вариантов.

    import string
    
    def is_russian(text):
        alpha = "абвгдеёжзиклмнопрстуфхцчшщъыьэюя"
        new_text = text.translate(str.maketrans('', '', string.punctuation)).lower().replace(' ', '')
        
        rulet = 0
        for letter in new_text:
            if letter in alpha:
                rulet += 1
         
        # Если больше или равно 70%       
        if rulet/len(new_text) >= 0.7:
            return(True)
        else:
            return(False)
        
    
    good_text = "Какой-то текст, со знаками препинания, конечно же, sorry!"
    bad_text = "Some english text, isn't russian."
    secret = "Люблю Gucci"
    
    print(is_russian(good_text)) #вернёт True
    print(is_russian(bad_text)) #вернёт False
    print(is_russian(secret)) #вернёт False
    Ответ написан
    4 комментария
  • Как разделить строку по последнему указанному символу?

    EntireMusic
    @EntireMusic
    (:
    s = r"С:\User\Users\Programs\program.py"
    print(s[:s.rindex("\\")+1])


    Для получения "чистой" строки, чтобы обратный слэш не использовался как экранирующий символ, использовал r-строку. А уже для поиска последнего индекса методом .rindex() использовал два слэша: один экранирующий, второй видит программа.

    Вывод сделал обычным срезом от начала до индекса последнего слэша+1, чтобы путь отображался включая его.
    Ответ написан
  • Как извлечь информацию из сайта?

    EntireMusic
    @EntireMusic
    (:
    description в твоём случае это всё ещё список объектов супа. К ним можно/нужно применить метод text, чтобы получить именно текстовую составляющую.

    import requests
    from bs4 import BeautifulSoup
    
    url = "http://www.swhl.ru/page/1018390"
    r = requests.get(url)
    
    soup = BeautifulSoup(r.content, "lxml")
    description = soup.find_all("div", class_="page-text")
    
    for element in description:
        print(element.text)
    Ответ написан
  • Как отделить числа от букв в списке?

    EntireMusic
    @EntireMusic
    (:
    lst = ['4', '10', '4', 'A', 'T']
    new_lst=[]
    
    for element in lst:
        if element.isdigit():
            new_lst.append(int(element))
        else:
            new_lst.append(element)


    С заменой в текущем списке:
    lst = ['4', '10', '4', 'A', 'T']
    
    for i in range(len(lst)):
        if lst[i].isdigit():
            lst[i] = int(lst[i])
            
    print(lst)
    Ответ написан
    4 комментария
  • Как в экселе найти номер заказа и забрать из него состав заказа?

    EntireMusic
    @EntireMusic
    (:
    Искать по номеру можно так и выводить, используя срез:
    orders = [[1, "first", "order"], [2, "second", "order"], [3, "third", "order"], [4, "fourth", "order"]]
    
    order = int(input("Введите номер заказа: "))
    for line in orders:
        if line[0] == order:
            print(*line[1:])


    Обратите внимание, что перед этим, лучше сделать преведение типа номера заказа в строку, тк у вас в некоторых номерах заказов буквенные значения. Тогда и код будет выглядеть немного иначе.

    orders = [["1", "first", "order"], ["2", "second", "order"], ["3", "third", "order"], ["4", "fourth", "order"]] #первый элемент - строка
    
    order = input("Введите номер заказа: ") #не int
    for line in orders:
        if str(line[0]) == order: #если не преобразовывать список, можно здесь
            print(*line[1:])
    Ответ написан
    Комментировать
  • Как сделать автоматический перезапуск программы на python?

    EntireMusic
    @EntireMusic
    (:
    import random
    
    from random import randint
    
    a = randint(1,5)
    while True:
        b = int(input("Веедите число от одного до пяти!"))
        if b == a:
            print("Число верное!")
            break
        else:
            print("Число неверное!")


    На забудь обернуть input в функцию int, а то никогда введенное число не будет верным, тк исходно input принимает строковое значение.
    Ответ написан
    1 комментарий
  • Как найти min и max в массиве в списке?

    EntireMusic
    @EntireMusic
    (:
    dict = {
        "a": [131, 531],
        "b": [842, 612],
         "c": [516, 19]
    }
    
    float_nums = []
    for value in dict.values():
        for num in value:
            float_nums.append(float(num))
            
    a = min(float_nums)
    b = max(float_nums)
    a_index = []
    b_index = []
    
    for key, values in dict.items():
        if a in values:
            a_index.append(key)
            a_index.append(values.index(a))
        if b in values:
            b_index.append(key)
            b_index.append(values.index(b))
            
    print(a, *a_index)
    print(b, *b_index)
    Ответ написан
    4 комментария
  • Как сделать бот в Телеграм без приставки bot на конце?

    EntireMusic
    @EntireMusic
    (:
    1. Авторизоваться с аккаунта, который будет использоваться в качестве бота тут: https://my.telegram.org/

    2. Создать там "приложение" и получить API id, API hash.

    3. Написать бота на библиотеке, поддерживающей Telegram client API, например Pyrogram
    (я пользуюсь им) https://docs.pyrogram.org/ или Telethon https://docs.telethon.dev/en/stable/ .
    Ответ написан
    2 комментария
  • Как отделить дату от даты и сделать его прописью?

    EntireMusic
    @EntireMusic
    (:
    from datetime import datetime #импортируем нужное
    
    created = ...   #дата регистрации, взятая откуда-то ранее
    you_with_us = (datetime.now() - regdate).strftime(%d)
    #вычитаем из нынешней даты дату регистрации, форматируем, оставляя только дни
    Ответ написан
    2 комментария
  • Ошибка в боте, который отправляет комментарии.Что делать?

    EntireMusic
    @EntireMusic
    (:
    Во первых не светите свой ID и Hash на форумах, это как логин и пароль от аккаунта)

    Ошибка у вас из-за того, что в цикле переменная msg это и есть сообщение чата. Нужно сделать так:
    print(f”Пропускаем уже обработанное message _id={msg.id}”)


    Для отладки в следующий раз можете делать вывод переменной в консоль, чтобы понять какие там есть поля и как к ним обращаться.
    Ответ написан
    Комментировать
  • Pyrogram bot: как отправить фото по айди?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Всем большое спасибо за подсказки, особенно User . Проблема была как раз в фильтре. Нужно было искать photo и photo.file_id.
    Универсальный вариант - скачивать и отправлять фото, т.к. пересылка не будет работать из закрытых чатов. Вот такую функцию по-быстрому сообразил для загрузки фото.
    async def dl_last_photo(target):    #передаём в функцию ID или Username чата
        async for msg in app.get_chat_history(target, limit = 50, offset_id = -1):    #ищем в истории с конца, обрабатываем 50 сообщений
            if msg.photo:    #если есть фото
                print(msg.photo.file_id)    #в консоль выводим ID - не обязательно
                await app.download_media(msg.photo) #скачиваем фото из сообщения в стандартный каталог (папка_бота/downloads)


    По аналогии можно фильтровать и другие типы файлов. Так же можно менять папку, куда скачивается файл. И если вы уверены, что чат открыт и разрешена пересылка - можно и сразу переслать фото по ID куда нужно.
    Ответ написан
    Комментировать
  • Пишу тг бота для отправки комментариев на pyrogram. Выдаёт ошибку,что делать?

    EntireMusic
    @EntireMusic
    (:
    В такой каше сложно разобраться. Но если я правильно понимаю, ты пытаешься проверить несуществующий атрибут:
    Выдаёт ошибку: if (msg.from_user is None and msg.forward_from_chat.id == public.id):
    AttributeError: ‘NoneType’ object has no attribute ‘I’d’

    Из твоего кода:
    if (msg.from_user is None) # если сообщение не имеет автора
    # и это репост из паблика (проверка по id)


    Это так не работает. Если нет автора, то такого атрибута нет вообще, эта часть не работает. Вот тебе пример на Pyrogram как из сообщения вытащить ID.
    any_sender_id = message.from_user.id if message.from_user else message.sender_chat.id #вытаскиваем ID
    if any_sender_id == public.id: #проверяем что это нужный паблик
        #дальше твоя логика

    Если сообщение "from_user", значит принимает его ID. Иначе - принимает ID чата/канала.

    этот же код чуть понятнее:
    any_sender_id = None    #объявляем переменную для хранения ID
    if message.from_user:    #если у нас есть параметр from_user
        any_sender_id = message.from_user.id    #присваеваем ID юзера
    else:    #иначе
        any_sender_id = message.sender_chat.id    #присваеваем ID канала или чата
    
    if any_sender_id == public.id:    #проверяем что это нужный паблик
        #дальше твоя логика
    Ответ написан
    Комментировать
  • Как найти бота или чат по id в Telegram?

    EntireMusic
    @EntireMusic
    (:
    Смотря какой библиотекой будешь пользоваться.
    Ответ написан
  • Telegram userbot на Telethon не редактирует пересланные сообщения. Как исправить?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Проблема решена! Само собой как-то заработало, в коде ничего не менял.

    Возможно, это какой-то глюк с сессиями, если ты в ТГ с этого же аккаунта в данный момент. Хотя в консоли никаких ошибок небыло, когда тестировал.

    Сейчас функция работает и с текстом, и с пересланными сообщениями. Иногда долговато - несколько секунд (бота залил на Heroku).
    Ответ написан