rubensayshi / gw2spidy
Ez a projekt célja, hogy a Guild Wars 2 kereskedelmi piacán található tárgyak eladási és vételi listáiról grafikonokat adjon.
Hogyan működik?
ArenaNet úgy építette fel a Kereskedelmi piacot, hogy az egy weboldalról töltődik be a játékba.
Ezt a weboldalt böngészővel is elérheted, és a játékfiókoddal bejelentkezve megtekintheted az összes tárgyat és listát.
Most amit építettem, az néhány eszköz, ami folyamatosan futni fog, hogy automatikusan bejelentkezzen erre a weboldalra és rögzítse az összes adatot, amit találunk, ennek eredményeként fel tudom venni az összes tárgy eladási listáját körülbelül minden órában, és ezekkel az adatokkal grafikonokat tudok készíteni az idővel változó árakkal!
Hozzájárulás
Mindenki nagyon szívesen hozzájárul, 99% esélye van, hogy ezt a githubon olvasod, így nem lehet túl nehéz a forkolás és a pull requestek elvégzése, igaz 🙂 ?
Ha bármilyen segítségre van szükséged a projekt beállításával vagy a git(hub) használatával kapcsolatban, akkor csak írj nekem és szívesen segítek!
Ha szeretnél egy dumpot az adatbázisból, mivel azzal sokkal könnyebb dolgozni, akkor csak írj nekem 😉
Visszajelzés / segítség
Ha segítségre van szükséged vagy bármilyen visszajelzésed van, akkor írj nekem a [email protected] vagy csatlakozz hozzám irc-en.gamesurge.net #gw2spidy Drakie
Dátum/idő adatok
A szokás szerint nem igazán gondoltam az időzónákra, amikor elkezdtem ezt a projektet, de most, hogy több ember forkolta a projektet, és hogy exportálom az adatokat néhány embernek, hirtelen számít ….Minden adatot a szerver időzónájában tárolunk, azonban gondoskodtam arról, hogy a kimenő adatok (diagramok és API) UTC-be legyenek konvertálva (és a Highcharts a böngésző időzónájába konvertálja).
Levelezőlista
Kérlek, csatlakozz a gw2spidy Google Groups levelezőlistájához, hogy folyamatosan tájékoztatni tudjalak minden (nagyobb) változásról / a kódbázis új verzióiról!
Környezet beállítása
A legegyszerűbb módja az indulásnak a Vagrant használata. Ez a módszer egyetlen paranccsal biztosít egy helyi virtuális gépet a gw2spidy futó példányával. Ehhez három dologra lesz szükséged: Virtualbox, Ruby és a Vagrant gem. Ha ezekkel rendelkezel, egyszerűen csak cd
a gw2spidy könyvtárba, és futtasd a vagrant up
parancsot. Ez le fogja hívni az alap virtuális gépet a fejlesztéshez (egy Ubuntu Precise 64bit szerver), telepíti az összes szükséges csomagot, konfigurálja a mysql-t és az nginx-et, majd továbbítja a virtuális gép 80-as portját a géped 8080-as portjára. Ha ez megtörtént, látogasson el a localhost:8080
-ra egy böngészőben, és már készen is van. Vegye figyelembe, hogy ez csak az adatbázis feltöltéséhez szükséges kúszás egy részét végzi el. A beállítás folytatásához menj a “Crawling the Tradingpost” című fejezetbe.
Alternatívaként kövesd az alábbi lépéseket:
Megadok néhány rövid beállítási utasítást, hogy megkönnyítsem az életed, ha a kódot magadnak akarod futtatni vagy közreműködni.Van egy INSTALL fájl is, ami tartalmaz egy részletet, amit én másolok be, amikor beállítom a VM-emet, ennek elégnek kell lennie 😉
SOK minden változott, és valószínűleg még egy darabig folytatódni fog
Lépj be az IRC csatornára, és beszélgethetünk!
Én (Drakie) és más, már egy ideje részt vevő emberek szívesen megosztjuk a tudásunkat és segítünk neked, különösen, ha fontolóra veszed a hozzájárulást!
Linux
A projektet egy linuxos szerveren futtatom és sok követelmény nem biztos, hogy elérhető a windowson és csak (egy pici) (negatív) tapasztalatom van a windowsról.
Ha ezt windows gépen akarod futtatni, fejlesztési céllal, akkor erősen javaslom, hogy csak egy virtuális gépet futtass linuxszal (a vmware player ingyenes és elég jól működik).
Ha eljutsz az IRC-csatornára, van egy VM-kép a google drive-on (Marthisdil készítette), ahol minden be van állítva és készen áll 😉
PHP 5.3
A névtér-támogatáshoz stb. PHP5.3-ra vagy magasabb verzióra lesz szükséged.
A következő kiterjesztésekre lesz szükséged telepítve:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
A 4.x szerintem elég lesz, bár én 5.x-et futtatok.
A PHP oldalon PropelORM-ot használok, ennek köszönhetően valószínűleg könnyen át tudsz váltani PostgreSQL-re vagy MSSQL-re, ha kell 😉
Apache / Nginx / CLI
A projekt jól fog működni Apache vagy Nginx-el is (én valójában apache-t futtatok a dev gépemen és nginx-et a termelésben), a projekt docs
mappájában találsz példakonfigurációkat.
Ha a kódot akarod futtatni, ami átpókolja a kereskedelmi piacot, akkor parancssori hozzáférésre lesz szükséged, ha csak a frontend kódot akarod futtatni (és adatbázis dumpot kapni tőlem), akkor anélkül is élhetsz 😉
Tiszta telepítésnél szükséged lehet az apache rewrite engedélyezésére a paranccsal: a2enmod rewrite
Memcache
A memcache daemon és a PHP Memcache lib segítségével könnyen cache-ezhetsz néhány dolgot a memóriában (elem és típus adatok).
Mindenesetre memcache nélkül is jól fog működni minden, ha van memcache telepítve, de nem akarod, hogy a projekt használja, akkor definiáld a MEMCACHED_DISABLED-et a config.inc.php-ban és állítsd true-ra.
Szükséged van a php5-memcache könyvtárra, de az nem fogja használni a memcache-t semmire 😉
Ne feledd, hogy a php5-memcache
kell, nem a php5-memcached
Ne feledd, hogy a memcache bővítményre szükséged van, még akkor is, ha nem akarod használni!
Redis
A pókhálós kód egy egyedi brew queue-t és néhány egyedi brew rendszert használ, hogy biztosítsuk, hogy nem csinálunk x-nél több kérést.
A queue és a slotok is a Redis segítségével épülnek fel (a Predis könyvtár már benne van a vendor
mappában).
Előtte MySQL-t használtam erre, de a MySQL használata sokkal nagyobb terhelést jelentett, a Redis használatával pedig valamivel gyorsabb is!
A redis-server-t kell telepíteni, és a 2-es verziónak kell lennie.2 vagy magasabb
Ha debian-t használsz, akkor forrásból kell buildelni, az ubuntunak van egy frissített csomagja az apt-get segítségével 😉
Silex / Twig / Predis
Pusztán néhány PHP libs, már benne van a vendor
mappában.
jQuery / Highcharts / Twitter Bootstrap
Mindössze néhány HTML / JS / CSS libs, már benne van a webroot/assets/vendor
mappában.
Szükséged lesz a pear könyvtárra Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js és grunt
Míg a Node.js és a grunt nem szükséges közvetlenül a gw2spidy futtatásához, a grunt a weboldalakkal együtt szolgáltatott js és css fájlok létrehozásához szükséges. Ez azt jelenti, hogy nincs szükséged a node-ra a webszervereden, de a grunt feladatokat bármely más gépen is elvégezheted, ha a webroot/assets/compiled
-ben található fájlokat átmásolod ugyanabba a könyvtárba a webszervereden.
Telepítsd a Node.js-t az operációs rendszered szokásos telepítési mechanizmusával. Ezután futtasd a npm insall -g grunt
-t, hogy globálisan installgrunt-ot telepítsd a gépre.
Project Setup
ArenaNet rendben van azzal, hogy ezt csinálom, de ettől függetlenül szeretném korlátozni a kérések mennyiségét, amit a weboldalukra lövök, vagy legalábbis egy kicsit eloszlatni őket.Kitaláltam ezt a koncepciót a “kérési résidők”, beállítok egy x számú résidőt, igényelek egyet, amikor egy kérést csinálok, majd adok neki acooldownt, mielőtt újra használhatom. így egy kicsit jobban tudom irányítani az áradatot, a technikai oldalról ez a Redis rendezett készletekkel történik.
Background Queues
Az összes kúszási munka háttérfolyamatban / daemonokban történik, és a nehéz munkát néhány várólistával végzik, a várólisták processalso kezeli a korábban említett kérési résidőket.Ez is a Redis rendezett halmazok használatával történik.
Config / Env
Gondolj egy olyan nevet, ami a gépedet / evn-t képviseli, pl. ruben-vm1 vagy gw2spidy-prod-vps2.
Kopírozd a config/cnf/example-custom-cnf.json
-t a config/cnf/<your-chosen-name>.json
-be és szerkeszd meg, hogy beállítsd az auth_email és auth_password értékeket.
Kopírozd a config/cnf/example-env
-t a config/cnf/env
-ba és szerkeszd, tartalmaz egy sort minden egyes config fájlhoz, amit be kell töltenieconfig/cnf/<name>.json
Az első sort (ruben-vm1) cseréld ki a korábban választott névre, hagyd a dev és az alapértelmezettet, ezek a többiconfig fájl, amit szintén be kell töltenie (vagy cseréld le a dev-et prod-ra, ha nem akarsz debug módot.
A megadott config/cnf/env
konfigurációs fájlok betöltődnek (fordított sorrendben), felülírva az előzőeket.Az egyéb konfigurációs értékek (pl. adatbázis login stb.), ellenőrizze config/cnf/default.json
az összes olyan opciót, amelyet az egyéni konfigurációs fájlban is megadhat.
A config/cnf/env
és bármely más config/cnf/*.json
, mint default.json
, dev.json
és prod.json
be van kapcsolva.gitignore, így nem lesznek verzióvezéreltek
Adatbázis beállítása
A config
mappában van egy config/schema.sql
(amelyet a propel generál a config/schema.xml
alapján, így az adatbázis módosításait az XML-ben kell elvégezni, majd generálni az SQL fájlt!).
El kell hoznod egy ‘gw2spidy’ nevű adatbázist és betölteni a config/schema.sql
-et. Utána importáldconfig/itemTypesAndDisciplines.sql
, hogy megkapj bizonyos stabil Disciplines és item típusokat.
RequestSlots Setup
Futtasd tools/setup-request-slots.php
a kezdeti request slotok létrehozásához, ezt a fejlesztés során is lefuttathatod, hogy újraindítsd a slotokat, így azonnal újra használhatod őket, ha mindannyian cooldownban vannak.
A tárgyadatbázis felépítése
Az alább leírt szkripteket a bin/rebuild-items-recpipes.sh
szkript hívja meg.
A tárgyadatbázis felépítéséhez a tools/update-items-from-api.php
szkriptet kell futtatni. Ez megadja az összes ismert tárgyat a játékban, és menet közben új típusokat és altípusokat hoz létre.
Ezután érdemes a szkriptet esténként futtatni, hogy naprakészen tartsd az ismert tárgyakat.
Ha az adatbázisban lévő receptadatokat akarod vagy kell, akkor aphp tools/create-recipe-map /some/place/on/harddrive
futtatására is szükséged van. Miután ez megtörtént, a térképet is importálnia kell aphp tools/import-recipe-map /some/place/on/harddrive
segítségével.
A webes eszközök létrehozása
gw2spidy a js és css fájlokat egyetlen fájlban és (a konfigurációtól függően) minifikálva szolgálja ki. Ezen fájlok létrehozásához egyszerűen csak a grunt
.
Crawling The Tradingpost
Az ItemListingDB Worker maga ez a szkript: daemons/worker-queue-item-listing-db.php
.
Az itemeket a listázási sorból veszi ki és feldolgozza őket, ezek a sorba állított itemek automatikusan a prioritásukkal kerülnek sorba, így csak egyszer kell futtatnod a daemons/fill-queue-item-listing-db.php
-t, hogy a kezdeti köteg bejusson.
Mivel a v2/commerce API-k engedélyezve vannak, a munkás a v2/commerce/listings végpontot használja a konfigurált ‘item-per-request’ mennyiségű item feldolgozásához 1 alkalommal (max 250!).).
Ha azonban a szkript sikertelenül működik, akkor néha elveszíthetünk egy sor-elemet, vagy új elemek kerülhetnek az adatbázisba egy bizonyos ponton, ezért van egy daemons/supervise-queue-item-listing-db.php
szkript, amely biztosítja, hogy a sor még mindig megfelelően feltöltődik.
Egy prioritási rendszer van érvényben, hogy bizonyos tárgyak (mint például a fegyverek bizonyos ritkaság / szint felett) gyakrabban kerülnek feldolgozásra, mint mások (mint például a mentőcsomagok, amelyeket senki sem vásárol a TP-ből …).
Lásd a Priority System (prioritási rendszer) részt, ahol további információkat találsz erről!
Gem Worker
A daemons/worker-gem.php
script 2 kérést intéz a gem-exchange GW2-API-hoz, hogy lekérje az árfolyamokat és a mennyiséget, majd 180 másodpercig (3 perc) alszik.
Running The Workers
A workerek mind 100 loopot csinálnak, hogy elvégezzék az adott feladatukat, vagy ha nincs feladat, akkor rövid alvással várnak egy feladatra.
Szintén alszanak, ha nincs szabad hely.
Előtte 4 munkást futtattam párhuzamosan awhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Hol a .1-et helyettesítettem azzal, hogy a 4 közül melyik szám az, így 4 naplót kaptam a farokba.
Most hozzáadtam néhány bash szkriptet a bin
mappában a bin/start-workers.sh <num-listing-workers> <num-gem-workers>
és bin/stop-workers.sh <now>
-hoz, hogy kezeljem őket.
A bash scripteket meg kellene nézned és értened, mielőtt futtatod őket imo 😉 de bízhatsz a kék szememben is és egyszerűen futtathatod xD
Prioritási rendszer
A kérések mennyiségét a requestslot rendszerünk korlátozza, sajnos most 1 elemet kell csinálnunk kérésenként(korábban akár 250-et is kombinálhattunk).
Szóval létrehoztam egy prioritási rendszert, hogy a “fontos” tételeket gyakrabban dolgozzuk fel, ebben a táblázatban kiszámoltam a prioritásokat:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
ez kissé megváltozott, frissítenem kell a táblázatot és hamarosan ide kell írnom néhány dolgot
GW2 munkamenetek (elavult)
A pókoláskor régebben a fiókok bejelentkezésével létrehozott munkamenet segítségével értük el a tradingpostot.guildwars2.com.
A bejelentkezés után kapunk egy session_key-t, ami lehetővé teszi a hozzáférést a tradingposthoz, azonban csak arra korlátozódik, hogy csak a tárgyak listáját tudjuk megszerezni!
Ha a játékon belülről nyitjuk meg a tradingpostot, akkor a játékba való bejelentkezésből generált session_key-vel férünk hozzá, ezek a sessionök a tradingpost több funkciójához is hozzáférnek!
Ezzel a sessionnel a különböző árú ajánlatok listáját is láthatjuk, nem csak a legalacsonyabb eladási és legmagasabb vételi árat!
A drágakőcsere esetében az ingame session_key lehetővé teszi az átváltások kiszámítását, míg az accounts.guildwars2.com session csak egy kerekített átlagot ad (ami eléggé haszontalan).
Az utóbbi időben az ArenaNet elrontotta a tárgylistákat (keresési eredmények és hasonlók), hogy nagyon pontatlanok legyenek (a cache miatt), ezt is láthatod ingame.
A drágakőcsere adatokat is szeretnék gyűjteni …
Szóval szükségem volt egy módra, hogy képes legyek használni egy ingame session_key-t a spidering során!
A session_key-t elfoghatod a Fiddle2r segítségével a HTTPS trafic elfogására, vagy néhány egyéni eszközzel az URL-ek elkapására a megosztási memóriából …
Hozzáadtam egy gw2session
nevű táblát az adatbázishoz és egy űrlapot a /admin/session
-en az ingame session_key beillesztéséhez, ez megköveteli, hogy kitölts egy ‘secret’-et is, ami megegyezik azzal, amit a configban konfigurálsz, vagy nem szükséges a dev env-ken
Nem tudom pontosan, mit lehet csinálni valaki más session_key-jével, így bízom abban, hogy én nem lazsálok és rendszeresen frissítem a session_key-t, és nem fogom elfogadni, hogy mások megadják nekem a session_key-jüket!
Teljesen biztosra tudom, hogy egy chariddal kombinálva a játékon kívülről is adhatsz vételi megbízásokat és hasonlókat, tehát óvatosan kell bánni ezekkel az információkkal 😉
Van egy kis eszközöm (amit valaki más adott), ami gyorsan, különösebb gond nélkül megszerzi a session_key-t (a megosztott memóriában keresve azt), nem fogom nyilvánosan megosztani, de megfontolhatod, hogy csatlakozz az IRC csatornához és elkérd 😉
Copyright és licenc
Copyright (c) 2012, Ruben de Vries
Minden jog fenntartva.
Az újraelosztás és felhasználás forrás- és bináris formában, módosítással vagy anélkül, a következő feltételek teljesülése esetén engedélyezett:
- A forráskód újraelosztásakor a fenti szerzői jogi közleményt, a jelen feltétellistát és a következő nyilatkozatot kell megtartani.
- A bináris formában történő újraelosztáskor a fenti szerzői jogi közleményt, a jelen feltétellistát és a következő nyilatkozatot kell feltüntetni a dokumentációban és/vagy a terjesztéshez mellékelt egyéb anyagokban.
EZT A SZOFTVERT A SZERZŐI JOGTULAJDONOSOK ÉS A KÖZREMŰKÖDŐK ÚGY BOCSÁTJÁK RENDELKEZÉSRE, AHOGY VAN, ÉS MINDEN KIFEJEZETT VAGY HALLGATÓLAGOS SZAVATOSSÁG, BELEÉRTVE, DE NEM KIZÁRÓLAGOSAN, AZ ELADHATÓSÁG ÉS A MEGHATÁROZOTT CÉLRA VALÓ ALKALMASSÁG HALLGATÓLAGOS SZAVATOSSÁGÁT KIZÁRJÁK. A SZERZŐI JOGTULAJDONOSOK VAGY A KÖZREMŰKÖDŐK SEMMILYEN ESETBEN SEM FELELNEK SEMMILYEN KÖZVETLEN, KÖZVETETT, VÉLETLEN, KÜLÖNLEGES, PÉLDAMUTATÓ VAGY KÖVETKEZMÉNYES KÁRÉRT (BELEÉRTVE, DE NEM KIZÁRÓLAGOSAN A HELYETTESÍTŐ ÁRUK VAGY SZOLGÁLTATÁSOK BESZERZÉSÉT; A HASZNÁLAT, AZ ADATOK VAGY A NYERESÉG ELVESZTÉSÉT; VAGY AZ ÜZLETMENET MEGSZAKÍTÁSÁT), BÁRMILYEN OKBÓL ÉS BÁRMILYEN FELELŐSSÉGI ELMÉLET ALAPJÁN, AKÁR SZERZŐDÉS, SZIGORÚ FELELŐSSÉG, AKÁR JOGELLENES KÁROKOZÁS (BELEÉRTVE A GONDATLANSÁGOT VAGY EGYÉBKÉNT) MIATT, AMELY BÁRMILYEN MÓDON A SZOFTVER HASZNÁLATÁBÓL ERED, MÉG AKKOR SEM, HA TUDTAK AZ ILYEN KÁR LEHETŐSÉGÉRŐL.
A szoftverben és a dokumentációban szereplő nézetek és következtetések a szerzők sajátjai, és nem értelmezhetők úgy, mintha a gw2spidy projekt hivatalos politikáját képviselnék, sem kimondva, sem hallgatólagosan.
Leave a Reply