🕓 تدوينة بتاريخ 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).
اختيار API
Section titled “اختيار API”ما الذي يهم:
- الدقة — ابحث عن 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 مدعومة، الدفع حسب الاستهلاك).
الخطوة 1: إعداد Backend
Section titled “الخطوة 1: إعداد Backend”لا تستدعي API الفلكي مباشرة من المتصفح أبدًا — ستتكشف مفتاح API الخاص بك. دائما مرر من خلال backend الخاص بك.
mkdir my-astrology-appcd my-astrology-appnpm init -ynpm install express @astroway/sdk zodnpm 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'));شغله:
ASTROWAY_API_KEY=aw_test_... npx tsx src/server.tsتحقق باستخدام curl:
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> );}الخطوة 3: السيناستريا
Section titled “الخطوة 3: السيناستريا”التوافق هو الميزة الواضحة التالية. أضف إلى 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)، لكن للتخزين طويل الأمد، تحتاج إلى تخزينك الخاص.
الخطوة 6: النشر
Section titled “الخطوة 6: النشر”أي منصة ستناسبك. للبدء السريع، استخدم Vercel أو Railway:
# vercel.json{ "functions": { "src/server.ts": { "runtime": "@vercel/node" } } }في لوحة تحكم المنصة، قم بتعيين المتغير البيئي ASTROWAY_API_KEY.
تخطيط الميزانية
Section titled “تخطيط الميزانية”إذا وصلت إلى هنا، قم بتقدير استهلاكك الشهري من الرصيد قبل الإطلاق:
رصيد/شهر = DAU × (متوسط_خرائط_لكل_مستخدم × 20 + متوسط_سيناستريا × 50 + متوسط_أبراج × 20) × 30لـ 100 DAU مع 1 خريطة + 1 برج + 0.3 سيناستريا لكل مستخدم في اليوم:
100 × (20 + 20 + 0.3 × 50) × 30 = 165,000 رصيد / شهرهذا هو خطة Starter مقابل $19/شهر (200K رصيد).
ماذا بعد ذلك
Section titled “ماذا بعد ذلك”الميزات المتقدمة التي يمكنك إضافتها مع النمو:
- تراكب الترانزيت —
/v1/transitsيظهر المواضع الحالية للكواكب على خريطة الميلاد - التقدم —
/v1/progressionsللتطورات النفسية - العائد الشمسي —
/v1/solar-returnلتنبؤ «السنة القادمة من يوم ميلادك» - Human Design — Human Design API يفتح مجالًا وظيفيًا جديدًا بالكامل
- علم التنجيم الجغرافي —
/v1/acgيرسم خريطة لأفضل الأماكن التي يجب أن تعيش فيها
كل ميزة صعبة التنفيذ من الصفر، لكن مع AstroWay، يكفي استدعاء API واحد.
ابدأ الآن
Section titled “ابدأ الآن”- احصل على مفتاح API مجاني — 10,000 رصيد / شهر
- مرجع API الكامل — جميع نقاط نهاية 723
- API خريطة الميلاد — الوثائق التفصيلية لنقطة نهاية الخريطة
نفس Swiss Ephemeris الموجود في Solar Fire — في 4 أسطر من الكود.
مفتاح مجاني بدون بطاقة. 5000 استدعاء شهرياً حتى الدفعة الأولى.