#!/usr/bin/env python3 """Публикует инструкцию Ярославу на Telegra.ph""" import json import urllib.parse import urllib.request ACCESS_TOKEN = "c38dcadb86e6edd7efc76496d9171d38beef6dc0f6a7ef2cd79bbae70e46" VPN_KEY = "vpn://AAAIYXjanVVdcpswEH7PKTyevjl1QNiAM5MH100T4vwY06ZpQscjg-yoIYKAbMfN5Ay9RI_Qh850egf3Rl0hDHhMH1LwWOL7Pq1Wq13paacGT90LGceUkTip79duUkw8T3kvVeHFFOhNMCWOVcDrpq4oCtJ0tb5bIUFC0jEM1NE11KmUaKkEqQjs6K1KSUtIVA2Zmm4iU6nSnHhCo1VS9_gxNQATVPOUCb5dyTrpKo12JZctr4oLcMJHEOEJFeGrP7lMwC5EzYVvt4ibW9_NOSS5PGBlTsu4daTKXEtyRYhKpJVNWIbQNqRtQ61tqL0FnXgS0soYRDzzCFzdICiTRLsMO5mLRrsM5sEogTgIwgXxRzRKBHsjcckpzfTdKyxLfH9fQBL5nFvyAkoYt3w5ydX1ZY88ODYd8y_mO2tsX7KO-fHDu4fjuPfYGB7ZSTAJ9g7tcc88KLkjjYA369U2zabaNNVtSRTT-eiOLKUQzd-fzazItr1J_2qpWsNbpnfnR-Z8cnVMNM4YPfcXEekrj1XTRbNxYep_PU8zU5q4sRgn8QR75LPrsq7vxyRJage1fDl7GgLi7bkD4KvB0DrrDj-N4HO39so57F2cv82-QTSAdWJO-mQJ2hct02UnHozRRAfSBLqQI6KPH1NfFPHlqNCHNIEegh7khsuOBVaUEwCSWtcQAJoA8sIBoCVMFtXiMksYES3KWi1rW1nbli38bgaExCJSg9k4oJ5caq_xqfGle5TM8CmPptfzu-lpT_MeHobBZWe-uOh6dnAxPvWn9NA-SMNEklscE1-Odt5wyzBUNRz3LxuOjenRidroRHTv6lZ3rpdTf8GWuvpVH9gtMborq8AaiF3K0363lma6yw6ZH4WUcbEDCmoaalNFTdXU9zUDKSIeAzjyacIhl_qERDigcyK0IqylFLkNE36O70mWsmVLJdU9n60PH6OMR_kckKskGqWzZKbKZR6FMRdw6luBJndFir8oOoXlhMRzEm9Wy4u2Cc6MZ5dVHe7C6fS-EU5XCXiMWSJUUPghD4V25kf1DeHz5rjiOhZqfM_IV4pfi9s3lz3vyDNMXt8-meBZwHv_GpbLEi-mEadhesutvq9-rn6vfv35Bv8_Vj__fMuFLEnvOthk8ZZgJGGRZzm8zg5BbeRGfed55y-IVC9O" # Telegraph Node helpers def tag(name, children=None, attrs=None): n = {"tag": name} if children is not None: n["children"] = children if isinstance(children, list) else [children] if attrs: n["attrs"] = attrs return n def p(*children): return tag("p", list(children)) def h3(text): return tag("h3", [text]) def h4(text): return tag("h4", [text]) def b(text): return tag("strong", [text]) def i(text): return tag("em", [text]) def ul(items): return tag("ul", [tag("li", [c]) if not isinstance(c, dict) else tag("li", [c]) for c in items]) def li_nodes(children): return tag("li", children) def a(text, href): return tag("a", [text], {"href": href}) def code(text): return tag("code", [text]) def pre(text): return tag("pre", [text]) def hr(): return tag("hr") def br(): return tag("br") content = [ p("Привет! Это инструкция в 3 шага. Внизу есть ", b("логин/пароль Apple ID"), " и ", b("ключ VPN"), " — их можно скопировать одним тапом."), hr(), h3("📱 Если у тебя iPhone или iPad"), h4("Шаг 1. Выйти из своего Apple ID в App Store"), p("Это нужно только чтобы скачать приложение. Твои фото и контакты никуда не денутся."), tag("ol", [ tag("li", ["Открой ", b("«Настройки»"), " (серая шестерёнка)."]), tag("li", ["Наверху нажми на ", b("своё имя"), "."]), tag("li", ["Пролистай вниз до ", b("«Медиа и покупки»"), " → нажми."]), tag("li", ["В окошке нажми ", b("«Выйти»"), "."]), ]), p("⚠️ ", b("Важно!"), " Не нажимай «Выйти» в самом верху на своём имени — это не то. Выходишь ", b("только"), " в разделе «Медиа и покупки»."), h4("Шаг 2. Войти в американский Apple ID"), tag("ol", [ tag("li", ["Открой ", b("App Store"), " (синяя иконка с буквой А)."]), tag("li", ["В правом верхнем углу — кружок с силуэтом → нажми."]), tag("li", [b("«Войти»"), " или ", b("«Использовать другой Apple ID»"), "."]), tag("li", ["Введи логин и пароль — они ниже на этой странице."]), ]), h4("Шаг 3. Подтверждение входа"), p("Apple спросит, куда отправить код. Появится список номеров."), p("→ Выбери номер, ", b("который заканчивается на ...70"), " (это мой)."), p("→ Я получу SMS и сразу пришлю тебе цифры."), p("→ Введи их. App Store стал американским."), h4("Шаг 4. Скачать AmneziaVPN"), p("В App Store в строке поиска набери ", b("AmneziaVPN"), " → «Загрузить»."), h4("Шаг 5. Вернуть свой обычный Apple ID (рекомендую)"), p("Повтори Шаг 1, но в конце войди под своим прежним ID. Приложение останется, обновления будут от меня."), hr(), h3("💻 Если у тебя компьютер (Windows / Mac)"), p("Apple ID не нужен."), tag("ol", [ tag("li", ["Скачай AmneziaVPN: ", a("github.com/amnezia-vpn/amnezia-client/releases/latest", "https://github.com/amnezia-vpn/amnezia-client/releases/latest"), ". Windows — файл ", code("AmneziaVPN_x64_*.exe"), ", Mac — ", code("AmneziaVPN.dmg"), "."]), tag("li", ["Установи, открой."]), tag("li", ["Скопируй ключ VPN снизу этой страницы."]), tag("li", ["В программе: ", b("«+»"), " → ", b("«Вставить из буфера обмена»"), "."]), tag("li", ["Нажми большую кнопку включения."]), ]), h3("🤖 Если у тебя Android"), p("Apple ID не нужен."), tag("ol", [ tag("li", ["Открой Google Play, найди ", b("AmneziaVPN"), ", установи. Если в Play нет — скачай APK: ", a("github.com/amnezia-vpn/amnezia-client/releases/latest", "https://github.com/amnezia-vpn/amnezia-client/releases/latest"), "."]), tag("li", ["Скопируй ключ VPN снизу этой страницы."]), tag("li", ["В AmneziaVPN: ", b("«+»"), " → ", b("«Вставить»"), "."]), tag("li", ["Нажми большую кнопку включения."]), ]), hr(), h3("🔑 Подключить VPN (после установки)"), tag("ol", [ tag("li", ["Скопируй ключ ", code("vpn://..."), " внизу этой страницы (тап по блоку с ключом)."]), tag("li", ["Открой ", b("AmneziaVPN"), "."]), tag("li", ["Нажми ", b("«+»"), " (или «Добавить сервер»)."]), tag("li", [b("«Вставить из буфера обмена»"), " (англ. «Import from clipboard»)."]), tag("li", ["Сервер добавится сам."]), ]), h3("▶️ Включить"), p("На главном экране AmneziaVPN — ", b("большая круглая кнопка"), ". Нажми."), p("Всплывёт окошко ", b("«Разрешить подключения VPN»"), " → ", b("«Разрешить»"), ". Введи пароль от телефона если попросит."), p("Кнопка станет ", b("зелёной"), " — VPN работает."), h3("✅ Проверить"), p("Открой в Safari ", a("2ip.ru", "https://2ip.ru"), ". Должна показаться ", b("другая страна"), " (не Россия). Значит всё."), hr(), h3("📲 Поделиться с другим своим устройством"), p("Не проси у меня — AmneziaVPN сам делится:"), tag("ol", [ tag("li", ["В AmneziaVPN на рабочем устройстве нажми на сервер → иконка ", b("«i»"), " / ", b("«Подробнее»"), " → ", b("«Поделиться подключением»"), "."]), tag("li", ["Получишь ссылку → отправь себе в Telegram «Избранное» или на почту."]), tag("li", ["На втором устройстве установи AmneziaVPN → скопируй ссылку → «+» → «Вставить»."]), ]), hr(), h3("🍏 Apple ID (США) — логин и пароль"), p(i("Тапни по строке чтобы скопировать.")), pre("hbuggle819@icloud.com"), pre("App5870w"), p("При входе — выбирай номер для кода ", b("на ...70"), ". Напиши мне когда Apple попросит код."), hr(), h3("🔐 Ключ VPN"), p(i("Тапни по блоку ниже → «Копировать». Потом в AmneziaVPN «+» → «Вставить из буфера обмена».")), pre(VPN_KEY), hr(), h3("❓ Если что-то идёт не так"), tag("ul", [ tag("li", [b("Не пришёл код от Apple"), " — напиши, перевышлю."]), tag("li", [b("Кнопка не зелёная, пишет «ошибка»"), " — закрой приложение (свайпни вверх), открой снова. Не помогло — перезагрузи телефон."]), tag("li", [b("Android, VPN отваливается"), " — «Настройки телефона → Приложения → AmneziaVPN → Батарея → Без ограничений»."]), tag("li", [b("iPhone «Профиль VPN не найден»"), " — «Настройки → Основные → VPN и управление устройством». Если профиль AmneziaVPN там есть, удали его, вернись в AmneziaVPN и снова нажми «+» → «Вставить»."]), ]), p("Совсем не получается — скинь мне скриншот того что видишь, разберёмся вместе."), ] data = urllib.parse.urlencode({ "access_token": ACCESS_TOKEN, "title": "Настройка VPN", "author_name": "Олег", "content": json.dumps(content, ensure_ascii=False), "return_content": "false", }).encode() req = urllib.request.Request("https://api.telegra.ph/createPage", data=data) with urllib.request.urlopen(req) as resp: result = json.loads(resp.read().decode()) print(json.dumps(result, ensure_ascii=False, indent=2))