Скачайте gateway.proto, сгенерируйте stubs и передавайте integration access token в metadata. TLS завершает nginx, адрес клиента — telegram.telefeeds.ru:443.
python -m pip install grpcio grpcio-tools protobuf python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. gateway.proto
import grpc
import gateway_pb2 as pb
import gateway_pb2_grpc as rpc
channel = grpc.aio.secure_channel(
"telegram.telefeeds.ru:443", grpc.ssl_channel_credentials()
)
client = rpc.TelegramGatewayStub(channel)
metadata = (("authorization", "Bearer tfi_..."),)
async def updates():
request = pb.SubscribeRequest(interface=0, close_other=False)
async for event in client.Subscribe(request, metadata=metadata):
# event.body is raw normalized Telegram TL update.
print(event.session_peer_id, event.body.hex())
async def invoke(peer_id: int, tl_request: bytes) -> bytes:
result = await client.Invoke(
pb.InvokeRequest(session_peer_id=peer_id, body=tl_request),
metadata=metadata,
)
if result.HasField("error"):
raise RuntimeError(result.error)
return result.body
# Pyrogram raw functions expose write():
# request_bytes = pyrogram.raw.functions.users.GetFullUser(id=peer).write()Invoke не принимает запросы, которые могут завершить managed-сессию, удалить аккаунт или изменить 2FA. Остальные raw TL-вызовы выполняются от имени аккаунта.
started = await client.BeginPhoneAuthorization(
pb.BeginPhoneAuthorizationRequest(phone_number="+995..."), metadata=metadata
)
completed = await client.CompletePhoneAuthorization(
pb.CompletePhoneAuthorizationRequest(
authorization_id=started.authorization_id,
code=input("Telegram code: "),
), metadata=metadata
)
if completed.state == pb.PHONE_AUTHORIZATION_STATE_PASSWORD_REQUIRED:
registered = await client.CompletePasswordAuthorization(
pb.CompletePasswordAuthorizationRequest(
authorization_id=started.authorization_id,
password=input("2FA password: "),
), metadata=metadata
)После успешной авторизации ClientHub сохраняет MTProto-сессию, связывает её с интеграцией и сразу отправляет в core с текущим proxy интеграции. Состояние SUBMITTING означает, что Telegram-вход уже завершён, а импорт в core будет повторён фоновым reconciler API.
Значения выбираются в порядке request → integration → server config. Каждый номер interface получает копию update. Несколько каналов одного interface делят update по round-robin. close_other=true закрывает уже существующие каналы этого interface; новые подключения после него разрешены. Поток live, без replay и ACK.
Текущий package — telefeeds.telegram.v1. Совместимые поля и RPC добавляются в v1. Несовместимый контракт получит новый package v2; v1 продолжит работать в период миграции.
Pyrogram можно использовать для TL-кодеков, но его сетевой Client запускать не нужно: сериализуйте raw function в bytes для Invoke и декодируйте возвращённые TL bytes. Каждая сессия на стороне клиента добавляет только маршрутизацию и EPS; MTProto-соединение и session state живут в Telefeeds.