AstroWay/api v2.102.11 · 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، لأنه يوفر جميع الأربعة (723 نقطة نهاية، 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({
...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; sign: string; house: number }[];
aspects: { planet1: string; planet2: string; type: string; orb: number }[];
};
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}: {p.sign} (house {p.house})</li>
))}
</ul>
<h2>Aspects</h2>
<ul>
{chart.aspects.map((a, i) => (
<li key={i}>{a.planet1} {a.type} {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(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 بإنشائها من بيانات الترانزيت الحقيقية:

app.post('/api/horoscope/daily', async (req, res) => {
const parsed = BirthInput.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error });
const horoscope = await client.horoscopeDaily(parsed.data);
res.json({
text: horoscope.text,
disclaimer: horoscope.disclaimer, // يجب عرض هذا في الواجهة!
});
});

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

الخطوة 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.horoscopeDaily(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.

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

رصيد/شهر = DAU × (متوسط_خرائط_لكل_مستخدم × 20
+ متوسط_سيناستريا × 50
+ متوسط_أبراج × 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 DesignHuman Design API يفتح مجالًا وظيفيًا جديدًا بالكامل
  • علم التنجيم الجغرافي/v1/acg يرسم خريطة لأفضل الأماكن التي يجب أن تعيش فيها

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

AstroWay team

فريق هندسة AstroWay API. نغلف Swiss Ephemeris في REST نظيف ونكتب عن التفاصيل المملة التي تهم حقاً.

// ابنِ عليه

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

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

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

Engineering 2026-06-05

Natal Chart API in TypeScript: SDK + React Example

Compute a natal chart in TypeScript with the AstroWay SDK — typed responses, a React component, and where it beats a local ephemeris library.

Ephemeris 2026-06-05

How Accurate Is the Swiss Ephemeris? Verified Benchmarks

Swiss Ephemeris accuracy in numbers — planetary positions under 0.1 arcsecond, exact house cusps, eclipses within a minute — and how AstroWay verifies it.

Ephemeris 2026-06-05

Swiss Ephemeris: REST API vs pyswisseph (When to Use Which)

pyswisseph vs a REST API for Swiss Ephemeris calculations — C dependencies, data files, licensing and deployment compared, with a decision guide.