Задать вопрос
@KirSupi

Как взять данные с нужного сервера Telegram в Pyrogram?

Использую Pyrogram для работы с аккаунтом пользователя. У пользователя есть приватный канал, из которого надо брать статистику.
peer = await app.resolve_peer(channel_id)
if isinstance(peer, pyrogram.raw.types.InputPeerChannel):
    r = await app.send(
        pyrogram.raw.functions.stats.GetBroadcastStats(channel=peer),
        retries=1,
        timeout=10,
        sleep_threshold=0.1
    )
    print(r)

Этот код выдаёт ошибку:
pyrogram.errors.exceptions.see_other_303.StatsMigrate: [303 STATS_MIGRATE_X]: The statistics of the group/channel are stored in DC2 (caused by "stats.GetBroadcastStats")

Из неё можно догадаться, что брать данные надо с другого dc. Вопрос: как брать данные с нужного dc?
  • Вопрос задан
  • 226 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Emir2010
В исходном коде Pyrogram при скачивании файлов есть решение, необходимое для решения этой проблемы.

Решения заключается в создании временной сессии с нужным dc_id.

Прикладываю код функции, которая в безопасном режиме (не нужно думать о переключении dc_id) возвращает информацию по статистике канала
async def get_broadcast_stats(
            client: Client,
            dc_id: int,
            input_channel: InputChannel,
    ) -> BroadcastStats:
        session = Session(
            client=client,
            dc_id=dc_id,
            auth_key=await Auth(
                client=client,
                dc_id=dc_id,
                test_mode=await client.storage.test_mode(),
            ).create()
            if dc_id != await client.storage.dc_id()
            else await client.storage.auth_key(),
            test_mode=await client.storage.test_mode(),
            is_media=True,
        )

        try:
            await session.start()

            if dc_id != await client.storage.dc_id():
                exported_auth = await client.invoke(
                    query=functions.auth.ExportAuthorization(dc_id=dc_id),
                )

                await session.invoke(
                    query=functions.auth.ImportAuthorization(
                        id=exported_auth.id,
                        bytes=exported_auth.bytes,
                    ),
                )

            result = await session.invoke(
                query=functions.stats.GetBroadcastStats(channel=input_channel),
            )
        finally:
            await session.stop()

        return result
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы