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:

  1. Herdistributie van broncode moet de bovenstaande copyrightvermelding, deze lijst met voorwaarden en de volgende disclaimer bevatten.
  2. 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