Простой Python-сценарий без каких-либо зависимостей, оборачивающий стандартный вывод при туннелировании локального окружения в интернет, для сервиса localhost.run.
Пригодится для разработки продуктов, требующих интеграции с различными сервисами, вроде серверов Telegram.
Работает с однонаправленной очередью на основе asyncio.Queue, отправитель которой помещается в задачу монитора, а получатель интегрируется в Вашу логику.
Пользоваться услугами localhost.run можно и без регистрации, но тогда динамически изменяемый адрес будет изменяться довольно часто. Рекомендуется пройти простую верификацию чтобы попасть в пространство личного кабинета, в разделе "SSH Keys" которого, произвести настройку ключа, который будет использоваться в соединении.
Если сгенерированного ключа ещё нет, завести его можно следуя этим инструкциям для:
Инструкции для Linux так же имеют указания и для того, как добавить сгенерированный ключ в окружение агента. Для Windows, среди прочих, можно пойти следующим путём:
- Пройдите по пути "Ваш системный диск(обычно это диск C):\Users[имя Вашего пользователя].ssh" и откройте файл с именем
config. Он не имеет расширения и открывается даже блокнотом. - Вставьте в него следующий текст:
Host localhost.run
HostName localhost.run
IdentityFile ~/.ssh/id_ed25519В некоторых случаях может потребоваться указать %UserProfile% вместо тильды(~).
3. Сохраните файл и закройте его.
4. В том же блокноте откройте файл id_ed25519.pub и скопировав его содержимое, вставьте в поле "SSH public key" в разделе "SSH Keys", в личном кабинете сайта localhost.run, для доступа к которому Вы уже должны были пройти верификацию.
5. Там же заполните поле "description", чтобы у ключа было отличимое имя.
6. Примените изменения.
Теперь, при выполнении в терминале дефолтного:
ssh -R 80:localhost:8080 localhost.runПеред выводом текущего публичного адреса, по которому доступен Ваш localhost, должно быть упоминание почты, которая была использована для авторизации.
Это сделает событие изменения адреса заметно реже.
Клонируйте этот репозиторий в папку проекта:
git clone https//:...import asyncio
from localhost_run import (
monitor, Channel, Receiver)
RED_CMD = "\x1b[31m{}\x1b[0m"
GREEN_CMD = "\x1b[32m{}\x1b[0m"
async def repeater(receiver: Receiver[str]) -> None:
print(GREEN_CMD.format("Starting URL repeater..."))
while True:
print("Waiting for URL...")
try:
url = await receiver.recv()
except asyncio.CancelledError:
print(RED_CMD.format("URL repeater stopped"))
break
print(f"{GREEN_CMD.format('Received URL:')} {url}")
async def main() -> None:
channel = Channel[str]()
sender, receiver = channel()
print("Press Ctrl+C to stop")
print(GREEN_CMD.format("Test starting..."))
repeater_task = asyncio.create_task(repeater(receiver))
monitor_task = asyncio.create_task(monitor(
sender, on_host="80:localhost:8000"))
await monitor_task
repeater_task.cancel()
await repeater_task
print(GREEN_CMD.format("Test finished"))
if __name__ == "__main__":
asyncio.run(main())