لذا فقد حان وقت الخريف والشتاء. خارج النافذة ، تكون الأمطار والرغبة في قضاء الوقت في الهواء الطلق أقل وأقل. ثم تأتي رسالة من صديق لي ، " دعونا نلعب Lineage 2 ؟" ومرة أخرى ، وافقت على الحنين إلى الماضي. لقد اخترنا خادم جديد على ru-ofe وأنشأنا شخصيات.

على عكس World of Warcraft ، لدى Lineage 2 نظام تعدين عملة لعبة مختلف تمامًا. تحتاج إلى مطاردة الوحوش على مدار الساعة لغرض كسب الربح. لقد كان اكتشافًا بالنسبة لي أنه بالنسبة لبعض الأشخاص ، فإن RMT (تداول النقود الحقيقية) هو مجرد عمل. أيضا ، اللعبة لديها اقتصاد يشكله اللاعبون. وبعبارة أخرى ، يمكنك كسب المال من بيع وشراء أو شراء موارد رخيصة ، وصنع الأشياء منها وبيعها بعلاوة. نظرًا لأن اللعبة بالنسبة لنا لا تزال نوعًا من الاسترخاء ، فقد كانت هذه طريقة الحصول على عملة اللعبة التي اخترناها.
لشراء وبيع العناصر ، يجب أن يكون اللاعب متصلاً بالإنترنت (لقطة شاشة أعلاه). وبناءً على ذلك ، يرغب شخص ما في البيع بشكل أسرع (أرخص) وشخص سريع الشراء (أكثر تكلفة). ولكن ماذا لو كان الفرق هو بيع - شراء إيجابي؟ سيتم اعتبار هذا المثال فقط في المقالة نتيجة لذلك.
ومع ذلك ، فإن أسعار السوق غير مستقرة تمامًا وغالبًا ما تتغير. لذلك ، من المحتمل أن تشتري شيئًا "رخيصًا" ومن ثم أرخص للبيع بسعر ربح سلبي. هذا ما نحاول تجنبه. بشكل عام ، تقرر كتابة نظام لتحليل السوق والتعامل مع اثنين من التقنيات التي تهمني.
المفسد :
سيتم استخدام التقنيات التالية في المقالة
Docker ، DigitalOcean ، NodeJs ، Ktor ، Prometheus ، Grafana ، Telegram bot إعلام
الأول كان البيانات
لتحليل شيء ما ، نحتاج أولاً إلى الحصول على هذا الشيء. تم النظر في خيارين للحصول على المعلومات.
استنشاق - كتابة تطبيق يستمع إلى حركة المرور وتحليلها. مساوئ هذا النهج بسيطة للغاية. يجب أن تكون متصلاً بالإنترنت باستمرار وأن تراقب السوق ، ووفقًا لسياسة الخادم التي يمكنهم حظرها. ومع ذلك ، أرغب في إجراء بسيط من المستخدم ومن المستحسن أتمتة كل شيء قدر الإمكان.
التحليل - هناك موقع متخصص في استنشاق هذه اللعبة - l2on.net. فقط ما نحتاجه! نعطي دور جامع البيانات الخام لهذه الخدمة. يبقى فقط للحصول على البيانات بطريقة أو بأخرى والبدء في تجربتها.

بناءً على سلسلة الاستعلام ، نتفهم أننا بحاجة إلى تمرير معرف المورد للحصول على معلومات حوله. ومع ذلك ، إذا قمنا بأتمتة هذا ، فمن الضروري أيضًا نقل معرف خادم اللعبة. بعد حفر دقيقة في شفرة مصدر الصفحة ، تم العثور على ما يلي:

تحاول ... عظيم! نحصل على قائمة أسعار الشراء والبيع.
تحتاج الآن إلى التفكير في كيفية تحليل الموقع.
وقع الاختيار على Puppeteer لـ NodeJs.
على أساسها ، تم إنشاء الوحدة الأولى من النظام الفرعي ، Scrapper . وتتمثل مهمتها الرئيسية في الانتقال إلى الموقع وفتح البيانات وتحليلها وإعادتها في شكل JSON. نأخذ عينة من عناصر N الأخيرة ، ونأخذ في الاعتبار متوسط السعر والحد الأدنى والحد الأقصى. (بالنظر إلى المستقبل ، سأقول أنك بحاجة إلى تحسين النسبة المئوية لتعديل الضوضاء إذا وضع بعض اللاعبين سعرًا مرتفعًا جدًا للبيع أو منخفضًا للشراء) نحصل على الإجابة وفقًا للبيانات:

الآن يمكننا الانتقال إلى الجزء التالي - تخزين البيانات .
لنفترض أن لدينا 2-3 مستهلكين لبياناتنا ونريد أن نعطيهم صفيفًا. نريد أيضًا تجنب الطلبات المتكررة على l2on حتى لا يتم إدراجها في القائمة السوداء. لذا نحتاج إلى إنشاء وحدة ثانية تعمل كوسيط بين l2on ووكلائنا.
تم اختيار منهجية المسح البسيط. مرة واحدة كل 5 دقائق ، يجب أن تطلب الوحدة جميع العناصر من القائمة المحددة وتوفر المخرجات كبيانات لمورد واحد بالإضافة إلى مخرجات التحليلات.
لهذا النظام ، أردت تجربة Ktor - حل خادم على Kotlin.
لم أستخدم قاعدة البيانات ، لكنني قررت تخزين أحدث البيانات في Singleton. نعم ، الحل ليس الأكثر أناقة ، ولكنه ملائم بشكل سريع ، وسنكون دائمًا قادرين على تحسينه.
لذا ظهرت الوحدة الثانية للنظام - الحاصدة .
توفر Harvester للمستخدم نقطتي نهاية / عنصر / {id} و / مقاييس
إذا كان كل شيء واضحًا مع الأول ، فإن الأخير يعيد البيانات بتنسيق النظام التالي - Prometheus


تخزين البيانات للتحليلات
تم اختيار الرابط المتوسط Prometheus - قاعدة بيانات مفتوحة المصدر للتحليلات التي تعمل من خلال نهج السحب. بمعنى آخر ، عند التهيئة ، تحتاج إلى تحديد مجموعة موفري البيانات وتكرار الاقتراع في ملف yaml. في حالتنا ، هذه هي نفس نقطة النهاية / المقاييس بالضبط.
نحاول تشغيل Prometheus (بشكل افتراضي هو المنفذ 9090) وإذا رأينا شيئًا مشابهًا لـ Target:

لذلك نحن على الطريق الصحيح. هذا يعني أن Prometheus يذهب كل 30 ثانية إلى Harvester ويلتقط الحالة الأخيرة لجميع السلع التي نهتم بها.
عرض البيانات
المرحلة التالية هي عرض رسم بياني جميل.
للعرض ، تم اختيار Grafana ، وهو أيضًا مفتوح المصدر.
Pluses Grafana و Prometheus - تتوفر في شكل حاويات Docker التي تتطلب الحد الأدنى من إجراءات المستخدم.
عند بدء تشغيل Grafana لأول مرة (المنفذ القياسي 3000) ، سيطلب منك تحديد قاعدة بيانات متاحة. نختار بروميثيوس كقاعدة ونصف العنوان. إذا سار كل شيء على ما يرام ، فسوف نرى:

الخطوة التالية هي رسم الرسوم البيانية.
مثال على طلب رسم مخطط مبيعات:

وبالتالي ، نرى في أي وقت متوسط السعر للشراء والبيع ، بالإضافة إلى ديناميكيات الأسعار.

ومع ذلك ، هناك أوقات يكون فيها الحد الأدنى لسعر البيع أعلى من سعر الشراء الأقصى. هذا يعني أنه يمكننا الحصول على ربح سهل في شكل "شراء وبيع". بالنسبة لقناة الإرسال ، تم تحديد الإشعار بواسطة Telegram. قم بإنشاء روبوت وإضافة رمزه المميز إلى Grafana (نعم ، نعم ، يدعم الإشعارات)

يكفي فقط تحديد الحالة التي سيأتي بموجبها هذا الإخطار إلينا.

كما نرى من الرسم البياني ، تحدث مثل هذه المواقف في السوق.

سحابة
نقوم بتعبئة كل نظام فرعي في حاوية Docker وتحميله في DigitalOcean أو خدمات أخرى ترضيك. ولكن هذا لا يمنعنا من بدء هذا النظام بالكامل بدون عنوان IP مخصص. الآن الحد الأدنى للحاوية لـ DO يكلف 5 دولارات في الشهر.
بدء Scrapper أولاً
docker run -d -p 6661: 6661 - المزيل الاسم l2 / المزيل: الأحدث
خلفه الحاصدة
docker run -d -p 6662: 6662 -v / root / harvester: / res - link scrapper: scrapper l2harvester: latest
يجب أن يكون ملف ids.txt بالتنسيق في المجلد / harvester
اسم id1
اسم id2
الخلاصة
في نهاية المطاف ، النظام كما يلي:

من المخطط في المستقبل إضافة وكيل لتحديث مستندات جوجل ، وحساب تكلفة الصياغة على الطاير.
لا أعرف ما إذا كان وقت التشغيل هذا سيجلب أي فائدة ، ولكن بالنسبة لي شخصيًا ، كانت تجربة جيدة لتحديث معرفتي في المجال التطبيقي. خصوصيتي الرئيسية هي تطبيقات الهاتف المحمول. تطوير جانب الخادم هو مهارة وفضول إضافيين.
كمكمل ، أرفق روابط للتعرف على الرمز:
المزيل
الحاصدة
(يمكنك جمع الحاويات من قبل الفرق
بناء عامل ميناء -t المزيل.
حصادة البناء -t.
آمل حقًا أن تكون هذه المقالة قد ألهمت شخصًا يشعر بمشاعر الحنين ، أو أعطى إلهامًا لفكرة جديدة. شكرا لقراءة المقال حتى النهاية!