Jadi musim gugur-musim dingin telah tiba. Di luar jendela, hujan dan keinginan untuk menghabiskan waktu di luar semakin berkurang. Dan kemudian sebuah pesan datang dari seorang teman saya, " Ayo main Lineage 2 ?" Dan lagi, menyerah pada nostalgia, saya setuju. Kami memilih server baru di ru-ofe dan membuat karakter.

Tidak seperti World of Warcraft, Lineage 2 memiliki sistem penambangan mata uang game yang sama sekali berbeda. Anda perlu berburu monster sepanjang waktu untuk tujuan mendapatkan keuntungan. Bahkan merupakan penemuan bagi saya bahwa bagi sebagian orang RMT (perdagangan uang sungguhan) adalah sedikit pekerjaan. Juga, permainan memiliki ekonomi yang dibentuk pemain. Dengan kata lain, Anda dapat menghasilkan uang dari jual-beli atau beli sumber daya murah, hasilkan dari mereka dan jual dengan harga premium. Karena bagi kami game tetap menjadi semacam relaksasi, cara mendapatkan mata uang game inilah yang kami pilih.
Untuk membeli dan menjual barang, pemain harus online (Screenshot di atas). Oleh karena itu, seseorang ingin menjual lebih cepat (lebih murah) dan seseorang dengan cepat membeli (lebih mahal). Tetapi bagaimana jika perbedaannya adalah jual - beli positif? Contoh ini hanya akan dipertimbangkan dalam artikel sebagai hasilnya.
Namun, harga pasar cukup tidak stabil dan sering berubah. Oleh karena itu, kemungkinan untuk membeli sesuatu yang "murah" dan kemudian lebih murah untuk menjual dengan laba negatif. Inilah yang kami coba hindari. Secara umum, diputuskan untuk menulis sistem analisis pasar dan berurusan dengan beberapa teknologi yang menarik bagi saya.
Spoiler :
Teknologi berikut akan digunakan dalam artikel
Docker, DigitalOcean, NodeJs, Ktor, Prometheus, Grafana, pemberitahuan bot Telegram
Pertama adalah Data
Untuk menganalisis sesuatu, pertama-tama kita perlu mendapatkan sesuatu ini. 2 opsi untuk mendapatkan informasi dipertimbangkan.
Sniffing - menulis aplikasi yang akan mendengarkan lalu lintas dan menganalisisnya. Kelemahan dari pendekatan ini sangat sederhana. Anda harus terus-menerus online dan mengawasi pasar, dan sesuai dengan kebijakan server yang dapat mereka ban. Namun, saya ingin tindakan minimal dari pengguna dan diinginkan untuk mengotomatiskan semuanya sebanyak mungkin.
Parsing - ada situs yang berspesialisasi dalam mengendus untuk permainan ini - l2on.net. Apa yang kita butuhkan! Kami memberikan peran sebagai pengumpul data mentah untuk layanan ini. Tetap hanya untuk entah bagaimana mendapatkan data dan mulai bereksperimen dengannya.

Berdasarkan string kueri, kami memahami bahwa kami harus meneruskan id sumber daya untuk mendapatkan informasi tentangnya. Namun, jika kita akan mengotomatisasi ini, kita juga perlu mentransfer id dari server game. Setelah menggali satu menit dalam kode sumber halaman, berikut ini ditemukan:

Mencoba ... Hebat! Kami mendapatkan daftar harga pembelian dan penjualan.
Sekarang Anda perlu memikirkan cara mem-parsing situs.
Pilihan jatuh pada Dalang untuk NodeJs.
Atas dasar itu, modul pertama subsistem, Scrapper, telah dibuat. Tugas utamanya adalah pergi ke situs, membuka, mem-parsing dan mengembalikan data dalam bentuk JSON. Kami mengambil sampel elemen N terakhir, pertimbangkan harga rata-rata, minimum dan maksimum. (Ke depan, saya akan mengatakan bahwa Anda perlu memperbaiki persentil untuk mengedit suara jika beberapa pemain memberikan harga jual yang terlalu tinggi atau rendah untuk pembelian) Kami mendapatkan jawaban sesuai dengan data:

Sekarang kita dapat beralih ke bagian selanjutnya - penyimpanan data .
Misalkan kita memiliki 2-3 konsumen data kami dan kami ingin memberi mereka sebuah array. Kami juga ingin menghindari permintaan yang sering ke l2on agar tidak masuk daftar hitam. Jadi kita perlu membuat modul kedua yang akan bertindak sebagai perantara antara l2on dan agen kami.
Metodologi survei dipilih sederhana. Setiap 5 menit sekali, modul harus meminta semua item dari daftar yang ditetapkan dan memberikan output dengan data untuk satu sumber daya serta output untuk analitik.
Untuk sistem ini, saya ingin mencoba Ktor - solusi server di Kotlin.
Saya tidak menggunakan database, tetapi saya memutuskan untuk menyimpan data terbaru di Singleton. Ya, solusinya bukan yang paling elegan, tetapi sangat cepat, dan kami akan selalu dapat mengoptimalkannya.
Jadi modul kedua dari sistem muncul - Harvester .
Harvester menyediakan dua titik akhir / item / {id} dan / metrik kepada pengguna
Jika semuanya jelas dengan yang pertama, maka yang terakhir mengembalikan data dalam format untuk sistem berikutnya - Prometheus


Penyimpanan data untuk analitik
Tautan perantara dipilih Prometheus - database Open Source untuk analitik yang bekerja melalui pendekatan Pull. Dengan kata lain, saat mengonfigurasi, Anda perlu menentukan dalam file yaml set penyedia data dan frekuensi polling. Dalam kasus kami, ini adalah titik akhir / metrik yang persis sama.
Kami mencoba menjalankan Prometheus (secara default porta 9090) dan jika kami melihat sesuatu yang mirip dengan Target:

Jadi kita berada di jalur yang benar. Ini berarti bahwa setiap 30 detik Prometheus pergi ke Harvester dan mengambil status terakhir untuk semua barang yang kami minati.
Tampilan data
Tahap selanjutnya adalah tampilan grafik yang indah.
Untuk rendering, Grafana dipilih , yang juga merupakan Open Source.
Pluses Grafana dan Prometheus - mereka tersedia dalam bentuk wadah Docker yang membutuhkan tindakan pengguna minimum.
Ketika Anda pertama kali memulai Grafana (port standar 3000), ia akan meminta Anda untuk menentukan database yang tersedia. Kami memilih Prometheus sebagai basis dan meresepkan alamat. Jika semuanya berjalan dengan baik, maka kita akan melihat:

Langkah selanjutnya adalah menggambar grafik.
Contoh permintaan untuk menggambar grafik penjualan:

Jadi, kami setiap saat melihat harga rata-rata untuk pembelian dan penjualan, serta dinamika harga.

Namun, ada kalanya harga jual minimum lebih tinggi dari harga pembelian maksimum. Ini berarti bahwa kita bisa mendapatkan keuntungan dengan mudah dalam bentuk "beli dan jual". Untuk saluran pengiriman, pemberitahuan dipilih oleh Telegram. Buat bot dan tambahkan tokennya ke Grafana (ya ya, itu memang mendukung pemberitahuan)

Cukup dengan menetapkan kondisi di mana pemberitahuan ini akan datang kepada kami.

Seperti yang bisa kita lihat dari grafik, situasi seperti itu terjadi di pasar.

Cloud
Kami mengemas setiap subsistem dalam wadah Docker dan memuatnya ke DigitalOcean atau layanan lain sesuai keinginan Anda. Tetapi ini tidak menghalangi kita untuk memulai seluruh sistem ini tanpa IP khusus. Sekarang kontainer minimum untuk DO harganya $ 5 per bulan.
Mulai Scrapper Pertama
docker run -d -p 6661: 6661 --name scrapper l2 / scrapper: terbaru
Di belakangnya Harvester
run docker -d -p 6662: 6662 -v / root / harvester: / res --link scrapper: scrapper l2harvester: terbaru
File ids.txt dengan format harus berada di folder / pemanen
id1 name1
id2 name2
Kesimpulan
Pada akhirnya, sistemnya adalah sebagai berikut:

Direncanakan di masa depan untuk menambahkan agen untuk memperbarui google docs, dan menghitung biaya kerajinan dengan cepat.
Saya tidak tahu apakah waktu operasi ini akan membawa manfaat, tetapi bagi saya pribadi itu adalah pengalaman yang baik untuk menyegarkan pengetahuan saya di bidang terapan. Kekhususan utama saya adalah aplikasi seluler. Pengembangan sisi server adalah keterampilan tambahan dan rasa ingin tahu.
Sebagai suplemen, saya lampirkan tautan untuk membiasakan diri dengan kode:
Scrapper
Pemanen
(Anda dapat mengumpulkan kontainer oleh tim
buruh pelabuhan membangun -t scrapper.
buruh bangunan build -t pemanen.)
Saya sangat berharap artikel ini menginspirasi seseorang dengan perasaan nostalgia, atau memberi inspirasi untuk beberapa ide baru. Terima kasih telah membaca artikel sampai akhir!