پیشنیازها
- یکی از این دو برنامه روی کامپیوتر شما نصب شده باشد: اپ Antigravity یا 9Router. هر کدام را داشته باشید کافی است؛ لازم نیست هر دو را نصب کنید.
- یک حساب گوگل: حساب رایگان هم کار میکند (آزمایششده). بهتر است حساب جداگانه باشد، نه حساب اصلی شما.
- یک حساب Vercel: ساخت حساب رایگان است.
- پاورشل ویندوز: برای دستورهای استخراج زیر. نیازی به نصب برنامهی اضافی نیست.
۱ اعتبارنامهی اپ Antigravity
دو مقدار لازم دارید: Client ID و Client Secret. این دو مقدار، رمز شخصی شما نیستند؛ اعتبارنامهی عمومیِ اپ دسکتاپ Antigravity هستند که گوگل همراه خود اپ منتشر کرده است. بسته به اینکه کدام برنامه را دارید، یکی از دو راه زیر را دنبال کنید:
کدام برنامه را دارید؟ یکی را انتخاب کنید تا فقط دستورهای همان برنامه را ببینید:
راه الف — از اپ رسمی Antigravity
Antigravity
- اپ رسمی Antigravity را روی کامپیوتر خود نصب کنید. برای همین استخراج، ورود به اپ لازم نیست؛ مقدارها در خود فایلهای نصب هستند.
- پاورشل را باز کنید و این دستور را اجرا کنید تا فایلهایی که مقدار را دارند پیدا شوند:
# در همهی فایلهای پوشهی نصب Antigravity دنبال عبارت apps.googleusercontent.com میگردد
# کلید S یعنی زیرپوشهها را هم بگردد و کلید M یعنی فقط نام فایلها را نشان بدهد، نه خود متن را
findstr /S /M "apps.googleusercontent.com" "$env:LOCALAPPDATA\Programs\antigravity\*"
- سپس این اسکریپت را اجرا کنید تا شناسهها و سکرتها بهصورت مرتب و بدون تکرار چاپ شوند:
# پوشهی نصب Antigravity را بهعنوان ریشهی جستجو انتخاب میکند
$root = "$env:LOCALAPPDATA\Programs\antigravity"
# دو لیست خالی میسازد: یکی برای شناسهها و یکی برای سکرتها
$ids = @()
$secs = @()
# همهی فایلهای آن پوشه و زیرپوشههایش را یکییکی بررسی میکند
Get-ChildItem -Path $root -Recurse -File | ForEach-Object {
# متن هر فایل را با رمزگذاری لاتین میخواند تا کاراکترهای فایلهای باینری هم درست خوانده شوند
$text = [System.IO.File]::ReadAllText($_.FullName, [System.Text.Encoding]::GetEncoding(28591))
# شناسههای مشتری گوگل را با الگو پیدا میکند و به لیست شناسهها اضافه میکند
foreach ($m in [regex]::Matches($text, '[0-9]+-[a-z0-9]+\.apps\.googleusercontent\.com')) { $ids += $m.Value }
# سکرتها را با الگو پیدا میکند و به لیست سکرتها اضافه میکند
foreach ($m in [regex]::Matches($text, 'GOCSPX-[A-Za-z0-9_-]{28}')) { $secs += $m.Value }
# پایان بررسی فایلها
}
# شناسهها را مرتب میکند و تکراریها را حذف میکند
$ids | Sort-Object -Unique
# سکرتها را مرتب میکند و تکراریها را حذف میکند
$secs | Sort-Object -Unique
- دو لیست مشاهده میکنید: یکی شناسهها و یکی سکرتها. یکی از هر لیست را بردارید و پایین همین صفحه، در فیلدهای مرحلهی ۱، وارد کنید. اگر جفت اول جواب نداد، ترکیب بعدی را امتحان کنید (نکتهی زیر را بخوانید).
راه ب — از 9Router (اگر نصبش دارید، نیازی به نصب Antigravity نیست)
9Router
- اول: در 9Router از بخش Providers یک بار Antigravity را اضافه کنید. پس از این کار، مقدارها در فایلهای نصب 9Router هستند.
- پاورشل را باز کنید و این دو دستور را اجرا کنید تا ابتدا مسیر نصب پیدا شود و سپس فایلهای حاوی مقدار مشخص شوند:
# مسیر پوشهی نصب سراسری 9Router را پیدا میکند و در متغیر pkg میگذارد
$pkg = Join-Path (npm root -g) "9router"
# در همهی فایلهای آن پوشه دنبال عبارت apps.googleusercontent.com میگردد و فقط نام فایلها را نشان میدهد
findstr /S /M "apps.googleusercontent.com" "$pkg\*"
- سپس این اسکریپت را اجرا کنید تا شناسهها و سکرتها بهصورت مرتب و بدون تکرار چاپ شوند:
# مسیر پوشهی نصب سراسری 9Router را پیدا میکند
$pkg = Join-Path (npm root -g) "9router"
# از داخل آن، پوشهی ساختهشدهی برنامه را بهعنوان ریشهی جستجو انتخاب میکند
$root = Join-Path $pkg "app\.next-cli-build"
# دو لیست خالی میسازد: یکی برای شناسهها و یکی برای سکرتها
$ids = @()
$secs = @()
# همهی فایلهای آن پوشه و زیرپوشههایش را یکییکی بررسی میکند
Get-ChildItem -Path $root -Recurse -File | ForEach-Object {
# متن هر فایل را با رمزگذاری لاتین میخواند
$text = [System.IO.File]::ReadAllText($_.FullName, [System.Text.Encoding]::GetEncoding(28591))
# شناسههای مشتری گوگل را پیدا میکند و به لیست شناسهها اضافه میکند
foreach ($m in [regex]::Matches($text, '[0-9]+-[a-z0-9]+\.apps\.googleusercontent\.com')) { $ids += $m.Value }
# سکرتها را پیدا میکند و به لیست سکرتها اضافه میکند
foreach ($m in [regex]::Matches($text, 'GOCSPX-[A-Za-z0-9_-]{28}')) { $secs += $m.Value }
# پایان بررسی فایلها
}
# شناسهها را مرتب میکند و تکراریها را حذف میکند
$ids | Sort-Object -Unique
# سکرتها را مرتب میکند و تکراریها را حذف میکند
$secs | Sort-Object -Unique
- دو لیست مشاهده میکنید: یکی شناسهها و یکی سکرتها. یکی از هر لیست را بردارید و پایین همین صفحه، در فیلدهای مرحلهی ۱، وارد کنید. اگر جفت اول جواب نداد، ترکیب بعدی را امتحان کنید.
• وقتی اسکریپت را اجرا میکنید، دو لیست جدا میبینید: یکی شناسهها و یکی سکرتها. این دو لیست از دو کلاینت متفاوت گوگل میآیند که هر دو داخل فایلهای اپ هستند، و اسکریپت هر لیست را جداگانه مرتب میکند. پس اینکه شناسهی اول با سکرت اول جفت باشد، فقط یک حدس است، نه یک قاعده.
• تنها راه مطمئن شدن، امتحان کردن است: یک شناسه و یک سکرت را در مرحلهی ۱ وارد کنید و مرحلهی ۲ را اجرا کنید. اگر توکن برگشت، همان جفت درست است و کار تمام است. اگر خطا آمد، ترکیب بعدی را امتحان کنید. با دو شناسه و دو سکرت، در بدترین حالت فقط ۴ ترکیب وجود دارد، پس خیلی زود به جواب میرسید. اگر تعداد دو لیست با هم فرق داشت، تعداد ترکیبها همان ضرب دو تعداد است؛ مثلاً با سه شناسه و سه سکرت، در بدترین حالت ۹ ترکیب وجود دارد.
• یک دام رایج هم هست: گاهی سکرتی که از فایل درمیآید، بلندتر از حد واقعی است، چون دنبالهاش تکهای از دادههای اطراف آن در فایل است. سکرت واقعی دقیقاً ۲۸ کاراکتر بعد از GOCSPX- است؛ بقیهی رشته را نادیده بگیرید و فقط همان ۲۸ کاراکتر را وارد کنید.
۲ ورود با گوگل
دکمه را بزنید و با همان حسابی که میخواهید Relay روی آن کار کند وارد شوید و دسترسی را تایید کنید. حساب رایگان گوگل هم کار میکند (آزمایششده) و با اعتبارنامهی رسمی نیازی به اضافهکردن تستر نیست. سپس گوگل شما را به یک آدرس localhost میفرستد که باز نمیشود؛ این طبیعی است. کل آدرس را از نوار آدرس مرورگر کپی کنید و اینجا وارد کنید.
رفع اشکال
توکن برنگشت یا خطای ورود آمد
ابتدا نگران نباشید؛ این خطا تقریباً همیشه به این معناست که جفت شناسه و سکرت با هم هماهنگ نیستند، نه اینکه حسابتان مشکلی داشته باشد. دلیل آن این است: در فایلهای اپ، معمولاً دو شناسه و دو سکرت متفاوت وجود دارد (مربوط به دو کلاینت مختلف گوگل) و فقط یکی از جفتها کلاینت واقعی Antigravity است. دو لیستی که اسکریپت چاپ کرد، هر کدام جداگانه مرتب شدهاند، پس «اولی با اولی» لزوماً جفت درست نیست؛ فقط وقتی مرحلهی ۲ توکن برگرداند، مشخص میشود جفت درست را وارد کردهاید.
مثال با اسمهای فرضی (نه کد واقعی): فرض کنید لیست شناسهها این دو مورد است: «شناسهی الف» و «شناسهی ب»، و لیست سکرتها هم این دو مورد است: «سکرت ۱» و «سکرت ۲». پس فقط ۴ ترکیب ممکن است: الف+۱، الف+۲، ب+۱، ب+۲. قاعدهی کلی هم همین ضرب است: تعداد ترکیبها برابر است با تعداد شناسه ضربدر تعداد سکرت، پس اگر هر دو لیست ۳ مورد بودند، ۹ ترکیب میشود. هر بار یکی را در مرحلهی ۱ وارد میکنید و «دریافت توکن» را میزنید؛ ترکیبهایی که جواب نمیدهند خطا میدهند و رد میشوند. همان ترکیبی که توکن برگرداند، جفت درست است و دیگر لازم نیست بقیه را امتحان کنید. اگر همهی ترکیبها را امتحان کردید و هیچکدام توکن نداد، یعنی یا سکرت را ناقص کپی کردهاید (سکرت دقیقاً ۲۸ کاراکتر بعد از GOCSPX- است) یا از راه اشتباه استخراج کردهاید؛ یک بار دیگر اسکریپت همان راه را اجرا کنید و خروجی را با دقت کپی کنید.
کد منقضی شد (یا خطای کد نامعتبر آمد)
کدی که در آدرس برگشتی است، یکبارمصرف است و فقط حدود ۱۰ دقیقه اعتبار دارد؛ یعنی فقط یک بار میتوان با آن توکن گرفت و پس از ۱۰ دقیقه دیگر معتبر نیست. اگر دیر کردید، یا همان کد را دوبار وارد کردید، این خطا طبیعی است و ربطی به شناسه و سکرت ندارد. راهحل آن ساده است: دوباره «ورود با گوگل» را بزنید تا گوگل یک کد تازه بدهد، این بار همان لحظه کل آدرس را کپی کنید و سریع «دریافت توکن» را بزنید. نکته: هر بار که «ورود با گوگل» را میزنید، فقط همان کد آخری معتبر است؛ کدهای قبلی خودبهخود باطل میشوند.
آدرس برگشتی کد نداشت
کل نوار آدرس مرورگر را کپی کنید، نه فقط بخشی از آن. کد بعد از code= میآید و تا اولین & ادامه دارد.
پوشهی نصب پیدا نشد
برای 9Router دستور where.exe 9router یا npm root -g مسیر نصب را نشان میدهد. برای اپ Antigravity، پوشهی نصب معمولاً زیر %LOCALAPPDATA%\Programs\antigravity است.
بعد از Deploy داشبورد مدلها را نشان نداد
ابتدا مطمئن شوید Deploy کامل شده و وضعیت آن READY است. سپس پسورد داشبورد را بهدرستی وارد کنید. اگر باز هم خطای پروژه مشاهده کردید، توکن را با همان مراحل دوباره بگیرید و متغیرهای محیطی را در Vercel بهروز کنید و Redeploy بزنید.
بهروزرسانی رله به نسخهی تازه
داشبورد رله دکمهی «بهروزرسانی» دارد که نسخهی تازه را از ریپوی اصلی میگیرد و در ریپوی شما میریزد. برای اینکه دکمه کار کند، یک بار در متغیرهای محیطی پروژه در Vercel این دو مقدار را بگذارید و یک Redeploy بزنید: GH_SYNC_REPO یعنی ریپوی متصل به همین دیپلوی (مثلاً user/ag-relay، نه ریپوی اصلی) و GH_SYNC_TOKEN یعنی یک توکن گیتهاب که فقط به همان یک ریپو دسترسی نوشتن دارد. بعد از آن، از فوتر داشبورد «بررسی بهروزرسانی» را بزنید و اگر نسخهی تازه بود، «بهروزرسانی» را تأیید کنید. اگر این دو مقدار را نگذاشته باشید، دکمه میگوید آپدیتر تنظیم نشده؛ این خطا نیست، فقط یعنی هنوز تنظیم نشده است.
امنیت
این راهنما طوری ساخته شده که هیچ رازی از مرورگر شما بیرون نمیرود، ولی چند راز وجود دارد که خودتان باید مانند رمز حسابتان از آنها محافظت کنید. ابتدا تفاوت آنها را بشناسید:
چه چیزی راز نیست
شناسه و سکرت مرحلهی ۱، اعتبارنامهی عمومیِ خود اپ Antigravity هستند؛ همراه فایلهای نصب منتشر شدهاند و رمز شخصی شما نیستند. دانستن آنها بهتنهایی به کسی دسترسی به حسابتان نمیدهد.
چه چیزی راز است و چرا
- توکن گوگل (AG_REFRESH_TOKEN): کلید ورود به سهمیهی Antigravity حساب شماست؛ هر کس آن را داشته باشد میتواند با سهمیهی شما مدل صدا بزند. مانند رمز حسابتان نگهش دارید.
- کلید Relay (RELAY_API_KEY): هر کس این کلید را داشته باشد میتواند از رلهی شما استفاده کند و سهمیهی شما را مصرف کند.
- پسورد داشبورد (DASH_PASSWORD): کلید ورود به صفحهی مدیریت رلهی شماست.
کجا نگهشان دار
- فقط در متغیرهای محیطی (Environment Variables) پروژهی Vercel؛ Vercel آنها را رمزنگاریشده نگه میدارد. هیچوقت آنها را در کد، گیتهاب، فایل README یا پیام عمومی ننویسید.
- این صفحه هیچ مقداری را ذخیره یا ارسال نمیکند؛ همهی کارها فقط در مرورگر شما انجام میشود. با این حال، پس از پایان نصب، تب را ببندید تا مقادیر از حافظهی موقت مرورگر پاک شوند.
- حساب گوگلی که برای رله استفاده میکنید، بهتر است حساب جداگانه باشد نه حساب اصلی شما؛ اینطوری اگر روزی رازی لو رفت، فقط همان حساب درگیر است.
حساب پرو و خانوادهی گوگل
رله را با حساب اصلیتان راه نیندازید؛ یک حساب دوم بسازید. اگر حساب اصلیتان Pro دارد، لازم نیست برای حساب دوم هم Pro بخرید: در Google One یک گروه خانواده بسازید، حساب دوم را به آن اضافه کنید و گزینهی «Share Google One with family» را روشن کنید؛ آنوقت حساب دوم هم به مزایای هوش مصنوعی پرو، از جمله Antigravity، دسترسی پیدا میکند. نکتهی مهم: سقف هفتگی Antigravity برای کل خانواده یکی و مشترک است، یعنی حساب دوم سقف جداگانهای نمیگیرد و اگر حساب اصلی سقف را مصرف کند، برای حساب دوم چیزی نمیماند. شرطها: همهی اعضا باید در یک کشور باشند، حسابها شخصی باشند (نه کاری یا مدرسهای) و برای Antigravity بالای ۱۸ سال.
اگر چیزی لو رفت، فوری این سه کار را انجام دهید
- در حساب گوگل خود دسترسی اپ را قطع کنید: myaccount.google.com → Security → Third-party access و دسترسی مربوط به Antigravity را حذف کن؛ این کار توکن قبلی را باطل میکند.
- در همین راهنما یک توکن تازه بگیرید و کلید Relay و پسورد داشبورد تازه بسازید.
- مقادیر تازه را در Vercel جایگزین کنید و دوباره Deploy بزنید تا مقادیر لورفته دیگر کار نکنند.
هنگام ضبط ویدئو یا اسکرینشات
هنگام تدوین، روی توکن، کلید و پسورد را کامل بپوشانید؛ حتی چند فریم لو رفتن کافی است تا کسی آن را بردارد. برای ویدئوی آموزشی امنتر است که با یک پروژهی آزمایشی و مقادیر یکبارمصرف ضبط کنید و پس از ضبط، آن پروژه را پاک کنید.