Ответы пользователя по тегу Python
  • Как парсить телеграмм канал в онлайне?

    Lapita12
    @Lapita12
    Тесты, тесты?
    https://github.com/mmat16/telegram_channel_parser

    import logging  # стандартная библиотека для логирования
    import parser_functions  # библиотека этого парсера
    from telethon import TelegramClient, events, sync, connection  # pip3 install telethon
    from telethon.tl.functions.channels import JoinChannelRequest
    from config import api_id, api_hash  # получение айди и хэша нашего приложения из файла config.py
    from loguru import logger
    import asyncio
    from telethon.errors.rpcerrorlist import FloodWaitError
    
    
    # настройка логгера
    logging.basicConfig(
        level=logging.INFO,
        filename='parser_log.log',
        filemode='w',
        format="%(asctime)s %(levelname)s %(message)s"
    )
    
    
    url = ["XXXX"]
    flag = True
    
    
    
    async def main():
        async with TelegramClient('new', api_id, api_hash) as client:
            for channel in url:
                try:
                    logger.info(f"Аккаунт был подключен!")
                    await client(JoinChannelRequest(channel))
                    client.on_message(parser_functions.on_message)  # регистрация обработчика сообщений
                    await client.run_until_disconnected()
                except FloodWaitError as fwe:
                    print(f'Waiting for {fwe}')
                    await asyncio.sleep(delay=fwe.seconds)
    
    
    
    
    if __name__ == "__main__":
        asyncio.run(main())
    
    
    
    
    def on_message(event):
        try:
            channel_id = event.message.chat.id
            directory_name = str(event.message.id)
            os.makedirs(f"{channel_id}/{directory_name}", exist_ok=True)
            await parser_functions.get_message_content(client, event.message, url, channel_id, directory_name)
        except Exception as passing:
            logger.error(passing)
    Ответ написан
    1 комментарий
  • Scheduler'ы в pytorch слишком сильно занижают lr?

    Lapita12
    @Lapita12
    Тесты, тесты?
    def get_lr(epoch):
        min_lr = 0.00001
        max_lr = 0.001
        step = 0.00002
    
        return max(min_lr, max_lr * (1 - step * epoch)**2)
    Ответ написан
    Комментировать
  • Почему subprocess выдает непонятные символы?

    Lapita12
    @Lapita12
    Тесты, тесты?
    output = subprocess.check_output(["ping", "www.youtube.com"])
    print(output.decode())


    Либо:

    output = subprocess.run(["ping", "www.youtube.com"], capture_output=True, text=True)
    print(output.stdout)


    PING www.youtube.com (2a00:1450:4010:c06::c6) 56(84) bytes of data.
    64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=1 ttl=56 time=131 ms
    64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=2 ttl=56 time=88 ms
    64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=3 ttl=56 time=327 ms
    64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=4 ttl=56 time=86 ms

    --- www.youtube.com ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 86/192/327/115 ms
    Ответ написан
    1 комментарий
  • Как конвертировать telethon.tl.custom.file в hints.FIleLike?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для конвертации telethon.tl.custom.file в hints.FileLike можно воспользоваться методом io.BytesIO()

    import io
    from telethon.tl.custom import File
    from typing import List, Tuple, Union
    from mypy_extensions import TypedDict
    from telethon import TelegramClient, events
    from telethon.tl.types import InputMessagesFilterPhotos
    # Создаем клиента Telegram
    client = TelegramClient('session_name', api_id, api_hash)
    
    # Создаем типизированный словарь для сообщений
    class MessageDict(TypedDict):
        id: int
        message: str
        media: Union[None, List[Tuple[str, bytes]]]
    
    # Обработчик событий
    @client.on(events.NewMessage(incoming=True, pattern='/start'))
    async def handler(event):
        # Получаем сообщение
        message = event.message
    
        # Получаем медиа-файлы
        media = []
        if message.media:
            for file in message.media:
                if isinstance(file, File):
                    # Конвертируем telethon.tl.custom.file в hints.FileLike
                    file_bytes = io.BytesIO(await file.download_media(bytes))
                    media.append((file.mime_type, file_bytes))
    
        # Создаем типизированный словарь для сообщения
        message_dict: MessageDict = {
            'id': message.id,
            'message': message.message,
            'media': media if media else None
        }
    
        # Отправляем сообщение в другой канал
        await client.send_message('other_channel', message_dict)
    
    # Запускаем клиента Telegram
    client.start()
    client.run_until_disconnected()


    В этом примере мы используем метод download_media() для загрузки файла в память, а затем создаем объект io.BytesIO() для конвертации в hints.FileLike
    Ответ написан
  • Как отправить новый пост во все беседы бота?

    Lapita12
    @Lapita12
    Тесты, тесты?
    Для отправки сообщения во все беседы, где есть бот, вам нужно получить список всех бесед, в которых бот является участником, и отправить сообщение в каждую из них. Вы можете использовать метод messages.getConversations для получения списка бесед, а затем перебрать каждую беседу и отправить сообщение в ней.

    conversations = await bot.api.messages.getConversations(filter='all')
    for conversation in conversations['items']:
        peer_id = conversation['peer']['id']
        try:
            await bot.api.messages.send(
                peer_id=peer_id,
                message='Новый пост!',
                random_id=0,
                attachment=f'wall-{event.group_id}_{event.object.id}'
            )
        except Exception as ex:
            print(f'error: {ex}')


    В этом примере мы получаем список всех бесед, используя метод messages.getConversations, и затем перебираем каждую беседу и отправляем сообщение в ней, используя метод messages.send . В peer_id мы передаем идентификатор беседы, а в attachment мы передаем идентификатор записи на стене, которую мы хотим прикрепить к сообщению.
    Ответ написан