Как создать астрологическое приложение с AstroAPI

Раньше для создания астрологического приложения требовались глубокие знания астрономических расчётов, данных эфемерид и сложной математики. С AstroAPI вы можете пропустить всё это и сосредоточиться на самом важном: создании отличного пользовательского опыта.

В этом руководстве мы создадим полноценную астрологическую веб-страницу с нуля - страницу, на которой пользователь вводит данные о рождении и мгновенно видит свою натальную карту с положениями планет, визуальное колесо карты и свой ежедневный гороскоп. Предварительный опыт работы с API не требуется.

Что вам понадобится

  • Аккаунт AstroAPI (зарегистрируйтесь бесплатно)
  • API key (доступен в вашей панели управления)
  • Текстовый редактор (VS Code, Sublime Text или даже Блокнот)
  • Веб-браузер

Вот и всё - никаких фреймворков, инструментов сборки или команд в терминале. Мы напишем всё в одном HTML-файле.

Шаг 1: Получите свой API Key

После регистрации перейдите в свою панель управления. Ваш API key - это своего рода пароль, который идентифицирует ваше приложение для AstroAPI - он понадобится вам для каждого запроса.

Поиск страницы API Keys

В правом верхнем углу панели управления нажмите на иконку вашего профиля. Появится выпадающее меню. В разделе Integration нажмите API Keys.

Выпадающее меню панели управления с пунктом API Keys в разделе Integration

Это перенесёт вас на страницу обзора API Keys. Вы увидите навигационную панель с текущим путём: Profile > Integration > API Keys. Нажмите кнопку Create в правом верхнем углу, чтобы создать новый ключ.

Заголовок страницы API Keys с кнопкой Create

Создание ключа

На странице создания вы увидите форму с несколькими разделами:

Форма создания API key с полями Name, Permissions, Modules и Domain Restrictions
  • Name - Дайте ключу узнаваемое имя (например, “My Astrology App” или “Production”).
  • Expires In (days) - При необходимости установите срок действия. Оставьте пустым, если ключ должен действовать бессрочно.
  • Permissions - Выберите, к каким функциям API ключ может получить доступ. Для этого руководства вам понадобятся как минимум разрешения на расчёты (calc). Вы можете отметить “Use all permissions from my role”, чтобы упростить настройку.
  • Modules - Выберите, какие модули может использовать ключ. Для этого руководства выберите натальные модули (natal:calc, natal:charts, natal:texts). Вы также можете отметить “Use all modules from my organization”, чтобы разрешить всё.
  • Domain Restrictions - Это важный пункт. Поскольку ваш API key будет виден в исходном коде страницы (любой может увидеть его через инструменты разработчика браузера), вам следует ограничить его вашим собственным доменом. Введите домен вашего сайта (например, mywebsite.com), чтобы принимались только запросы с этого домена. Таким образом, даже если кто-то скопирует ваш ключ, он не сможет использовать его на своём сайте. Для локальной разработки вы можете временно использовать *.

Нажмите Save, и ваш новый API key появится. Скопируйте его и сохраните в надёжном месте - вы не сможете снова увидеть полный ключ.

Шаг 2: Создайте вашу HTML-страницу

Откройте текстовый редактор и создайте новый файл с именем astrology.html. Начнём с базовой страницы с формой для ввода данных о рождении:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Astrology App</title>
    <style>
        body {
            font-family: Georgia, serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 2rem;
            background: #f5f0e8;
            color: #1a1a1a;
        }
        h1 { text-align: center; }
        form {
            background: white;
            padding: 2rem;
            border-radius: 8px;
            margin-bottom: 2rem;
        }
        label { display: block; margin-bottom: 0.5rem; font-weight: bold; }
        input, select {
            width: 100%;
            padding: 0.5rem;
            margin-bottom: 1rem;
            border: 1px solid #ccc;
            border-radius: 4px;
            font-size: 1rem;
        }
        button {
            background: #ba9a63;
            color: white;
            border: none;
            padding: 0.75rem 2rem;
            font-size: 1rem;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover { background: #a8894f; }
        .results { background: white; padding: 2rem; border-radius: 8px; }
        .planet-row {
            display: flex;
            justify-content: space-between;
            padding: 0.5rem 0;
            border-bottom: 1px solid #eee;
        }
        .planet-name { font-weight: bold; }
        .planet-sign { color: #ba9a63; }
        #chart-image { text-align: center; margin: 2rem 0; }
        #chart-image svg { max-width: 100%; height: auto; }
        .horoscope-box {
            background: #f9f3e5;
            padding: 1.5rem;
            border-left: 4px solid #ba9a63;
            border-radius: 0 8px 8px 0;
            margin-top: 1.5rem;
            line-height: 1.8;
        }
        .loading { text-align: center; color: #6b6b75; font-style: italic; }
        .hidden { display: none; }
    </style>
</head>
<body>
    <h1>✨ My Astrology App</h1>

    <form id="birth-form">
        <label for="name">Your Name</label>
        <input type="text" id="name" placeholder="e.g. Anna" required>

        <label for="date">Date of Birth</label>
        <input type="date" id="date" required>

        <label for="time">Time of Birth</label>
        <input type="time" id="time" required>

        <label for="city">City of Birth</label>
        <input type="text" id="city" placeholder="e.g. Amsterdam" required>

        <button type="submit">Calculate My Chart</button>
    </form>

    <div id="results" class="results hidden">
        <!-- Results will appear here -->
    </div>

    <script>
        // We'll add our code here in the next steps
    </script>
</body>
</html>

Сохраните файл и откройте его в браузере. Вы должны увидеть аккуратную форму, запрашивающую данные о рождении. Пока она ничего не делает - давайте это исправим.

Шаг 3: Поиск места рождения

Когда кто-то вводит “Amsterdam”, нам нужно преобразовать это в координаты широты и долготы. У AstroAPI есть endpoint для геокодирования:

const API_KEY = "your-api-key-here";
const BASE_URL = "https://api.astroapi.cloud/api";

Защита вашего API key: Поскольку это клиентская веб-страница, ваш API key виден любому, кто просматривает исходный код страницы. Это нормально, если вы настроили Domain Restrictions в панели управления (см. Шаг 1). API будет отклонять запросы с любого домена, которого нет в вашем списке разрешённых, поэтому ключ бесполезен для того, кто его скопирует.

Теперь напишем функции. Сначала поиск местоположения:

async function findLocation(cityName) {
    const response = await fetch(
        `${BASE_URL}/geocoding/search?q=${encodeURIComponent(cityName)}`,
        { headers: { "X-Api-Key": API_KEY } }
    );
    const data = await response.json();

    // The API returns a list of matching places.
    // We'll use the first result.
    const place = data.data[0];
    return {
        latitude: place.latitude,
        longitude: place.longitude,
        timezone: place.timezone,
        name: place.name
    };
}

Это превращает “Amsterdam” в { latitude: 52.37, longitude: 4.89, timezone: "Europe/Amsterdam", name: "Amsterdam" } - именно то, что нам нужно для расчётов карты. Часовой пояс важен, потому что AstroAPI нужен для правильного преобразования вашего местного времени рождения во всемирное время.

Шаг 4: Рассчитайте натальную карту

Теперь отправим данные о рождении в AstroAPI и получим все положения планет:

async function calculateChart(birthDate, birthTime, latitude, longitude, timezone) {
    const response = await fetch(`${BASE_URL}/calc/natal`, {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "X-Api-Key": API_KEY
        },
        body: JSON.stringify({
            dateTime: `${birthDate}T${birthTime}:00`,
            location: { latitude, longitude, timezone },
            houseSystem: "placidus",
            includeReadableEntities: true
        })
    });

    return await response.json();
}

dateTime отправляется как строка в формате ISO (например, "1990-06-15T14:30:00"), а location включает часовой пояс, чтобы API мог правильно интерпретировать местное время рождения. Ответ содержит всю информацию о карте: где была расположена каждая планета, в каком знаке зодиака она находилась, какой дом она занимала, и все геометрические взаимосвязи (аспекты) между планетами.

Шаг 5: Отобразите результаты

Здесь начинается самое интересное. Давайте превратим необработанные данные API в нечто визуально привлекательное. Мы покажем таблицу положений планет и знаки Солнца, Луны и Асцендента - «большую тройку», которая интересует большинство людей:

function displayChart(chart, personName) {
    const points = chart.data.points;
    const houses = chart.data.houses;

    // Find the "big three"
    const sunSign = points.sun.signTitle;
    const moonSign = points.moon.signTitle;
    const risingSignId = houses.cusps[0].sign;
    const risingSign = risingSignId.charAt(0).toUpperCase() + risingSignId.slice(1);

    let html = `
        <h2>${personName}'s Birth Chart</h2>

        <div style="text-align:center; margin-bottom:2rem;">
            <p style="font-size:1.2rem;">
                ☀️ Sun in <strong>${sunSign}</strong> &nbsp;·&nbsp;
                🌙 Moon in <strong>${moonSign}</strong> &nbsp;·&nbsp;
                ⬆️ Rising <strong>${risingSign}</strong>
            </p>
        </div>

        <h3>Planetary Positions</h3>
    `;

    // Build a row for each planet
    const planetKeys = ["sun", "moon", "mercury", "venus", "mars",
                        "jupiter", "saturn", "uranus", "neptune", "pluto"];
    for (const key of planetKeys) {
        const planet = points[key];
        if (!planet) continue;
        html += `
            <div class="planet-row">
                <span class="planet-name">${key.charAt(0).toUpperCase() + key.slice(1)}</span>
                <span class="planet-sign">${planet.signTitle} ${planet.degreesInSign.toFixed(1)}°</span>
                <span>House ${planet.houseNumber}</span>
            </div>
        `;
    }

    document.getElementById("results").innerHTML = html;
    document.getElementById("results").classList.remove("hidden");
}

API возвращает планеты как объект с ключами по идентификатору планеты (например, points.sun, points.moon). У каждой планеты есть sign (например, "gemini"), signTitle (отображаемое имя, например "Gemini"), degreesInSign (положение внутри этого знака) и houseNumber. Восходящий знак (Асцендент) берётся напрямую из свойства sign на куспиде первого дома.

Шаг 6: Добавьте визуальное колесо карты

Натальная карта по-настоящему оживает с классическим круговым колесом карты. AstroAPI генерирует их в виде SVG-изображений, которые выглядят чётко при любом размере:

function displayChartImage(chartUrl) {
    const chartDiv = document.createElement("div");
    chartDiv.id = "chart-image";
    chartDiv.innerHTML = `<h3>Your Chart Wheel</h3><img src="${chartUrl}" alt="Natal Chart" style="max-width:100%; height:auto;">`;
    document.getElementById("results").appendChild(chartDiv);
}

Ответ API натальной карты уже включает поле chart.url с URL SVG-изображения графика, поэтому отдельный запрос не нужен. Мы просто передаём этот URL в тег <img>, чтобы отобразить колесо карты со всеми 12 знаками зодиака, домами, положениями планет и линиями аспектов.

Нужно PNG-изображение вместо этого - например, для публикации в социальных сетях? Просто измените расширение .svg в URL на .png.

Шаг 7: Покажите ежедневный гороскоп

Давайте добавим личный штрих, показав сегодняшний гороскоп для солнечного знака пользователя:

async function displayHoroscope(sunSign, sunSignTitle) {
    const today = new Date().toISOString().split("T")[0];

    const response = await fetch(
        `${BASE_URL}/horoscope/daily/${today}?sign=${sunSign}&language=en`,
        { headers: { "X-Api-Key": API_KEY } }
    );

    const data = await response.json();
    const signName = sunSignTitle;

    const horoscopeDiv = document.createElement("div");
    horoscopeDiv.innerHTML = `
        <h3>Today's Horoscope for ${signName}</h3>
        <div class="horoscope-box">${data.data.text}</div>
    `;
    document.getElementById("results").appendChild(horoscopeDiv);
}

Endpoint гороскопа принимает сегодняшнюю дату в URL и знак зодиака как параметр запроса. Гороскопы доступны на нескольких языках - просто измените language=en на language=nl для нидерландского, language=es для испанского, language=fr для французского и так далее.

Шаг 8: Соедините всё вместе

Теперь давайте подключим форму ко всем нашим функциям. Добавьте следующий код в ваш раздел <script>, после всех функций из предыдущих шагов:

const API_KEY = "your-api-key-here";
const BASE_URL = "https://api.astroapi.cloud/api";

document.getElementById("birth-form").addEventListener("submit", async (e) => {
    e.preventDefault();

    const name = document.getElementById("name").value;
    const date = document.getElementById("date").value;
    const time = document.getElementById("time").value;
    const city = document.getElementById("city").value;

    // Show a loading message
    const results = document.getElementById("results");
    results.innerHTML = '<p class="loading">Calculating your chart...</p>';
    results.classList.remove("hidden");

    try {
        // 1. Find the coordinates and timezone for the birth city
        const location = await findLocation(city);

        // 2. Calculate the natal chart
        const chart = await calculateChart(date, time, location.latitude, location.longitude, location.timezone);

        // 3. Display the planetary positions
        displayChart(chart, name);

        // 4. Add the visual chart wheel using the URL from the API response
        if (chart.data.chart?.url) {
            displayChartImage(chart.data.chart.url);
        }

        // 5. Show today's horoscope based on the Sun sign
        const sunSign = chart.data.points.sun.sign;
        await displayHoroscope(sunSign, chart.data.points.sun.signTitle);

    } catch (error) {
        results.innerHTML = '<p style="color:red;">Something went wrong. Please check your API key and try again.</p>';
    }
});

Откройте файл в браузере, введите дату рождения и город, и нажмите “Calculate My Chart”. В течение нескольких секунд вы увидите полные данные натальной карты, красивое колесо карты и персонализированный гороскоп - всё работает на AstroAPI.

Двигаемся дальше: совместимость, фазы Луны и многое другое

Теперь, когда у вас есть работающее астрологическое приложение, вот некоторые функции, которые вы можете добавить далее:

Любовная совместимость - Используйте endpoint синастрии для сравнения двух натальных карт. Покажите, какие планеты образуют гармоничные аспекты (тригоны, секстили) и какие создают напряжение (квадратуры, оппозиции). Отлично подходит для функции «совместимость в отношениях».

Трекер фаз Луны - Endpoint лунных фаз возвращает текущую фазу Луны, процент освещённости и время восхода/захода Луны. Идеально подходит для виджета в боковой панели или ежедневного обновления.

Оповещения о транзитах - Транзиты показывают, где планеты находятся прямо сейчас по сравнению с натальной картой человека. Используйте это для создания функций «что происходит в вашей карте сегодня» - например, «Сатурн пересекает ваш Середину Неба, время для карьерных прорывов».

Нумерология - Рассчитывайте числа жизненного пути, числа выражения и числа личности по дате рождения и имени человека. Хорошее дополнение к астрологическим данным.

Мультиязычная поддержка - Все текстовые endpoint-ы (гороскопы, интерпретации) поддерживают несколько языков. Создавайте приложения для глобальной аудитории, передавая параметр lang.

Серверный прокси - Для продакшн-приложений рассмотрите возможность переноса ваших API-вызовов на небольшой бэкенд-сервер. Таким образом ваш API key остаётся на сервере и никогда не раскрывается пользователям. Domain Restrictions - хорошая первая линия защиты, но прокси даёт вам полный контроль.

Изучите полный API

То, что мы рассмотрели здесь, - это только начало. Полная документация API охватывает каждый endpoint в деталях, с примерами запросов на cURL, JavaScript и Python.

Готовы начать? Создайте бесплатный аккаунт и получите свой API key уже сегодня.