Зачем это нужно
Когда нужно получить доступ к серверу, запущенному в Colab, стандартное решение — внешние туннели. Но у популярных инструментов есть проблемы:
ngrok — TCP-эндпоинты теперь требуют привязки банковской карты. Формально бесплатно, но карту давай.
cloudflared — периодические таймауты при работе с Colab, плюс каждый перезапуск ноутбука генерирует новый случайный субдомен.
При этом в Colab есть встроенный механизм для проксирования портов, который большинство игнорирует.
Как работает proxyPort
Colab предоставляет функцию google.colab.output.eval_js, которая позволяет получить публичный URL для любого локального порта:
from google.colab.output import eval_js url = eval_js("google.colab.kernel.proxyPort(8000)") print(url)
На выходе — URL вида https://{port}-{instance-id}.{region}.prod.colab.dev. Это не туннель, а встроенный прокси самого Colab.
Проблема: просто так не достучаться
Если попробовать сделать запрос по этому URL через requests — ничего не выйдет. Colab защищает доступ к порту через аутентификацию на основе куки.
Нужный куки называется colab-runtime-proxy-token . Получить его можно только из браузерной сессии с активным Colab:
Открыть URL в браузере
Открыть DevTools → Application → Cookies
Найти
colab-runtime-proxy-token
Решение: передаём токен в запросах
Имея токен, можно обращаться к серверу программно из любого места:
import requests url = "https://{port}-{instance-id}.{region}.prod.colab.dev/endpoint" cookies = {"colab-runtime-proxy-token": "ВАШ_ТОКЕН"} response = requests.get(url, cookies=cookies)
Полный пример
В Colab — запускаем сервер:
from fastapi import FastAPI import uvicorn from google.colab.output import eval_js import threading app = FastAPI() @app.get("/ping") def ping(): return {"status": "ok"} url = eval_js("google.colab.kernel.proxyPort(8000)") print(f"URL: {url}") threading.Thread(target=lambda: uvicorn.run(app, host="0.0.0.0", port=8000)).start()
Или
url = eval_js("google.colab.kernel.proxyPort(8000)") print(f"URL: {url}") from fastapi import FastAPI import uvicorn from google.colab.output import eval_js import threading app = FastAPI() @app.get("/ping") def ping(): return {"status": "ok"} uvicorn.run(app, host="0.0.0.0", port=8000)
Снаружи — делаем запрос:
import requests url = "https://{port}-{instance-id}.{region}.prod.colab.dev/ping" cookies = {"colab-runtime-proxy-token": "ВАШ_ТОКЕН"} print(requests.get(url, cookies=cookies).json()) # {'status': 'ok'}
Ограничения
Сервер живёт пока Colab не отключит runtime (до 12 часов на бесплатном плане)
URL меняется при каждом перезапуске ноутбука
0ka
У меня нету такой куки ;(
Ferraro Автор
Попробуй через Network:
Получи URL через
eval_jsи открой его в браузере (вкладку с Colab не закрывай)Открой DevTools (F12) -> вкладка Network
Обнови страницу (F5) - появятся запросы
Кликни на последний запрос к твоему домену (
prod.colab.dev)Вкладка Headers -> раздел Request Headers -> найди поле
cookie, или вкладка Cookies -> там будетcolab-runtime-proxy-tokenотдельной строкойТам будет
colab-runtime-proxy-token=...- это и есть нужный токен