AstroWay/api v2.180.1 · ar
جميع الأنظمة تعمل بشكل طبيعي

كيفية بناء تطبيق فلكي: دليل كامل للمطور

دليل خطوة بخطوة لإنشاء تطبيق فلكي من الصفر - اختيار API، هندسة، الخارطة Natal الأولى، إضافة سيناستري وانتقالات، نشر.

🕓 تدوينة بتاريخ 2026-04-14، آخر تحديث 2026-05-09. تم نقل TS / Python / PHP SDK إلى السجلات العامة - @astroway/sdk (npm)، astroway (PyPI)، astroway/sdk (Packagist). للمزيد من التفاصيل، راجع سجل التغييرات.

هل تريد إنشاء تطبيق فلكي؟ من أين تبدأ؟ في هذا الدليل، ستجد الحلول والكود: من اختيار API إلى نشر المنتج النهائي.

أسئلة حول الهندسة المعمارية

Section titled “أسئلة حول الهندسة المعمارية”

قبل كتابة الكود، حدد: هل الحسابات ستتم على العميل أم على الخادم؟

العميل (على سبيل المثال، Swiss Ephemeris WASM في المتصفح):

  • المميزات: لا تكلفة لكل طلب، يعمل دون اتصال، تحكم كامل
  • العيوب: ~2 ميجابايت من WASM لكل مستخدم، ترخيص معقد (للاستخدام التجاري لـ Swiss Ephemeris قيود)، أنت مسؤول عن صيانة الكود الحسابي

API الخادم (AstroWay، Prokerala، إلخ):

  • المميزات: لا تبعيات على العميل، حزمة تطبيق صغيرة، سريع على الأجهزة المحمولة، لا متاعب الترخيص
  • العيوب: تكلفة حسب عدد الطلبات، تأخير في الطلبات «الباردة»

بالنسبة لمعظم التطبيقات، يفوز API الخادم. مستخدمو الأجهزة المحمولة لن ينتظرون 2 ميجابايت من WASM؛ لا داعي للتعامل مع تعقيدات الترخيص؛ كما أن معظم الـ APIs الحديثة تخزن الطلبات المتطابقة مجانًا (يقوم AstroWay بخزن لمدة 5 دقائق مع الرأس X-Cache: HIT).

ما الذي يهم:

  • الدقة - ابحث عن Swiss Ephemeris «تحت الغطاء» (±1 ثانية زاوية). إذا لم يذكر API ذلك صراحةً، اسأله.
  • التغطية - المولد ( Natal ) + السيناستريا ( Synastry ) + الترانزيت ( Transits ) الحد الأدنى. التقدم ( Progressions ) والعودة ( Returns ) المستوى التالي. التقنيات النادرة ( مثل Rectification، Human Design ) هي ميزة تميزك عن الآخرين.
  • جودة الـ SDK - توفر الـ SDKs المدعومة بلغة TypeScript وPython ساعات من الوقت.
  • نموذج التسعير - الدفع حسب الاستهلاك ( Credit-based ) يت scale بشكل أفضل من الدفع لكل طلب ( per-request ) في الأحمال المختلطة.

في هذا الدليل، سنستخدم API AstroWay، لأنه يوفر جميع الأربعة (758 نقطة نهاية، Swiss Ephemeris، SDKs مدعومة، الدفع حسب الاستهلاك).

لا تستدعي API الفلكي مباشرة من المتصفح أبدًا - ستتكشف مفتاح API الخاص بك. دائما مرر من خلال backend الخاص بك.

Terminal window
mkdir my-astrology-app
cd my-astrology-app
npm init -y
npm install express @astroway/sdk zod
npm install -D typescript @types/express @types/node tsx

أنشئ src/server.ts:

import express from 'express';
import { Astroway } from '@astroway/sdk';
import { z } from 'zod';
const app = express();
app.use(express.json());
const client = new Astroway({
apiKey: process.env.ASTROWAY_API_KEY!,
});
const BirthInput = z.object({
date: z.string(),
time: z.string(),
timezoneOffset: z.number(),
latitude: z.number(),
longitude: z.number(),
});
app.post('/api/chart', async (req, res) => {
const parsed = BirthInput.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error });
try {
const chart = await client.chart.compute({
...parsed.data,
houseSystem: 'P',
});
res.json(chart);
} catch (err) {
res.status(500).json({ error: String(err) });
}
});
app.listen(3000, () => console.log('http://localhost:3000'));

شغله:

Terminal window
ASTROWAY_API_KEY=aw_test_... npx tsx src/server.ts

تحقق باستخدام curl:

Terminal window
curl -X POST http://localhost:3000/api/chart \
-H "Content-Type: application/json" \
-d '{"date":"1990-07-14","time":"14:30:00","timezoneOffset":3,"latitude":50.4501,"longitude":30.5234}'

ستحصل على خريطة ميلاد كاملة بتنسيق JSON.

الخطوة 2: الواجهة الأمامية

Section titled “الخطوة 2: الواجهة الأمامية”

أي إطار عمل سيناسبك. كمثال، React مع نموذج بسيط:

import { useState } from 'react';
type Chart = {
planets: { name: string; longitude: number; isRetrograde: boolean }[];
aspects: { planet1: string; planet2: string; type: { name: string }; orb: number }[];
};
// Планети приходять з екліптичною довготою, а не зі знаком: знак це вона ж,
// поділена на 30. Рахуй на своєму боці, це дешевше за ще один виклик.
const SIGNS = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'];
const signOf = (longitude: number) => SIGNS[Math.floor(longitude / 30) % 12];
export function NatalForm() {
const [chart, setChart] = useState<Chart | null>(null);
async function handleSubmit(formData: FormData) {
const body = Object.fromEntries(formData.entries());
const res = await fetch('/api/chart', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
date: body.date,
time: body.time + ':00',
timezoneOffset: Number(body.tz),
latitude: Number(body.lat),
longitude: Number(body.lng),
}),
});
setChart(await res.json());
}
return (
<div>
<form action={handleSubmit}>
<input name="date" type="date" required />
<input name="time" type="time" required />
<input name="tz" type="number" placeholder="Timezone offset (наприклад 3)" required />
<input name="lat" type="number" step="0.0001" placeholder="Latitude" required />
<input name="lng" type="number" step="0.0001" placeholder="Longitude" required />
<button>Build chart</button>
</form>
{chart && (
<div>
<h2>Planets</h2>
<ul>
{chart.planets.map(p => (
<li key={p.name}>{p.name}: {signOf(p.longitude)} {(p.longitude % 30).toFixed(2)}°{p.isRetrograde ? ' R' : ''}</li>
))}
</ul>
<h2>Aspects</h2>
<ul>
{chart.aspects.map((a, i) => (
<li key={i}>{a.planet1} {a.type.name} {a.planet2} (orb {a.orb.toFixed(2)}°)</li>
))}
</ul>
</div>
)}
</div>
);
}

التوافق هو الميزة الواضحة التالية. أضف إلى src/server.ts:

const SynastryInput = z.object({
chart1: BirthInput,
chart2: BirthInput,
});
app.post('/api/synastry', async (req, res) => {
const parsed = SynastryInput.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error });
const result = await client.synastry.compute(parsed.data);
res.json({
score: result.compatibility.score,
label: result.compatibility.label,
aspects: result.crossAspects,
});
});

هذا كل شيء. نقطة نهاية واحدة، 50 رصيد لكل استدعاء، تعيد النتيجة من 0 إلى 100 مع cross-aspects.

الخطوة 4: الأبراج اليومية

Section titled “الخطوة 4: الأبراج اليومية”

للإشراك بالمحتوى، الأبراج اليومية هي ضرورة. يقوم AstroWay بإنشائها من بيانات الترانزيت الحقيقية:

// Денний гороскоп береться від знака й дати, а не від карти народження.
const DailyInput = z.object({
sign: z.enum(['aries', 'taurus', 'gemini', 'cancer', 'leo', 'virgo',
'libra', 'scorpio', 'sagittarius', 'capricorn', 'aquarius', 'pisces']),
date: z.string(),
});
app.post('/api/horoscope/daily', async (req, res) => {
const parsed = DailyInput.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error });
const horoscope = await client.horoscope.daily({ ...parsed.data, language: 'uk' });
res.json({
text: horoscope.horoscope,
disclaimer: horoscope.disclaimer, // обов'язково зберегти в UI!
});
});

هام: المحتوى الذي تم إنشاؤه بواسطة الذكاء الاصطناعي يحتوي على إخلاء مسؤولية يجب عليك عرضه على المستخدمين (وفقًا لشروط الخدمة). لا تقم بإزالته.

الخطوة 5: التخزين المؤقت

Section titled “الخطوة 5: التخزين المؤقت”

الأبراج اليومية هي نفسها لجميع المستخدمين الذين ولدوا في نفس اليوم ولديهم خريطة ميلاد مماثلة. قم بتخزينها بشكل متحمس:

import { LRUCache } from 'lru-cache';
const cache = new LRUCache<string, any>({ max: 1000, ttl: 86400 * 1000 });
app.post('/api/horoscope/daily', async (req, res) => {
const key = JSON.stringify(req.body);
const cached = cache.get(key);
if (cached) return res.json(cached);
const horoscope = await client.horoscope.daily(req.body);
cache.set(key, horoscope);
res.json(horoscope);
});

يوفر AstroWay أيضًا تخزينًا مؤقتًا مدمجًا لمدة 5 دقائق (X-Cache: HIT)، لكن للتخزين طويل الأمد، تحتاج إلى تخزينك الخاص.

أي منصة ستناسبك. للبدء السريع، استخدم Vercel أو Railway:

Terminal window
# vercel.json
{ "functions": { "src/server.ts": { "runtime": "@vercel/node" } } }

في لوحة تحكم المنصة، قم بتعيين المتغير البيئي ASTROWAY_API_KEY.

إذا وصلت إلى هنا، قم بتقدير استهلاكك الشهري من الرصيد قبل الإطلاق:

credits/month = DAU × (avg_charts_per_user × 20
+ avg_synastries × 50
+ avg_horoscopes × 20) × 30

لـ 100 DAU مع 1 خريطة + 1 برج + 0.3 سيناستريا لكل مستخدم في اليوم:

100 × (20 + 20 + 0.3 × 50) × 30 = 165 000 кредитів / місяць

هذا هو خطة Starter مقابل $19/شهر (200K رصيد).

الميزات المتقدمة التي يمكنك إضافتها مع النمو:

  • تراكب الترانزيت - /v1/transits يظهر المواضع الحالية للكواكب على خريطة الميلاد
  • التقدم - /v1/progressions للتطورات النفسية
  • العائد الشمسي - /v1/solar-return لتنبؤ «السنة القادمة من يوم ميلادك»
  • Human Design - Human Design API يفتح مجالًا وظيفيًا جديدًا بالكامل
  • علم التنجيم الجغرافي - /v1/acg يرسم خريطة لأفضل الأماكن التي يجب أن تعيش فيها

كل ميزة صعبة التنفيذ من الصفر، لكن مع AstroWay، يكفي استدعاء API واحد.

MakSeong · AstroWay

أبني AstroWay API: أُغلف Swiss Ephemeris في REST نقي وأكتب عن التفاصيل المملة التي هي فعلاً مهمة.

// ابنِ عليه

نفس Swiss Ephemeris الموجود في Solar Fire - في 4 أسطر من الكود.

مفتاح مجاني بدون بطاقة. 5000 استدعاء شهرياً حتى الدفعة الأولى.

المزيد من المدونة جميع المقالات →

Ephemeris 2026-07-19

كيف نتحكم في الدقة: CI ضد swetest و NASA

الدقة في astro-API تتدهور بسهولة بسبب تعديل واحد في الإيفيميريدات. نستعرض الحماية: نواة واحدة من Swiss Ephemeris للمتصفح والخادم، مئات اللقطات المجمدة على خرائط مرجعية وتثليث كل PR ضد swetest CGI و Kerykeion و Prokerala ودليل خسوفات NASA.

Engineering 2026-07-15

ثلاثة SDK رسمية: TypeScript, Python, PHP بدلاً من curl الخام

HTTP الخام يعمل، لكن العميل المطبّق يوفّر ساعات: إكمال تلقائي للمسارات، أنواع الطلب والاستجابة، إعادة محاولة مدمجة على 408/409/429/5xx، وتسلسل أخطاء بنمط Stainless. نستعرض ثلاثة SDK رسمية - @astroway/sdk (npm)، astroway (PyPI)، astroway/sdk (Packagist) - وكيف تم توليدها من عقد OpenAPI واحد.

Industry 2026-06-05

Free Astrology API: Which One Has the Best Free Tier in 2026?

A side-by-side of free tiers across the major astrology APIs - credits, request caps, card requirements - and how much you can actually build for free.