• Как создавать сторис в Telegram?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Я могу предложить автоматизировать процесс выкладывания историй с помощью Python библиотеки - Telethon.
    В документации есть все возможные методы работы с историями, даже есть примеры.
    У меня нет возможности показать работу методов из-за отсутствия телеграм премиума, но могу показать сокращённый пример из документации метода SendStoryRequest:
    from telethon.sync import TelegramClient
    from telethon import functions, types
    
    with TelegramClient(name, api_id, api_hash) as client:
        result = client(functions.stories.SendStoryRequest(
            peer='username',
            media=types.InputMediaUploadedPhoto(
                file=client.upload_file('/path/to/file.jpg'),
                spoiler=True,
                stickers=[types.InputDocument(
                    id=-12398745604826,
                    access_hash=-12398745604826,
                    file_reference=b'arbitrary\x7f data \xfa here'
                )],
                ttl_seconds=42
            ),
            privacy_rules=[types.InputPrivacyValueAllowContacts()]
        )
        print(result.stringify())

    Достаточно легко разобраться, за что отвечает каждый параметр по его названию. Я привёл пример не полностью, потому что методу необходимы только первые три параметра (peer, media, privacy_rules), далее по желанию.
    Ответ написан
    Комментировать
  • Узнать дату регистрации в телеграм боте?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Без БД это сделать никак не получиться. У любого бота должна быть БД, с ней открывается больше возможностей.

    Вам нужно в момент отправки пользователем /start проверять, есть ли он в БД. Если нет, то получаем время в данный момент и сохраняем дату и время в БД.
    Время можно определить двумя способами:
    1. Можно с помощью ключа date, он присутствует у каждого Message и не только. Но имейте в виду, что дата будет возвращаться по времени Unix.
    2. Также можно с помощью встроенных функций в ЯП (например в Python с помощью datetime).

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

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Интересная задача. Сразу скажу что через Pyrogram сделать не получиться из-за отсутствия обновлений. Ну а вот через Telethon легко.
    Рассмотрим на примере. Возмём Телеграм канал сборник розыгрышей (канал) и оттуда возмём любой розыгрыш.
    Нам нужно получить информацию об этом сообщении и это делается с помощью get_messages и параметра ids. Далее извлекаем всю информацию о розыгрыше по ключу media:
    MessageMediaGiveaway(
        channels=[2037207714, 1218160262, 1404903079, 1849389623],
        quantity=1,
        months=3,
        until_date=datetime.datetime(2024, 3, 3, 17, 30, 9, tzinfo=datetime.timezone.utc),
        only_new_subscribers=False,
        winners_are_visible=True,
        countries_iso2=[],
        prize_description=None
    )

    Уже видно что нужные каналы лежат в channels. Остаётся в цикле пройти по списку и подписаться на каждый канал.
    Весь код:
    from telethon import TelegramClient
    from telethon.tl.functions.channels import JoinChannelRequest
    
    api_id = 12345678
    api_hash = "0123456789abcdef0123456789abcdef"
    
    client = TelegramClient('account', api_id=api_id, api_hash=api_hash, device_model="iPhone 55 Pro",
                            system_version="4.16.30-vxCUSTOM", app_version="1.10.8")
    
    async def main():
        messages = await client.get_messages("premiumlob", ids=979)
        for channel in messages.media.channels:
            await client(JoinChannelRequest(channel))
    
    with client:
        client.loop.run_until_complete(main())
    Ответ написан
    Комментировать
  • Какой должна быть скорость парсера pyrogram?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    В офицальной документации есть упоминание об увеличении скорости (ссылка). Там говорится про uvloop и он увеличивает работу asyncio в 2-4 раза, а значит и работу Pyrogram. Я пробовал его использовать, но столкнулся с проблемой: uvloop не работает на Windows. Так что если у вас парсер работает на Windows - ничего не выйдет.
    Асинхронность самый быстрый вариант.
    Ответ написан
    Комментировать
  • Pyrogram join chat?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Почитайте офицальную документацию Pyrogram: https://docs.pyrogram.org/intro/quickstart
    В вашем случае код будет выглядить так:
    from pyrogram import Client
    
    # Поменяйте id и hash на свои
    api_id = 12345
    api_hash = "0123456789abcdef0123456789abcdef"
    
    app = Client("Igor", api_id, api_hash)
    
    async def main():
        async with app:
            # У открытого канала/группы принимается не ссылка, а username
            # Документация: https://docs.pyrogram.org/api/methods/join_chat
            links = ["@piarlg"]
            for chat in links:
                await app.join_chat(chat)
    
    app.run(main())
    Ответ написан
    Комментировать
  • Не удается вступить в канал телеграм, почему?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Покопавшись в документации и коде Pyrogram, стало понятно, что это тот случай, когда ошибка возникает не потому что что-то случилось, а потому что всё хорошо. Даже если перевести то, что написано в ошибке становится понятно, что "Запрос на присоединение к этому чату или каналу был успешно отправлен".
    Единственное решение - использовать try except. В Pyrogram кроме исключения InviteRequestSent, ещё есть исключение InviteHashExpired, которое вызывается, когда ссылка уже не действительна.
    Пример кода:
    from pyrogram.errors.exceptions.bad_request_400 import InviteRequestSent, InviteHashExpired
    
    ...
    
    try: 
        await app.join_chat("https://t.me/+xxxxxxxxxxxxx")
    except InviteRequestSent:
        print("Запрос отправлен!")
    except InviteHashExpired:
        print("Ссылка не действительна!")
    Ответ написан
    Комментировать
  • Есть ли в pyrogram функции, которых нет в telethon?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Все библиотеки, которые работают с юзерботами, обращаются к Telegram API. То есть все они имеют одинаковые методы для работы с Телеграмом, но отличаються синтаксисом и т.п.
    Проблема заключается в том, что какие-то библиотеки последний раз обновлялись давно. Вот например последнее обновление Pyrogram было аж 10 месяцев назад (Github), а вот Telethon обновляется постоянно (Github).
    Для ответа на вопрос что лучше, я потестил Telethon и понял, что в нём очень сложно разобраться. Сначала я думал, что в документации ничего не сказано про методы, но потом нашёл Telethon API с примерами кода и разобраться было чуть легче.
    Но проблем было гораздо больше с установкой. Чтобы установить Telethon нужно сначало установить wheel. Потом после ввода номера телефона и создания файла сессии, у меня отсоединился аккаунт от других устройств (решение).
    И последнее замечание - к сессиям. Во-первых сессия, созданная Pyrogram, не может использоваться в Telethon и наоборот. Во-вторых Pyrogram создаст файл один раз, и потом можно будет обращаться только по имени этого файла, а Telethon всегда нужны будут api_id, api_hash, device_model, system_version и app_version.
    Перед нами выбор: простой синтаксис и документация, но не обновлённый - Pyrogram или пройти через несколько проблем с началом работы, но содержащий новые методы - Telethon. Ответ простой. Всегда используй Pyrogram, но если будут нужны новые методы, которых нет в Pyrogram, то используй Telethon.
    Ответ написан
    Комментировать
  • Как работать с папками telegram через Pyrogram?

    Laiwers
    @Laiwers
    Python, Telegram, Parsing
    Надо пользоваться документацией не только библиотек, но ещё и API Телеграма, когда работаете с клиентом Телеграма. Вот все методы для работы с папками в офицальной документации: *тык*.
    Если попробуете поискать методы из документации API Телеграм в документации Pyrogram, то они там будут: *тык*.
    Вот например метод для получения всех папок: GetDialogFilters. С помощью этого метода будет возвращён список с классами DialogFilter и затем уже доставайте нужные вам айдишники чатов.
    Так что учитесь пользоваться разными документациями.
    Ответ написан
    Комментировать