Automation
Список проектів автоматизації
http://127.0.0.1:40325/automation/projectsКожен проект, збережений у панелі запуску, з його блоками та налаштуваннями запуску. Це ті самі проекти, які редагує розділ Automation.
Постійний JWT з Settings → Automation API.
200Список проектів.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
401Відсутній або недійсний Bearer-токен.
/automation/projectsGET /automation/projects HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/projects' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/projects")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/projects");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}
]Створити проект
http://127.0.0.1:40325/automation/projectsПостійний JWT з Settings → Automation API.
Використовує Untitled, коли порожній.
200Створений проект.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
401Відсутній або недійсний Bearer-токен.
/automation/projectsPOST /automation/projects HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"name": "text"
}curl -X POST 'http://127.0.0.1:40325/automation/projects' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"name":"text"}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"name": "text",
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects";
const payload = {
"name": "text"
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects"
body := bytes.NewBufferString(`{
"name": "text"
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/projects")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"name": "text"
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/projects");
request.Content = new StringContent("""
{
"name": "text"
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"name": "text"
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}Отримати проект
http://127.0.0.1:40325/automation/projects/{id}Постійний JWT з Settings → Automation API.
200Деталі проекту.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000GET /automation/projects/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}{
"error": "text"
}Замінити проект
http://127.0.0.1:40325/automation/projects/{id}Повністю замінює проєкт. Надішліть об’єкт у форматі відповіді GET. Ідентифікатор у шляху має пріоритет над ідентифікатором у тілі запиту. Якщо проєкт не існує, повертається 404; для створення використовуйте POST /automation/projects.
Постійний JWT з Settings → Automation API.
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
200Збережений проект.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
400Недійсний об'єкт проекту.application/json
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000PUT /automation/projects/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}curl -X PUT 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"id":"123e4567-e89b-12d3-a456-426614174000","name":"text","notes":"text","blocks":[{"id":"text","kind":"click","label":"text","params":{},"enabled":true,"x":1,"y":1,"on_done":"next","on_fail":null,"secrets":["text"]}],"run":{"threads":1,"loops":1,"hours":1,"start":"text","profiles":["text"]},"created_at":1,"updated_at":1}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": True,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": None,
"secrets": [
"text",
],
},
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text",
],
},
"created_at": 1,
"updated_at": 1,
}
response = requests.put(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000";
const payload = {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
};
const response = await fetch(url, {
method: "PUT",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
body := bytes.NewBufferString(`{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}`)
req, err := http.NewRequest("PUT", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.put("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Put, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
request.Content = new StringContent("""
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}{
"error": "text"
}{
"error": "text"
}Видалити проект
http://127.0.0.1:40325/automation/projects/{id}Постійний JWT з Settings → Automation API.
200Видалено.application/json
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000DELETE /automation/projects/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X DELETE 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.delete(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000";
const response = await fetch(url, {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000"
req, err := http.NewRequest("DELETE", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.delete("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Delete, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"deleted": true,
"id": "123e4567-e89b-12d3-a456-426614174000"
}{
"error": "text"
}Дубльований проект
http://127.0.0.1:40325/automation/projects/{id}/duplicateПостійний JWT з Settings → Automation API.
200Дубльований проект.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicatePOST /automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X POST 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.post(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate";
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate"
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/duplicate");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}{
"error": "text"
}Експорт пакета проектів
http://127.0.0.1:40325/automation/projects/{id}/exportПараметри проекту, позначені секретними, спорожняються на виході, тому пакет можна передати, не беручи з собою пароль. Сторона імпорту просить їх знову.
Постійний JWT з Settings → Automation API.
200Експортний комплект.application/json
Проект на шляху до іншої машини.
Імпорт відхиляє невідомий йому номер.
Unix секунд.
projectobject · AutomationProjectoptionalShow propertiesHide properties
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
Ідентифікатори модулів, необхідні кроки.
module_filesobject[]optionalФайли цих модулів містяться в пакеті, щоб імпортований проект міг працювати там, де він потрапляє. Модуль, відсутній на диску під час експорту, тут не враховується, але має назву modules. Під час імпорту модуль, який уже встановлено під тим самим ідентифікатором, зберігається, а не перезаписується.
Show propertiesHide properties
Файли цих модулів містяться в пакеті, щоб імпортований проект міг працювати там, де він потрапляє. Модуль, відсутній на диску під час експорту, тут не враховується, але має назву modules. Під час імпорту модуль, який уже встановлено під тим самим ідентифікатором, зберігається, а не перезаписується.
.wasm, gzip, а потім base64.
needsobject[]optionalПоля, очищені під час експорту, які потрібно запросити під час імпорту.
Show propertiesHide properties
Поля, очищені під час експорту, які потрібно запросити під час імпорту.
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000/exportGET /automation/projects/123e4567-e89b-12d3-a456-426614174000/export HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/export");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
}{
"error": "text"
}Імпорт пакета проектів
http://127.0.0.1:40325/automation/importПакет надходить як новий проект із новим ідентифікатором.
Постійний JWT з Settings → Automation API.
Імпорт відхиляє невідомий йому номер.
Unix секунд.
projectobject · AutomationProjectoptionalShow propertiesHide properties
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
Ідентифікатори модулів, необхідні кроки.
module_filesobject[]optionalФайли цих модулів містяться в пакеті, щоб імпортований проект міг працювати там, де він потрапляє. Модуль, відсутній на диску під час експорту, тут не враховується, але має назву modules. Під час імпорту модуль, який уже встановлено під тим самим ідентифікатором, зберігається, а не перезаписується.
Show propertiesHide properties
Файли цих модулів містяться в пакеті, щоб імпортований проект міг працювати там, де він потрапляє. Модуль, відсутній на диску під час експорту, тут не враховується, але має назву modules. Під час імпорту модуль, який уже встановлено під тим самим ідентифікатором, зберігається, а не перезаписується.
.wasm, gzip, а потім base64.
needsobject[]optionalПоля, очищені під час експорту, які потрібно запросити під час імпорту.
Show propertiesHide properties
Поля, очищені під час експорту, які потрібно запросити під час імпорту.
200Імпортований проект.application/json
blocksobject · AutomationBlock[]optionalShow propertiesHide properties
Тип вбудованої палітри (goto, click, type, profile.create, var.set, ...) або module:<module id>:<block>.
У мобільному профілі звичайні кроки вже перетворюються на дотики: click виконує дотик, rightClick - довге натискання, scroll і swipe - жести. hover недоступний, оскільки на телефоні немає вказівника. Наведені нижче кроки доступні лише на мобільних профілях і відхиляються на настільних:
| Тип | Параметри | Дія |
| --- | --- | --- |
| touch.tap | selector або x+y, tapCount (1-3), timeout | Дотик до цілі. |
| touch.longPress | selector або x+y, timeout | Натиснути й утримувати. |
| touch.swipe | selector або x+y, dx, dy, timeout | Провести пальцем. |
| touch.drag | selector, to, holdMs, timeout | Перетягнути елемент. |
| touch.pinch | scale, selector або x+y | Змінити масштаб двома пальцями. Значення понад 1 зменшує масштаб. |
| screen.rotate | angle (0/90/180/270), turnMs, into | Повернути пристрій. into зберігає новий screen.orientation.type. |
Власні поля кроку, як їх визначає палітра.
Положення на полотні. Лише для макета, порядок виконання визначають гілки.
Напрямок після виконання кроку. Для простих випадків використовується рядок, для значень з параметрами - об’єкт.
За замовчуванням stop; продовження після клацання, яке нічого не знайшло, - це те, як запуск друкує на неправильній сторінці.
Назви параметрів порожні під час експорту.
runobject · AutomationRunSettingsoptionalShow propertiesHide properties
Одночасний запуск браузерів; закріплений на 1-64.
Проходить через блоки. 0 означає виконання, доки hours не підніметься.
Має значення лише тоді, коли loops дорівнює 0.
Ідентифікатор блоку для початку; порожній означає перший.
Зберігається для проектів, збережених до того, як профілі стали блоками; одна нитка кожна, коли встановлено.
Unix секунд.
Unix секунд.
400Недійсний пакет або непідтримувана версія формату.application/json
401Відсутній або недійсний Bearer-токен.
/automation/importPOST /automation/import HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
}curl -X POST 'http://127.0.0.1:40325/automation/import' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"format":1,"exported_at":1,"project":{"id":"123e4567-e89b-12d3-a456-426614174000","name":"text","notes":"text","blocks":[{"id":"text","kind":"click","label":"text","params":{},"enabled":true,"x":1,"y":1,"on_done":"next","on_fail":null,"secrets":["text"]}],"run":{"threads":1,"loops":1,"hours":1,"start":"text","profiles":["text"]},"created_at":1,"updated_at":1},"modules":["text"],"module_files":[{"id":"text","wasm":"text"}],"needs":[{"block_id":"text","label":"text","params":["text"]}]}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/import"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": True,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": None,
"secrets": [
"text",
],
},
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text",
],
},
"created_at": 1,
"updated_at": 1,
},
"modules": [
"text",
],
"module_files": [
{
"id": "text",
"wasm": "text",
},
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text",
],
},
],
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/import";
const payload = {
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/import"
body := bytes.NewBufferString(`{
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/import")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/import");
request.Content = new StringContent("""
{
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"format": 1,
"exported_at": 1,
"project": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
},
"modules": [
"text"
],
"module_files": [
{
"id": "text",
"wasm": "text"
}
],
"needs": [
{
"block_id": "text",
"label": "text",
"params": [
"text"
]
}
]
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/import");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"blocks": [
{
"id": "text",
"kind": "click",
"label": "text",
"params": {},
"enabled": true,
"x": 1,
"y": 1,
"on_done": "next",
"on_fail": null,
"secrets": [
"text"
]
}
],
"run": {
"threads": 1,
"loops": 1,
"hours": 1,
"start": "text",
"profiles": [
"text"
]
},
"created_at": 1,
"updated_at": 1
}{
"error": "text"
}Розпочати проект
http://127.0.0.1:40325/automation/projects/{id}/runЗапускає проєкт і одразу повертає відповідь. Потрібні браузери запускаються блоками самого проєкту. Використовуйте /status для відстеження прогресу.
Якщо проєкт уже запущено або в ньому немає активних кроків, повертається 400.
Постійний JWT з Settings → Automation API.
200Проект розпочато.application/json
400Проект уже запущено або не має ввімкнених кроків.application/json
401Відсутній або недійсний Bearer-токен.
404Проект не знайдено.application/json
501Ця збірка не підтримує автоматизацію.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000/runPOST /automation/projects/123e4567-e89b-12d3-a456-426614174000/run HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X POST 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.post(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run";
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run"
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/run");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"project_id": "123e4567-e89b-12d3-a456-426614174000",
"running": true
}{
"error": "text"
}{
"error": "text"
}{
"error": "text"
}Зупинити проект
http://127.0.0.1:40325/automation/projects/{id}/stopЗапитує зупинку запуску. Кожен браузер завершує поточний крок і закривається, тому запуск не зникає одразу після відповіді. Стежте за полем running через /status.
Постійний JWT з Settings → Automation API.
200Запит на зупинку прийнято.application/json
401Відсутній або недійсний Bearer-токен.
501Ця збірка не підтримує автоматизацію.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000/stopPOST /automation/projects/123e4567-e89b-12d3-a456-426614174000/stop HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X POST 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.post(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop";
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop"
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/stop");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"project_id": "123e4567-e89b-12d3-a456-426614174000",
"stopping": true
}{
"error": "text"
}Отримати статус виконання проекту
http://127.0.0.1:40325/automation/projects/{id}/statusПовертає null, якщо проєкт ще не запускався після запуску лаунчера. log містить останні записи, показані у вікні запусків. Повний журнал зберігається в automation-runs/.
Постійний JWT з Settings → Automation API.
200Статус виконання або `null`.application/json
401Відсутній або недійсний Bearer-токен.
501Ця збірка не підтримує автоматизацію.application/json
/automation/projects/123e4567-e89b-12d3-a456-426614174000/statusGET /automation/projects/123e4567-e89b-12d3-a456-426614174000/status HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/projects/123e4567-e89b-12d3-a456-426614174000/status");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"project_id": "123e4567-e89b-12d3-a456-426614174000",
"project_name": "text",
"started_at": 1,
"running": true,
"workers": [
{
"profile_id": "text",
"profile_name": "text",
"pass": 1,
"step": 1,
"steps_total": 1,
"status": "queued",
"note": "text"
}
],
"log": [
"text"
]
}{
"error": "text"
}Список активних прогонів
http://127.0.0.1:40325/automation/runsПостійний JWT з Settings → Automation API.
200Список активних запусків.application/json
Unix секунд.
workersobject · AutomationWorker[]optionalShow propertiesHide properties
1-основний; 0 перед початком першого проходу.
queuedstartingrunningdonefailedstoppedОстанні записи, показані у вікні запусків. Повний журнал зберігається в automation-runs/.
401Відсутній або недійсний Bearer-токен.
501Ця збірка не підтримує автоматизацію.application/json
/automation/runsGET /automation/runs HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/runs' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/runs"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/runs";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/runs"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/runs")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/runs");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/runs");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}[
{
"project_id": "123e4567-e89b-12d3-a456-426614174000",
"project_name": "text",
"started_at": 1,
"running": true,
"workers": [
{
"profile_id": "text",
"profile_name": "text",
"pass": 1,
"step": 1,
"steps_total": 1,
"status": "queued",
"note": "text"
}
],
"log": [
"text"
]
}
]{
"error": "text"
}Список встановлених модулів
http://127.0.0.1:40325/automation/modulesПовертає встановлені оператором модулі WebAssembly. Кожен модуль додає блоки з типом module:<module id>:<block>. Модулі повертають дії для виконавця і не звертаються до сторінки напряму.
Постійний JWT з Settings → Automation API.
200Список модулів.application/json
стебло файлу; також префікс, який має кожен із його типів блоків.
Дескриптори блоків у тій самій формі, що й вбудована палітра.
Порожній під час завантаження модуля; інакше чому не сталося.
401Відсутній або недійсний Bearer-токен.
501Ця збірка не підтримує автоматизацію.application/json
/automation/modulesGET /automation/modules HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/automation/modules' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/modules"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/modules";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/modules"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/automation/modules")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/automation/modules");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/modules");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}[
{
"id": "text",
"name": "text",
"path": "text",
"blocks": [
{}
],
"error": "text"
}
]{
"error": "text"
}Встановити модуль
http://127.0.0.1:40325/automation/modulespath має вказувати на локальний файл .wasm на машині, де запущено лаунчер. Модуль містить нативний код, зібраний оператором.
Постійний JWT з Settings → Automation API.
200Встановлений модуль.application/json
стебло файлу; також префікс, який має кожен із його типів блоків.
Дескриптори блоків у тій самій формі, що й вбудована палітра.
Порожній під час завантаження модуля; інакше чому не сталося.
400Відсутній шлях або файл модуля не підтримується.application/json
401Відсутній або недійсний Bearer-токен.
501Ця збірка не підтримує автоматизацію.application/json
/automation/modulesPOST /automation/modules HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"path": "/home/me/module.wasm"
}curl -X POST 'http://127.0.0.1:40325/automation/modules' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"path":"/home/me/module.wasm"}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/modules"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"path": "/home/me/module.wasm",
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/modules";
const payload = {
"path": "/home/me/module.wasm"
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/modules"
body := bytes.NewBufferString(`{
"path": "/home/me/module.wasm"
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/automation/modules")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"path": "/home/me/module.wasm"
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/automation/modules");
request.Content = new StringContent("""
{
"path": "/home/me/module.wasm"
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"path": "/home/me/module.wasm"
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/modules");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "text",
"name": "text",
"path": "text",
"blocks": [
{}
],
"error": "text"
}{
"error": "text"
}{
"error": "text"
}Зняти модуль
http://127.0.0.1:40325/automation/modules/{id}Проекти, які використовують модуль, перестають працювати. Існуючі визначення проекту не змінено.
Постійний JWT з Settings → Automation API.
200Видалено.application/json
401Відсутній або недійсний Bearer-токен.
404Модуль не знайдено.application/json
501Ця збірка не підтримує автоматизацію.application/json
/automation/modules/textDELETE /automation/modules/text HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X DELETE 'http://127.0.0.1:40325/automation/modules/text' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/automation/modules/text"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.delete(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/automation/modules/text";
const response = await fetch(url, {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/automation/modules/text"
req, err := http.NewRequest("DELETE", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.delete("http://127.0.0.1:40325/automation/modules/text")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Delete, "http://127.0.0.1:40325/automation/modules/text");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/automation/modules/text");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"deleted": true,
"id": "text"
}{
"error": "text"
}{
"error": "text"
}Оновлено