İçeriğe geç

BelgelerOtomasyon

Yerel API

Sözleşmeyle son karşılaştırma: Eylül 2026

Yayımlandı ve bugün indirebileceğiniz sürümde yer alıyor — hem macOS’te hem Windows’ta. Açma kapama düğmesi uygulamanın ayarlarındadır ve siz açana kadar API kapalı kalır. O sürümün hangi çağrıları yanıtladığı, burada bir sonraki sürümün yanlış kılacağı bir cümleye yazılmak yerine aşağıdaki her işlemin ve her örneğin üzerinde işaretlidir.

Aynı makinedeki bir betik, bir profilin tarayıcısını yönetebileceği bir şeye dönüştürür. Arayüz tek bir hizmet, tek bir anahtar ve tek bir adres dosyasından oluşur — her şey onların üzerinde durduğu için önce onlar anlatılır — ve bunların üstünde birkaç rota vardır: bir profili bulmak, açmak, Puppeteer, Playwright veya Selenium’u yanıt olarak verdiği adrese bağlamak, sonra yeniden kapatmak.

Uygulamanın arayüzü yalnızca İngilizce ve Rusçadır. Düğme ve ayar adları bu sayfada İngilizce arayüzde göründüğü gibi yazılmıştır.

Nasıl açılır

Varsayılan olarak kapalıdır ve yalnızca bu bilgisayardan erişilebilir.

Düğme
Settings → API & Automation bölümünü açın ve Local API’yi etkinleştirin. Siz açana kadar hiçbir şey dinlemez: port açılmaz ve bir betik boş bir yanıt değil, reddedilmiş bir bağlantı alır.
Yalnızca bu bilgisayar
Hizmet bağlantıları 127.0.0.1 üzerinde kabul eder, başka hiçbir yerde etmez. Ağınızdaki başka bir makine ona ulaşamaz ve onu dışarıya açan bir ayar da yoktur — betik Liminal’in yanında çalışır, ona ağ üzerinden ulaşmaz.
Port
Varsayılan değer 48361; makinede zaten dinleyen başka bir tarayıcıyla çakışmasın diye Liminal’in kendi portudur. Farklı bir port yazın ya da Random free port’a basıp seçimi uygulamaya bırakın. Değişiklik, Liminal yeniden başlatılmadan hemen geçerli olur.
Port doluysa
Port bağlanamazsa ekranda Port in use yazar ve adres dosyası port_in_use bildirir. Siz başka bir port seçene kadar hiçbir şey dinlemez; böylece dosyayı okuyan bir betik “kapalı” ile “başlatılamadı” arasındaki farkı bilir.

Anahtar

Tek bir anahtar; bir kez gösterilir ve işletim sisteminizin gizli bilgileri sakladığı yerde tutulur.

Göründüğünde kopyalayın
API etkinleştirildiğinde 64 küçük harfli onaltılık karakterden oluşan bir anahtar üretilir ve bir kez gösterilir. Ekrandan ayrılırsanız gizlenir: uygulama onu yeniden gösteremez, yalnızca yenisini üretebilir.
Nerede saklanır
macOS’te Keychain, Windows’ta Credential Manager içinde — hiçbir zaman bir ayar dosyasında, bir eşitleme anlık görüntüsünde veya bir günlükte değil, aşağıdaki adres dosyasında da değil. Kendi kopyanızı, betiğinizin kullandığı diğer kimlik bilgilerini sakladığınız gibi saklayın.
Nasıl iptal edilir
Regenerate key yeni bir anahtar üretir ve eskisini hemen kabul etmeyi bırakır; uygulama yeniden başlatılmaz, port da değişmez. Eski anahtarı hâlâ elinde tutan bir betik, sonraki istekten itibaren reddedilir.
Nasıl gönderilir
Her istek anahtarı tek bir üstbilgide taşır: Authorization: Bearer ve ardından anahtarın kendisi. Sorgu parametresi de çerez de yoktur; üstbilgisi olmayan bir istek, yanlış anahtarlı bir istek gibi reddedilir.

Betik adresi nerede bulur

Uygulama adresini bir dosyaya yazar; böylece hiçbir şeyi iki kez yazmanız gerekmez.

Dosya
Ayarlar ekranı, Liminal’in kullanıcı verileri dizinindeki Local API/status.json dosyasının tam yolunu gösterir. Bir portu koda gömmek yerine onu okuyun: hem sizin belirlediğiniz portu hem de Random free port’un seçtiğini izler.
İçinde ne var
Dört alan — enabled, status, address, port — ve hiçbir türden gizli bilgi yok.
{"enabled":true,"status":"running","address":"http://127.0.0.1:48361","port":48361}
API kapalıyken
Dosya yerinde kalır ve bunu söyler: off, boş bir adres ve port yok. Aynı biçim, farklı bir durum — betik her şeyi öğrenmek için tek bir dosya okur.
{"enabled":false,"status":"off","address":"","port":0}
Bütün olarak değiştirilir, asla yarım yazılmaz
Her değişiklik — API’nin açılması veya kapatılması, yeni bir port, bağlanamayan bir port — dosyayı atomik olarak yeniden yazar. Değişiklik sırasında onu okuyan bir betik ya eski içeriği ya da yenisini görür, asla yarıda kesilmiş bir satırı görmez.

Durum isteği

İlk yapılacak çağrı: Liminal çalışıyor mu ve giriş yapmış biri var mı.

Çağrı
Dosyadaki adreste /v1/status yoluna, anahtar üstbilgide olacak şekilde bir GET.
curl -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/status
Yanıt
HTTP 200; çalışan sürümün sürüm numarası ve uygulamada giriş yapmış biri olup olmadığı ile birlikte. signedIn değerinin false olması bir hata değildir — API yanıt verir; hesap gerektirenler, kataloğu okuyan veya bir profil açan işlemlerdir.
{"status":"running","version":"<version>","signedIn":true}
Eksik veya iptal edilmiş anahtar
HTTP 401 ve invalid_key kodu — kalıcıdır ve dallanmanın yapılacağı şey budur. Yanındaki ileti, uygulamanın günlük okuyan bir insan için seçtiği kendi ifadesidir; onu sözleşmenin bir parçası olarak değil, değişebilecek bir metin olarak görün.
{"error":{"code":"invalid_key","message":"Неверный ключ"}}
Tam olarak dosyadaki gibi adresleyin
127.0.0.1 adresini ve dosyadaki portu kullanın. Başka bir ana makine adıyla gelen istek, aynı porta ulaşsa bile yanıtlanmaz — hizmet yalnızca kendi adresine yanıt verir.
Daha eski bir Liminal ne yapar
Hiçbir şey: port açılmaz, bu yüzden ona bağlanan bir betik reddedilir. Bir betik, yerel API’si olmayan bir sürümü onu kapalı tutan bir sürümden bu retle ayırır — ikinci durumda adres dosyası vardır ve off yazar.

Bu sürüm neyi yapar, neyi yapmaz

Açıkça söylendi ki buradaki hiçbir şey, olmadığı bir söz gibi okunmasın.

Bir işlem, sürümünüze ulaşmadan önce bu sayfaya ulaşır
Arayüz sürümden sürüme büyür ve yazılmış bir çağrı, onu yanıtlayan sürümden önce burada belgelenir — işaretlenerek, asla gizlenmeden. Bu yüzden söze değil işarete bakın: aşağıdaki her işlemin ve her örneğin üzerindedir ve betiğe dökmek üzere olduğunuz şeyin elinizdeki uygulamada çalışıp çalışmadığını o söyler.
Hangi planlar için
Ücretsiz olan dahil her plan. Yerel API ücretli bir kademe değildir: kendi makinenizdeki bir betik, pek çok kişinin antidetect tarayıcıyı kullanma biçimidir ve bunu bir planın arkasına koymak bu kullanımdan vergi almak olurdu.Planlar
Bir betik ne sıklıkla sorabilir
Planınıza bağlı bir kota yoktur. Hizmet kendini istek yağmurundan korur; onun için yazılmış bir betik bunu fark etmez.
Otomasyon altındaki profil aynı profildir
Parmak izini, proxy’sini ve çerezlerini korur ve ağa, onu elle açtığınızdaki gibi kendi proxy’si üzerinden ulaşır. API bir giriş yoludur, tarayıcının ikinci bir modu değil.Veri ve güvenlik

Her işlem, tek tek

Her rotanın ne için olduğu, ne aldığı, ne yanıtladığı ve verebileceği her ret. Bir işlemin yanındaki rozet, bugün indirebileceğiniz sürümün onu yanıtlayıp yanıtlamadığını söyler.

GET /v1/status

Yayımlanan sürümde var

Liminal çalışıyor mu ve giriş yapmış biri var mı

En ucuz çağrıdır ve uygulamayı beklerken yoklanacak olan da odur. Hesap olmadan da yanıt verir: signedIn değerinin false olması bir durumdur, hata değil.

Parametreler

Yok.

Yanıt

{
  "status": "running",
  "version": "<version>",
  "signedIn": true
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.

GET /v1/profiles

Yayımlanan sürümde var

Katalogdaki profiller; filtrelenmiş ve sayfalanmış

Uygulamanın gösterdiği kataloğun aynısını okur. Filtreler birleştirilebilir ve name dışında hepsi tam eşleşme arar; name ise adı yazdığınızı içeren her profille, büyük küçük harf ayırmadan eşleşir.

Parametreler

pagequery · integer · isteğe bağlı · 1 ile 1000000 arası · varsayılan: 1
Birden başlayarak sayıldığında hangi sayfanın okunacağı.
pageSizequery · integer · isteğe bağlı · 1 ile 100 arası · varsayılan: 100
Bir sayfada kaç profil bulunduğu. Üst sınır varsayılan değerdir.
workspaceIdquery · string · isteğe bağlı
Yalnızca o çalışma alanının profilleri.
folderIdquery · string · isteğe bağlı
Yalnızca o klasörün profilleri.
statusquery · string · isteğe bağlı
Yalnızca o durumdaki profiller; running, açık bir profilin durumudur.
namequery · string · isteğe bağlı
Yalnızca adı bunu içeren profiller; büyük küçük harf ayrımı yapılmaz.

Yanıt

{
  "page": 1,
  "pageSize": 100,
  "total": 1,
  "items": [
    "<profile>"
  ]
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 400 invalid_pagination — page veya pageSize kabul edilen aralığın dışında.

GET /v1/profiles/{id}

Yayımlanan sürümde var

Tek bir profil; proxy’si ve parmak iziyle birlikte

Listenin döndürdüğü nesnenin aynısı, tek bir tanımlayıcı için. Proxy adresi gösterilir; parolası asla gösterilmez.

Parametreler

idpath · string · zorunlu
Katalog işlemlerinin döndürdüğü biçimiyle profil tanımlayıcısı.

Yanıt

{
  "id": "<profile-id>",
  "name": "Shop EU",
  "workspaceId": "<workspace-id>",
  "folderId": "<folder-id>",
  "status": "running",
  "health": "ok",
  "proxy": {
    "id": "<proxy-id>",
    "name": "Residential DE",
    "type": "socks5",
    "host": "proxy.example.net",
    "port": 1080,
    "working": true,
    "lastCheckedExternalIp": "203.0.113.10",
    "lastCheckedCountryCode": "DE"
  },
  "fingerprint": {
    "platform": "MacIntel",
    "language": "de-DE",
    "timezone": "Europe/Berlin"
  },
  "lastOpenedAt": "2026-09-30T08:15:00.000Z"
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 404 profile_not_found — Katalogda bu tanımlayıcıya sahip bir profil yok.

POST /v1/profiles/{id}/start

Yayımlanan sürümde var

Bir profili açın ve sürücünün bağlanacağı adresi alın

Profili uygulamanın yaptığı gibi başlatır — parmak izi, proxy’si, çerezleriyle — ve tarayıcı ayağa kalkınca CDP adresiyle yanıt verir. Çağrı bekler; yoklanacak bir iş döndürmez.

Parametreler

idpath · string · zorunlu
Katalog işlemlerinin döndürdüğü biçimiyle profil tanımlayıcısı.
debugPortbody · integer · isteğe bağlı · 1024 ile 65534 arası · varsayılan: 0
CDP uç noktasının bağlandığı port. 0 verilirse boş bir portu uygulama seçer; başka her değer, kullanıcınızın bağlanabildiği bir port olmalıdır.
timeoutSecondsbody · integer · isteğe bağlı · 1 ile 180 arası · varsayılan: 60
Çağrının vazgeçmeden önce profilin açılmasını ne kadar beklediği.
maskAutomationbody · boolean · isteğe bağlı · varsayılan: true
Yalnızca true kabul edilir. Otomasyon maskeleme kapatılamaz: bir betiğin yönettiği profil, onu elle açtığınızda bir sitenin gördüğü profilin aynısıdır.

Yanıt

{
  "id": "<profile-id>",
  "status": "running",
  "cdpDiscoveryUrl": "http://127.0.0.1:48361/devtools/<token>/json/version",
  "cdpBrowserUrl": "ws://127.0.0.1:9222/devtools/browser/<token>",
  "seleniumDebuggerUrl": "127.0.0.1:9222",
  "chromedriverPath": "/Applications/Liminal.app/.../chromedriver",
  "debugPort": 9222,
  "debugAddress": "127.0.0.1:9222",
  "externalIp": "203.0.113.10",
  "countryCode": "DE"
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 503 runtime_unavailable — Uygulama şu anda bir profili başlatamıyor veya durduramıyor.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 404 profile_not_found — Katalogda bu tanımlayıcıya sahip bir profil yok.
  • 409 profile_already_running — Profil zaten açık, başlatılması hâlâ sürüyor veya daha önce verilmiş bir sürücü adresi hâlâ geçerli.
  • 400 invalid_start_options — Gövde bir JSON nesnesi değil.
  • 400 invalid_port — debugPort ne 0 ne de kabul edilen aralıktaki bir port.
  • 400 invalid_start_timeout — timeoutSeconds kabul edilen aralığın dışında.
  • 400 masking_unavailable — maskAutomation false olarak gönderildi; uygulama bunu sunmuyor.
  • 409 port_in_use — İstediğiniz hata ayıklama portu dolu.
  • 409 listen_failed — Hata ayıklama portu başka bir nedenle bağlanamadı.
  • 409 start_failed — Profil açılmadı. Uygulama söyleyebildiğinde güvenli bir detail alanı aşamanın adını verir.
  • 409 proxy_unavailable — Profil proxy’sini şart koşuyor ve proxy yanıt vermedi.
  • 502 start_failed — Profilin hazırlanması, tarayıcıdan başlaması istenmeden önce başarısız oldu.
  • 503 cdp_unavailable — Profil başladı ama CDP uç noktası ayağa kalkmadı.
  • 504 start_timeout — Profil timeoutSeconds süresi içinde açılmadı.

POST /v1/profiles/{id}/attach-automation

Yayımlanan sürümde var

Zaten açık olan bir profil için sürücü adresi alın

Elle açtığınız ve şimdi yönetmek istediğiniz bir profil içindir. Hiçbir şeyi yeniden başlatmaz: oturum, sekmeleri ve çerezleri olduğu gibi kalır.

Parametreler

idpath · string · zorunlu
Katalog işlemlerinin döndürdüğü biçimiyle profil tanımlayıcısı.
debugPortbody · integer · isteğe bağlı · 1024 ile 65534 arası · varsayılan: 0
CDP uç noktasının bağlandığı port. 0 verilirse boş bir portu uygulama seçer; başka her değer, kullanıcınızın bağlanabildiği bir port olmalıdır.
timeoutSecondsbody · integer · isteğe bağlı · 1 ile 180 arası · varsayılan: 60
Çağrının vazgeçmeden önce profilin açılmasını ne kadar beklediği.
maskAutomationbody · boolean · isteğe bağlı · varsayılan: true
Yalnızca true kabul edilir. Otomasyon maskeleme kapatılamaz: bir betiğin yönettiği profil, onu elle açtığınızda bir sitenin gördüğü profilin aynısıdır.

Yanıt

{
  "id": "<profile-id>",
  "status": "running",
  "cdpDiscoveryUrl": "http://127.0.0.1:48361/devtools/<token>/json/version",
  "cdpBrowserUrl": "ws://127.0.0.1:9222/devtools/browser/<token>",
  "seleniumDebuggerUrl": "127.0.0.1:9222",
  "chromedriverPath": "/Applications/Liminal.app/.../chromedriver",
  "debugPort": 9222,
  "debugAddress": "127.0.0.1:9222",
  "externalIp": "203.0.113.10",
  "countryCode": "DE"
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 503 runtime_unavailable — Uygulama şu anda bir profili başlatamıyor veya durduramıyor.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 404 profile_not_found — Katalogda bu tanımlayıcıya sahip bir profil yok.
  • 409 profile_already_running — Profil zaten açık, başlatılması hâlâ sürüyor veya daha önce verilmiş bir sürücü adresi hâlâ geçerli.
  • 400 invalid_start_options — Gövde bir JSON nesnesi değil.
  • 400 invalid_port — debugPort ne 0 ne de kabul edilen aralıktaki bir port.
  • 400 invalid_start_timeout — timeoutSeconds kabul edilen aralığın dışında.
  • 400 masking_unavailable — maskAutomation false olarak gönderildi; uygulama bunu sunmuyor.
  • 409 port_in_use — İstediğiniz hata ayıklama portu dolu.
  • 409 listen_failed — Hata ayıklama portu başka bir nedenle bağlanamadı.
  • 409 start_failed — Profil açılmadı. Uygulama söyleyebildiğinde güvenli bir detail alanı aşamanın adını verir.
  • 409 proxy_unavailable — Profil proxy’sini şart koşuyor ve proxy yanıt vermedi.
  • 502 start_failed — Profilin hazırlanması, tarayıcıdan başlaması istenmeden önce başarısız oldu.
  • 503 cdp_unavailable — Profil başladı ama CDP uç noktası ayağa kalkmadı.
  • 504 start_timeout — Profil timeoutSeconds süresi içinde açılmadı.
  • 409 profile_not_running — Profil açık değil, bu yüzden bağlanılacak bir şey yok.

POST /v1/profiles/{id}/stop

Yayımlanan sürümde var

Bir profili, penceresinin kapatacağı gibi kapatın

Oturumun durumunu yazmayı bitirmesine izin verir. Aynı profilde betikle yapılan çalıştırmalar arasında çağrılacak olan budur.

Parametreler

idpath · string · zorunlu
Katalog işlemlerinin döndürdüğü biçimiyle profil tanımlayıcısı.

Yanıt

{
  "id": "<profile-id>",
  "status": "closed"
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 503 runtime_unavailable — Uygulama şu anda bir profili başlatamıyor veya durduramıyor.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 404 profile_not_found — Katalogda bu tanımlayıcıya sahip bir profil yok.
  • 409 profile_not_running — Profil açık değil, bu yüzden kapatılacak bir şey yok.
  • 409 stop_failed — Uygulama profili kapatamadı.

POST /v1/profiles/{id}/force-stop

Yayımlanan sürümde var

Kapanmayan bir profili kapatın

Aynı yanıt, oturumun durulmasını beklemeden. Olağan bir yol olarak değil, bir durdurma geri dönmediğinde başvurun.

Parametreler

idpath · string · zorunlu
Katalog işlemlerinin döndürdüğü biçimiyle profil tanımlayıcısı.

Yanıt

{
  "id": "<profile-id>",
  "status": "closed"
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 503 runtime_unavailable — Uygulama şu anda bir profili başlatamıyor veya durduramıyor.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.
  • 404 profile_not_found — Katalogda bu tanımlayıcıya sahip bir profil yok.
  • 409 profile_not_running — Profil açık değil, bu yüzden kapatılacak bir şey yok.
  • 409 stop_failed — Uygulama profili kapatamadı.

GET /v1/running-profiles

Yayımlanan sürümde var

Şu anda ne açık ve ne yönetilebilir

Açık olan her profil; onu ister bir pencere ister bir çağrı açmış olsun — hangisi olduğunu startedBy söyler — varsa sürücü adresiyle birlikte. Betiğiniz yeniden başladıktan sonra buradan yeniden bağlanın.

Parametreler

Yok.

Yanıt

{
  "items": [
    {
      "id": "<profile-id>",
      "workspaceId": "<workspace-id>",
      "status": "running",
      "automationAvailable": true,
      "startedBy": "api",
      "cdpBrowserUrl": "ws://127.0.0.1:9222/devtools/browser/<token>",
      "seleniumDebuggerUrl": "127.0.0.1:9222",
      "chromedriverPath": "/Applications/Liminal.app/.../chromedriver",
      "debugPort": 9222,
      "debugAddress": "127.0.0.1:9222"
    }
  ]
}

Retler

  • 401 invalid_key — Anahtar eksik, bozuk biçimli veya o zamandan beri yeniden üretilmiş.
  • 403 not_signed_in — Uygulamada kimse giriş yapmamış; katalog işlemleri bir hesap gerektirir.
  • 403 team_closed — Etkin ekip kapalı: planını yenileyin veya başka bir ekibe geçin.
  • 503 catalog_loading — Profil kataloğu hâlâ yükleniyor. Yeniden sorun.
  • 503 catalog_unavailable — Uygulama profil kataloğunu açamadı.

Bir profili kendi betiğinizden yönetmek

Her blok eksiksizdir: adres dosyasını okur, API’yi çağırır ve sürücüyü bağlar. Birini kopyalayın, içine kendi profilinizin adını yazın; çalışır. Rozet, bugün indirebileceğiniz sürümün o bloğun gerektirdiği her şeyi yanıtlayıp yanıtlamadığını söyler.

Puppeteer (JavaScript)

Yayımlanan sürümde var

Başlatma çağrısının yanıt olarak verdiği adrese CDP üzerinden bağlanır — bir Puppeteer betiğinin zaten çalışan bir tarayıcıya ulaşma biçimi.

Çağırdıkları: /v1/profiles · /v1/profiles/{id}/start

import { readFileSync } from 'node:fs'
import puppeteer from 'puppeteer-core'

// Local API/status.json, inside Liminal's user-data directory. The settings
// screen shows the absolute path; that path and the key are your script’s to
// keep — the app puts neither into the environment for you.
const { address } = JSON.parse(readFileSync(process.env.LIMINAL_ADDRESS_FILE, 'utf8'))

async function call(path, init) {
  const response = await fetch(address + path, {
    ...init,
    headers: { Authorization: `Bearer ${process.env.LIMINAL_API_KEY}` },
  })
  const body = await response.json()
  if (!response.ok) throw new Error(body.error.code)
  return body
}

const { items } = await call('/v1/profiles?name=' + encodeURIComponent('Shop EU'))
const started = await call(`/v1/profiles/${items[0].id}/start`, { method: 'POST' })

const browser = await puppeteer.connect({ browserWSEndpoint: started.cdpBrowserUrl })
const page = await browser.newPage()
await page.goto('https://example.com')
console.log(await page.title())
await browser.disconnect()

Playwright (JavaScript)

Yayımlanan sürümde var

Aynı bağlantı, Playwright’ın CDP giriş noktası üzerinden; yeni bir bağlama değil, profilin zaten sahip olduğu bağlama.

Çağırdıkları: /v1/profiles · /v1/profiles/{id}/start

import { readFileSync } from 'node:fs'
import { chromium } from 'playwright'

// Local API/status.json, inside Liminal's user-data directory. The settings
// screen shows the absolute path; that path and the key are your script’s to
// keep — the app puts neither into the environment for you.
const { address } = JSON.parse(readFileSync(process.env.LIMINAL_ADDRESS_FILE, 'utf8'))

async function call(path, init) {
  const response = await fetch(address + path, {
    ...init,
    headers: { Authorization: `Bearer ${process.env.LIMINAL_API_KEY}` },
  })
  const body = await response.json()
  if (!response.ok) throw new Error(body.error.code)
  return body
}

const { items } = await call('/v1/profiles?name=' + encodeURIComponent('Shop EU'))
const started = await call(`/v1/profiles/${items[0].id}/start`, { method: 'POST' })

const browser = await chromium.connectOverCDP(started.cdpBrowserUrl)
const page = await browser.contexts()[0].newPage()
await page.goto('https://example.com')
console.log(await page.title())
await browser.close()

Playwright (Python)

Yayımlanan sürümde var

Aynı işin Python tarafı; adres dosyasını standart kitaplığın dışında hiçbir şey kullanmadan okur.

Çağırdıkları: /v1/profiles · /v1/profiles/{id}/start

import json
import os
import urllib.parse
import urllib.request
from playwright.sync_api import sync_playwright

# Local API/status.json, inside Liminal's user-data directory. The settings
# screen shows the absolute path; that path and the key are your script’s to
# keep — the app puts neither into the environment for you.
with open(os.environ["LIMINAL_ADDRESS_FILE"], encoding="utf-8") as handle:
    address = json.load(handle)["address"]


def call(path, method="GET"):
    request = urllib.request.Request(address + path, method=method)
    request.add_header("Authorization", "Bearer " + os.environ["LIMINAL_API_KEY"])
    with urllib.request.urlopen(request) as response:
        return json.load(response)


profile = call("/v1/profiles?name=" + urllib.parse.quote("Shop EU"))["items"][0]
started = call(f"/v1/profiles/{profile['id']}/start", method="POST")

with sync_playwright() as playwright:
    browser = playwright.chromium.connect_over_cdp(started["cdpBrowserUrl"])
    page = browser.contexts[0].new_page()
    page.goto("https://example.com")
    print(page.title())

Selenium (Python)

Yayımlanan sürümde var

Selenium, zaten çalışan bir tarayıcıya hata ayıklayıcı adresiyle bağlanır ve yanıtın gösterdiği chromedriver’ı kullanır — hiçbir şey indirilmez, hiçbir şey tahmin edilmez.

Çağırdıkları: /v1/profiles · /v1/profiles/{id}/start

import json
import os
import urllib.parse
import urllib.request
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Local API/status.json, inside Liminal's user-data directory. The settings
# screen shows the absolute path; that path and the key are your script’s to
# keep — the app puts neither into the environment for you.
with open(os.environ["LIMINAL_ADDRESS_FILE"], encoding="utf-8") as handle:
    address = json.load(handle)["address"]


def call(path, method="GET"):
    request = urllib.request.Request(address + path, method=method)
    request.add_header("Authorization", "Bearer " + os.environ["LIMINAL_API_KEY"])
    with urllib.request.urlopen(request) as response:
        return json.load(response)


profile = call("/v1/profiles?name=" + urllib.parse.quote("Shop EU"))["items"][0]
started = call(f"/v1/profiles/{profile['id']}/start", method="POST")

options = webdriver.ChromeOptions()
options.debugger_address = started["seleniumDebuggerUrl"]
driver = webdriver.Chrome(service=Service(started["chromedriverPath"]), options=options)
driver.get("https://example.com")
print(driver.title)
driver.quit()

Selenium (JavaScript)

Yayımlanan sürümde var

Node için de aynısı: hem hata ayıklayıcı adresi hem de uyumlu bir chromedriver’ın yolu başlatma yanıtından gelir.

Çağırdıkları: /v1/profiles · /v1/profiles/{id}/start

import { readFileSync } from 'node:fs'
import { Builder } from 'selenium-webdriver'
import chrome from 'selenium-webdriver/chrome.js'

// Local API/status.json, inside Liminal's user-data directory. The settings
// screen shows the absolute path; that path and the key are your script’s to
// keep — the app puts neither into the environment for you.
const { address } = JSON.parse(readFileSync(process.env.LIMINAL_ADDRESS_FILE, 'utf8'))

async function call(path, init) {
  const response = await fetch(address + path, {
    ...init,
    headers: { Authorization: `Bearer ${process.env.LIMINAL_API_KEY}` },
  })
  const body = await response.json()
  if (!response.ok) throw new Error(body.error.code)
  return body
}

const { items } = await call('/v1/profiles?name=' + encodeURIComponent('Shop EU'))
const started = await call(`/v1/profiles/${items[0].id}/start`, { method: 'POST' })

const driver = await new Builder()
  .forBrowser('chrome')
  .setChromeOptions(new chrome.Options().debuggerAddress(started.seleniumDebuggerUrl))
  .setChromeService(new chrome.ServiceBuilder(started.chromedriverPath))
  .build()
await driver.get('https://example.com')
console.log(await driver.getTitle())
await driver.quit()

Bir aracın içe aktarabileceği tanım

Aynı sözleşme, yeri değişmeyen tek bir adreste dosya olarak: OpenAPI, JSON biçiminde, bu sayfanın gösterdiği verilerden üretilir. Postman veya Insomnia’ya aktarın ya da ondan bir istemci üretin. İçindeki her işlem, yukarıdaki rozetle aynı kullanılabilirliği taşır.

openapi.json

Onu getiren sürüm ve onu genişleten her sürüm Yenilikler sayfasında. Sözleşmeyle ilgili bir soru veya buradaki bir değerin sürümünüzün yaptığıyla uyuşmaması: [email protected].