rubensayshi / gw2spidy
Dit project heeft als doel om je grafieken te geven van de verkoop en koop lijsten van items op de Guild Wars 2 Trade Market.
Hoe werkt het?
ArenaNet heeft de Trade Market zo gebouwd dat het in het spel wordt geladen vanaf een website.
Je kunt ook toegang krijgen tot deze website met een browser en gebruik je spel account om in te loggen en alle items en listings te bekijken.
Nu heb ik wat tools gebouwd die constant draaien om automatisch in te loggen op die website en alle data op te nemen die we kunnen vinden, als resultaat kan ik de verkoop listings opnemen voor alle items ongeveer elk uur en met die data kan ik grafieken maken met de prijs die verandert in de tijd!
Bijdragen
Iedereen is van harte welkom om bij te dragen, 99% kans dat je dit leest op github dus het moet niet te moeilijk zijn om te forken en pull requests te doen toch 🙂
Als je hulp nodig hebt met het opzetten van het project of het gebruik van git(hub), neem dan contact met me op en ik zal je graag helpen!
Als je een dump van de database wilt, aangezien dat een stuk makkelijker is om mee te werken, neem dan gewoon contact met me op 😉
Feedback / Help
Als je hulp nodig hebt of feedback hebt, kun je contact met me opnemen op [email protected] of kom bij me op irc.gamesurge.net #gw2spidy Drakie
Datum/tijd data
Zoals gewoonlijk heb ik niet echt nagedacht over tijdzones toen ik dit project startte, maar nu meerdere mensen het project forked hebben en ik data exporteer naar sommige mensen doet het er plots toe …. Alle gegevens worden opgeslagen in de tijdzone van de server, maar ik heb ervoor gezorgd dat de gegevens die naar buiten gaan (grafieken en API) worden geconverteerd naar UTC (en Highcharts converteert ze naar de browsers tijdzone).
Mailing List
Gelieve lid te worden van de Google Groups Mailing List voor gw2spidy zodat ik u op de hoogte kan houden van (grote) veranderingen / nieuwe versies van de Codebase!
Omgeving instellen
De eenvoudigste manier om aan de slag te gaan is door gebruik te maken van Vagrant. Deze methode zal u voorzien van een lokale virtuele machine met een draaiende instantie van gw2spidy in een enkel commando. Om dit te laten werken heeft u drie dingen nodig: Virtualbox, Ruby, en de Vagrant gem. Zodra je dit hebt, ga dan cd
in de gw2spidy directory en voer vagrant up
uit. Dit zal de basis virtuele machine ophalen om te ontwikkelen (een Ubuntu Precise 64bit server), alle benodigde pakketten installeren, mysql en nginx configureren, en dan de poort 80 van de virtuele machine doorsturen naar de poort 8080 van uw machine. Als het klaar is, bezoek dan localhost:8080
in een browser en je bent klaar om te gaan. Merk op dat dit slechts een deel van het crawlen doet dat nodig is om de database te vullen. Om verder te gaan met de setup, ga naar “Crawling the Tradingpost”.
Als alternatief, volg de stappen hieronder:
Ik zal je voorzien van een aantal korte setup instructies om je leven gemakkelijker te maken als je de code voor jezelf wilt draaien of wilt bijdragen.Er is ook een INSTALL bestand dat een knipsel bevat dat ik kopieer als ik mijn VM installeer, het zou moeten volstaan 😉
Er is veel veranderd en het zal waarschijnlijk nog wel een tijdje duren
Maak deel uit van het IRC kanaal en we kunnen praten!
Ik (Drakie) en andere mensen die er al een tijdje bij betrokken zijn, delen graag onze kennis en helpen je graag, vooral als je overweegt bij te dragen!
Linux
Ik run het project op een Linux server en veel van de vereisten zijn misschien niet beschikbaar op Windows en ik heb slechts (een heel klein beetje) (negatieve) ervaring met Windows.
Als je dit op een windows machine wilt draaien, voor ontwikkelingsdoeleinden, dan raad ik je sterk aan om gewoon een virtuele machine met Linux te draaien (vmware player is gratis en werkt best aardig).
Als je naar het IRC kanaal gaat, ik heb een VM image op mijn google drive (gemaakt door Marthisdil) met alles er op en er aan 😉
PHP 5.3
Je hebt PHP5.3 of hoger nodig voor de namespace ondersteuning etc.
U moet de volgende extensies geïnstalleerd hebben:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
Ik denk dat 4.x voldoende zal zijn, hoewel ik 5.x draai.
Aan de PHP kant gebruik ik PropelORM, dankzij dat kun je waarschijnlijk gemakkelijk overschakelen naar PostgreSQL of MSSQL als je moet 😉
Apache / Nginx / CLI
Het project zal prima werken met zowel Apache of Nginx (ik draai eigenlijk apache op mijn dev machine en nginx in productie), je kunt voorbeeldconfiguraties vinden in de docs
map van dit project.
Als je de code wilt draaien die de handelsmarkt doorzoekt, dan heb je command line toegang nodig, als je alleen de frontend code wilt draaien (en een database dump van mij wilt krijgen) dan kun je zonder 😉
Op een schone installatie moet je misschien apache herschrijven inschakelen met het commando: a2enmod rewrite
Memcache
Met behulp van de daemon memcache en de PHP Memcache lib kunnen sommige zaken eenvoudig in het geheugen worden opgeslagen (item- en typegegevens).
Alles werkt echter prima zonder memcache, als je memcache hebt geïnstalleerd maar niet wilt dat het project het gebruikt, definieer dan MEMCACHED_DISABLED in je config.inc.php en zet het op true.
U heeft wel de php5-memcache bibliotheek nodig, maar deze zal memcache nergens voor gebruiken 😉
Noteer dat u php5-memcache
nodig heeft en niet php5-memcached
Noteer dat u de memcache extensie nodig heeft, zelfs als u deze niet wilt gebruiken!
Redis
De spidering code gebruikt een aangepaste brouwwachtrij en een aangepast brouwsysteem om ervoor te zorgen dat we niet meer dan een x aantal requests doen.
Zowel de wachtrij als de slots zijn gebouwd met behulp van Redis (de Predis bibliotheek is al opgenomen in de vendor
map).
Vorige tijd gebruikte ik MySQL hiervoor, maar MySQL was een stuk zwaarder en met Redis is het ook iets sneller!
U moet redis-server installeren en het moet versie 2.2 of hoger
Als je Debian gebruikt moet je vanaf de broncode bouwen, ubuntu heeft een bijgewerkt pakket met apt-get 😉
Silex / Twig / Predis
Alleen wat PHP libs, al inbegrepen in de vendor
map.
jQuery / Highcharts / Twitter Bootstrap
Nog wat HTML / JS / CSS libs, reeds opgenomen in webroot/assets/vendor
folder.
U heeft de pear library Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js en grunt
Hoewel Node.js en grunt niet direct nodig zijn voor het draaien van gw2spidy, is grunt nodig om de js en css bestanden te bouwen die met de webpagina’s worden meegezonden. Dat betekent dat u geen node op uw webserver nodig heeft, maar de grunt taken op elke andere mac kunt uitvoeren zolang u de bestanden in webroot/assets/compiled
naar dezelfde directory op de webserver kopieert.
Installeer Node.js via het gebruikelijke installatie mechanisme voor uw OS. Daarna voert u npm insall -g grunt
uit om grunt globaal op de machine te installeren.
Project Setup
ArenaNet vindt het goed dat ik dit doe, maar toch wil ik het aantal verzoeken dat ik op hun website afschiet beperken of in ieder geval een beetje spreiden.Ik heb het concept van ‘request slots’ bedacht, ik stel een x-aantal slots in, claim er een als ik een request doe en geef het dan een acooldown voordat ik het weer kan gebruiken. Op die manier kan ik de vloed een beetje beter beheersen, technisch gezien wordt dit gedaan met Redis gesorteerde sets.
Achtergrond wachtrijen
Al het crawl werk wordt gedaan in achtergrond processen / daemons en het zware werk wordt gedaan met een paar wachtrijen, het wachtrij proces handelt ook de eerder genoemde verzoek slots af.Dit wordt ook gedaan met behulp van Redis gesorteerde sets.
Config / Env
Bedenk een naam die uw machine / evn vertegenwoordigt, bijvoorbeeld ruben-vm1 of gw2spidy-prod-vps2.
Kopieer de config/cnf/example-custom-cnf.json
naar config/cnf/<your-chosen-name>.json
en bewerk het om de waarden voorauth_email en auth_password in te stellen.
Kopieer config/cnf/example-env
naar config/cnf/env
en bewerk het, het bevat een regel voor elk configuratiebestand waarvan het moet ladenconfig/cnf/<name>.json
Vervang de eerste regel (ruben-vm1) met de naam die u eerder had gekozen, laat de dev en default staan, dat zijn andere configuratiebestanden die het ook moet laden (of verander dev in prod als u geen debug modus wilt.
De configuratie bestanden die je opgeeft config/cnf/env
worden geladen (in omgekeerde volgorde), en overschrijven de vorige.Voor het overladen van andere configuratie waardes (zoals database login enz.), controleer config/cnf/default.json
voor alle opties die je ook in je eigen config bestand zou kunnen zetten.
De config/cnf/env
en alle config/cnf/*.json
andere dan default.json
, dev.json
en prod.json
staan op .gitignore zodat ze niet onder versiebeheer vallen
Database Setup
In de config
map staat een config/schema.sql
(gegenereerd door propel op basis van config/schema.xml
, dus database wijzigingen moeten worden gemaakt in de XML en dan het genereren van het SQL bestand!).
U moet een database genaamd ‘gw2spidy’ maken en de config/schema.sql
erin laden. Daarna importeer je config/itemTypesAndDisciplines.sql
om bepaalde stabiele Disciplines en item types te krijgen.
RequestSlots Setup
Run tools/setup-request-slots.php
om de initiële request slots aan te maken, je kunt dit ook draaien tijdens ontwikkeling om de slots opnieuw te initiëren zodat je ze direct weer kunt gebruiken als ze allemaal op cooldown staan.
Het bouwen van de Item Database
De hieronder beschreven scripts worden aangeroepen door het script bin/rebuild-items-recpipes.sh
.
Om de item database te bouwen, moet u tools/update-items-from-api.php
uitvoeren. Dit geeft je alle bekende items in het spel en maakt nieuwe types en subtypes on the fly.
Daarna kun je het script ’s nachts draaien om up to date te blijven met bekende items.
Als je de recept data in de database wilt of nodig hebt, moet je ookphp tools/create-recipe-map /some/place/on/harddrive
draaien. Nadat dit is voltooid, moet u ook de kaart importeren metphp tools/import-recipe-map /some/place/on/harddrive
.
Het maken van de web assets
gw2spidy serveert js en css bestanden in een enkel bestand en (afhankelijk van de configuratie) geminificeerd. Om deze bestanden te bouwen, hoeft u alleen maar grunt
.
Crawling The Tradingpost
De ItemListingDB Worker zelf is dit script: daemons/worker-queue-item-listing-db.php
.
Het zal items uit de listing wachtrij halen en ze verwerken, deze wachtrij-items worden automatisch aangevraagd met hun prioriteit, dus je zou daemons/fill-queue-item-listing-db.php
maar één keer hoeven te draaien om de eerste batch binnen te krijgen.
Omdat de v2/commerce API’s zijn ingeschakeld, gebruikt de werker het v2/commerce/listings endpoint om het geconfigureerde ‘items-per-verzoek’ aantal items in 1 keer te verwerken (max 250!
Maar als het script faalt kunnen we soms een wachtrij-item verliezen of nieuwe items kunnen worden toegevoegd aan de database op een bepaald punt sothere’s een daemons/supervise-queue-item-listing-db.php
script dat ervoor zorgt dat de wachtrij nog steeds goed gevuld is.
Er is een prioriteitssysteem zodat sommige items (zoals wapens boven een bepaalde zeldzaamheid / level) vaker verwerkt worden dan andere (zoals salvage kits, die niemand koopt van de TP …).
Zie de Prioriteitssysteem sectie hieronder voor meer info daarover!
Gem Worker
Het daemons/worker-gem.php
script doet 2 verzoeken aan de gem-exchange GW2-API om de wisselkoersen en volume op te halen en slaapt dan 180 seconden (3 minuten).
Running The Workers
De werkers doen allemaal 100 loops om hun specifieke taak te doen of als er geen taken zijn doen ze korte slaapjes wachtend op een taak.
Ze zullen ook slapen als er geen slots beschikbaar zijn.
Voorheen gebruikte ik 4 werkers parallel metwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Waarbij ik de .1 vervang door welk nummer van de 4 het is, zodat ik 4 logs kreeg om te volgen.
Ik heb nu wat bash scripts toegevoegd in de bin
map aan bin/start-workers.sh <num-listing-workers> <num-gem-workers>
en bin/stop-workers.sh <now>
om ze te beheren.
Je zou de bash scripts moeten bekijken en begrijpen voordat je ze uitvoert imo 😉 maar je zou me ook op mijn blauwe ogen kunnen vertrouwen en het gewoon uitvoeren xD
Priority System
Het aantal requests dat we doen is gelimiteerd door ons requestslot systeem, helaas zijn we nu gebonden aan het doen van 1 item per request (voorheen konden we tot 250 combineren).
Daarom heb ik een prioriteiten systeem gemaakt om ‘belangrijke’ items vaker te verwerken, in deze spreadsheet heb ik de prioriteiten berekend:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
dit is iets veranderd, ik moet de spreadsheet updaten en zal hier binnenkort wat schrijven
GW2 Sessies (verouderd)
Tijdens het spideren hadden we vroeger toegang tot de tradingpost via een sessie die werd aangemaakt door in te loggen op accounts.guildwars2.com.
Na het inloggen krijgen we een session_key die toegang geeft tot de tradingpost, echter beperkt tot het verkrijgen van alleen de lijsten met items!
Als je de tradingpost opent vanuit het spel krijg je toegang met een sessie_key gegenereerd uit de spel login, deze sessies hebben toegang tot meer functies van de tradingpost!
Met die sessie kun je ook de lijst van aanbiedingen voor de verschillende prijzen zien, in plaats van alleen de laagste verkoop en hoogste koop!
Voor de gem-exchange kun je met de ingame session_key conversies berekenen, terwijl je met de accounts.guildwars2.com session alleen een afgerond gemiddelde krijgt (wat nogal nutteloos is).
ArenaNet heeft de laatste tijd de item lijsten (zoekresultaten en dergelijke) erg onnauwkeurig gemaakt (door caching), dit kun je ook ingame zien.
Ik wil ook gem-exchange data verzamelen ….
Dus had ik een manier nodig om een ingame session_key te kunnen gebruiken bij het spideren!
Je kunt de session_key onderscheppen door of Fiddle2r te gebruiken om het HTTPS verkeer te onderscheppen of door wat custom tools te gebruiken om de URLs uit het share geheugen te halen …
Ik heb een tabel toegevoegd aan de database met de naam gw2session
en een formulier op /admin/session
om de ingame session_key in te voeren, het vereist dat je ook een ‘secret’ invult die gelijk is aan wat je configureert in de config of niet nodig is op dev envs
Ik weet niet precies wat je kunt doen met iemand anders session_key dus ik vertrouw erop dat ik zelf niet verslap en de session_key regelmatig update en accepteer niet dat andere mensen mij hun session_key geven!
Ik weet dat je in combinatie met een charid kooporders en dergelijke van buiten het spel kunt plaatsen, dus je moet voorzichtig zijn met deze informatie;)
Ik heb een klein tooltje (van iemand anders) dat snel de session_key pakt (door er naar te zoeken in het gedeelde geheugen) zonder veel gedoe, ik zal het niet publiekelijk delen maar je zou kunnen overwegen om het in het IRC kanaal te vragen 😉
Auteursrecht en Licentie
Copyright (c) 2012, Ruben de Vries
Alle rechten voorbehouden.
Herdistributie en gebruik in broncode en binaire vorm, met of zonder wijziging, is toegestaan mits aan de volgende voorwaarden wordt voldaan:
- Herdistributie van broncode moet de bovenstaande copyrightvermelding, deze lijst met voorwaarden en de volgende disclaimer bevatten.
- Herdistributie in binaire vorm moet de bovenstaande copyrightvermelding, deze lijst met voorwaarden en de volgende disclaimer reproduceren in de documentatie en/of andere materialen die bij de distributie worden geleverd.
DEZE SOFTWARE WORDT DOOR DE AUTEURSRECHTHOUDERS EN MEDEWERKERS “AS IS” GELEVERD EN ALLE UITDRUKKELIJKE OF STILZWIJGENDE GARANTIES, MET INBEGRIP VAN, MAAR NIET BEPERKT TOT, DE STILZWIJGENDE GARANTIES VAN VERKOOPBAARHEID EN GESCHIKTHEID VOOR EEN BEPAALD DOEL WORDEN VERWORPEN. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
De standpunten en conclusies in de software en documentatie zijn die van de auteurs en moeten niet worden geïnterpreteerd als vertegenwoordiging van het officiële beleid, expliciet of impliciet, van het gw2spidy project.
Leave a Reply