Смотрите. Вы получаете словарь ключ: значение. Вы никогда не знаете, какой именно будет ключ. Но вы знаете, что в словаре всегда одна строка, и что значение тоже содержит словарь, в котором ключи уже известны:
response = {
1448413438: pyrogram.raw.types.ChannelForbidden(
id=1448413438,
access_hash=8335995624985435932,
title='N',
broadcast=True,
megagroup=False
)
}
Значит, вам просто надо обратиться к первому по счёту значению. Для этого у dict есть два метода: keys() и values(). Они выдадут вам ключи и значения по отдельности. Внимание, результат будет not subscriptable, то есть, чтобы к обращаться к значениям, вам нужно преобразовать результат в list или tuple. Кстати, если вы преобразуете в них сам словарь, они отдадут вам именно список/кортеж самих ключей, то есть писать response.keys() необязательно, можно написать просто response.
Вариантов, таким образом, может быть несколько. Например, можно обратиться к значению напрямую:
tuple(response.values())[0]['id']
Либо пойти через ключ (для краткости не буду объявлять переменную, но суть понятна, надеюсь):
response[tuple(response)[0]]['id']
Конечно, если в возвращаемом словаре на первом уровне пар ключ/значение будет больше одной, задача слегка усложнится. Здесь вам как раз поможет извлечение пришедших ключей.
reps_keys = tuple(response)
Хотя что с ними делать, если они совершенно произвольны, я не могу представить. Но вдруг зачем-то нужно (например, сохранять на будущее, чтобы потом извлекать конкретный ответ).