rubensayshi / gw2spidy

Dette projekt har til formål at give dig grafer over salgs- og købsnoteringer af genstande på Guild Wars 2 Trade Market.

Hvordan virker det?

ArenaNet har bygget Trade Market, så det bliver indlæst i spillet fra et websted.
Du kan også få adgang til dette websted med en browser og bruge din spilkonto til at logge ind og se alle genstande og lister.

Nu er det jeg har bygget nogle værktøjer som vil køre konstant for automatisk at logge ind på denne hjemmeside og registrere alle data vi kan finde, som resultat kan jeg registrere salgslisterne for alle items ca. hver time og med disse data kan jeg lave grafer med prisen der ændrer sig over tid!

Bidrage

Alle er meget velkomne til at bidrage, 99% chance for at du læser dette på github, så det burde ikke være for svært at fork og lave pull requests right 🙂 ?

Hvis du har brug for hjælp med opsætning af projektet eller brug af git(hub), så kontakt mig bare, så hjælper jeg dig gerne!
Hvis du vil have et dump af databasen, da det er meget nemmere at arbejde med, så kontakt mig bare 😉

Feedback / Hjælp

Hvis du har brug for hjælp eller har feedback, så kan du kontakte mig på [email protected] eller deltage på irc.gamesurge.net #gw2spidy Drakie

Dato/tidsdata

Som sædvanlig tænkte jeg ikke rigtig på tidszoner, da jeg startede dette projekt, men nu hvor flere mennesker har forked projektet, og jeg eksporterer data til nogle mennesker, betyder det pludselig noget ….Alle data gemmes i serverens tidszone, men jeg har sørget for, at data, der går ud (diagrammer og API), konverteres til UTC (og Highcharts konverterer det til browsernes tidszone).

Mailingliste

Gå venligst med på Google Groups Mailingliste for gw2spidy, så jeg kan holde dig opdateret om eventuelle (større) ændringer / nye versioner af kodebasen!

Miljøopsætning

Den nemmeste måde at komme i gang på er ved at bruge Vagrant. Denne metode vil give dig en lokal virtuel maskine med en kørende instans af gw2spidy i en enkelt kommando. For at dette kan fungere, skal du bruge tre ting: Virtualbox, Ruby og Vagrant-gem’en. Når du har dette, skal du blot cd ind i gw2spidy-mappen og køre vagrant up. Dette vil hente den virtuelle basismaskine til udvikling (en Ubuntu Precise 64bit-server), installere alle de nødvendige pakker, konfigurere mysql og nginx, og derefter videresende den virtuelle maskines port 80 til din maskines port 8080. Når det er færdigt, skal du besøge localhost:8080 i en browser, og så er du klar til at gå i gang. Bemærk, at dette kun gør noget af den crawling, der er nødvendig for at fylde databasen op. Hvis du vil fortsætte opsætningen, skal du gå til “Crawling the Tradingpost”.

Alternativt kan du følge nedenstående trin:

Jeg vil give dig nogle korte opsætningsinstruktioner for at gøre dit liv lettere, hvis du ønsker at køre koden for dig selv eller bidrage.Der er også en INSTALL-fil, som indeholder et snippet jeg copy paste når jeg sætter min VM op, det burde være nok 😉

MEGET har ændret sig og vil højst sandsynligt fortsætte et stykke tid endnu

Gå med i IRC-kanalen og vi kan snakke!
Mig (Drakie) og andre der allerede har været involveret i et stykke tid er glade for at dele vores viden og hjælpe dig, specielt hvis du overvejer at bidrage!

Linux

Jeg kører projektet på en Linux-server og mange af kravene er måske ikke tilgængelige på windows og jeg har kun (en lillebitte smule) (negativ) erfaring med windows.
Hvis du ønsker at køre dette på en windows-maskine, til udviklingsformål, så foreslår jeg kraftigt at du bare kører en virtuel maskine med linux (vmware player er gratis og virker ret godt).
Hvis du finder vej til IRC-kanalen, har jeg et VM-aftryk på mit google-drev (lavet af Marthisdil) med alt opsat og klar til at rulle 😉

PHP 5.3

Du skal bruge PHP5.3 eller højere til namespace-understøttelse osv.
Du skal have følgende udvidelser installeret:

  • php5-curl
  • php5-mysql
  • php5-memcache

MySQL / Propel

Jeg tror, at 4.x vil være tilstrækkeligt, selvom jeg kører 5.x.
På PHP-siden bruger jeg PropelORM, takket være det kan du sikkert nemt skifte til PostgreSQL eller MSSQL, hvis du skal 😉

Apache / Nginx / CLI

Projektet vil fungere fint med både Apache eller Nginx (jeg kører faktisk apache på min dev-maskine og nginx i produktion), du kan finde eksempelkonfigurationer i docs-mappen i dette projekt.
Hvis du vil køre koden, der spider gennem handelsmarkedet, så skal du have adgang til kommandolinjen, hvis du bare vil køre frontend-koden (og få et database-dump fra mig), så kan du leve uden 😉

På en ren installation skal du muligvis aktivere apache rewrite med kommandoen: a2enmod rewrite

Memcache

Ved hjælp af memcache daemon og PHP Memcache lib til nemt at cache nogle ting i hukommelsen (element- og typedata).
Hvertfald vil alt fungere fint uden memcache, hvis du har memcache installeret, men ikke ønsker at projektet skal bruge det, skal du definere MEMCACHED_DISABLED i din config.inc.php og sætte den til true.
Du HAR brug for php5-memcache biblioteket, men det vil ikke bruge memcache til noget 😉

Bemærk at du skal bruge php5-memcache ikke php5-memcached
Bemærk at du skal have memcache udvidelsen, selvom du ikke ønsker at bruge den!

Redis

Koden til spidering bruger en brugerdefineret brygkø og et eller andet brugerdefineret brygsystem for at sikre, at vi ikke laver mere end x antal forespørgsler.
Både køen og slots er bygget ved hjælp af Redis (Predis-biblioteket er allerede inkluderet i vendor-mappen).
Tidligere brugte jeg MySQL til dette, men at bruge MySQL var en del tungere belastning, og med Redis er det også lidt hurtigere!

Du skal installere redis-server, og det skal være version 2.2 eller højere
Hvis du bruger debian skal du bygge fra kildekode, ubuntu har en opdateret pakke med apt-get 😉

Silex / Twig / Predis

Just nogle PHP libs, allerede inkluderet i vendor mappen.

jQuery / Highcharts / Twitter Bootstrap

Bare nogle HTML / JS / CSS libs, allerede inkluderet i webroot/assets/vendor mappen.

Du skal bruge pærebiblioteket Log

pear channel-discover pear.phing.infopear install phing/phingpear install Log

Node.js og grunt

Mens Node.js og grunt ikke er direkte nødvendige for at køre gw2spidy, er grunt nødvendig for at bygge de js og css-filer, der serveres med websiderne. Det betyder, at du ikke behøver Node på din webserver, men kan udføre grunt-opgaverne på en hvilken som helst anden macine, så længe du kopierer filerne i webroot/assets/compiled over i den samme mappe på webserveren.

Installer Node.js via den sædvanlige installationsmekanisme for dit operativsystem. Herefter skal du køre npm insall -g grunt for globalt at installere grunt på maskinen.

Projektopsætning

ArenaNet er okay med, at jeg gør dette, men ikke desto mindre vil jeg gerne begrænse mængden af forespørgsler, jeg skyder på deres hjemmeside eller i det mindste sprede dem lidt ud.Jeg kom op med dette koncept af “anmodning slots”, jeg setup en x antal slots, hævder en, når jeg gør en anmodning og derefter give det acooldown før jeg kan bruge det igen. på den måde kan jeg styre oversvømmelsen en smule bedre, fra den tekniske side er dette gjort ved hjælp af Redis sorterede sæt.

Baggrundskøer

Alt crawling arbejde udføres i baggrundsprocessen/daemoner og det tunge arbejde udføres med et par køer, køerne processalso håndterer de tidligere nævnte anmodningsslots.Dette gøres også ved hjælp af Redis sorterede sæt.

Config / Env

Tænk på et navn, der repræsenterer din maskine / evn, fx ruben-vm1 eller gw2spidy-prod-vps2.
Kopier config/cnf/example-custom-cnf.json til config/cnf/<your-chosen-name>.json og rediger den for at indstille værdierne forauth_email og auth_password.

Kopier config/cnf/example-env til config/cnf/env og rediger den, den indeholder en linje for hver konfigurationsfil den skal indlæse fraconfig/cnf/<name>.json
Udskift den første linje (ruben-vm1) med det navn du tidligere havde valgt, lad dev og default stå, det er andrekonfigurationsfiler den også skal indlæse (eller ændr dev til prod hvis du ikke ønsker debug mode.

De konfigurationsfiler du angiver config/cnf/env vil blive indlæst (i omvendt rækkefølge), og overskriver de foregående. til overbelastning af andre konfigurationsværdier (som database login osv.), skal du kontrollere config/cnf/default.json for alle indstillinger, som du også kan se i din brugerdefinerede konfigurationsfil.

Den config/cnf/env og alle config/cnf/*.json andre end default.json, dev.json og prod.json er på .gitignore, så de vil ikke blive versionskontrolleret

Databaseopsætning

I mappen config er der en config/schema.sql (genereret af propel baseret på config/schema.xml, så databaseændringer skal foretages i XML’en og derefter genereres SQL-filen!).
Du bør oprette en database kaldet ‘gw2spidy’ og indlæse config/schema.sql i den. Herefter importerconfig/itemTypesAndDisciplines.sql for at få visse stabile Disciplines og item typer.

RequestSlots Setup

Kør tools/setup-request-slots.php for at oprette de første request slots, du kan også køre dette under udvikling for at reinitiatethe slots, så du kan straks bruge dem igen, hvis de alle er på cooldown.

Opbygning af emiddeldatabasen

De scripts, der er beskrevet nedenfor, kaldes af scriptet bin/rebuild-items-recpipes.sh.

For at opbygge emiddeldatabasen skal du køre tools/update-items-from-api.php. Dette giver dig alle kendte genstande i spillet og opretter nye typer og undertyper i farten.

Derpå vil du måske køre scriptet hver nat for at holde dig opdateret med kendte genstande.

Hvis du vil have eller har brug for opskriftsdataene i databasen, skal du også kørephp tools/create-recipe-map /some/place/on/harddrive. Når dette er færdigt, skal du også importere kortet medphp tools/import-recipe-map /some/place/on/harddrive.

Oprettelse af webaktiver

gw2spidy serverer js og css-filer i en enkelt fil og (afhængigt af konfigurationen) minificeret. For at opbygge disse filer skal du blot køre grunt.

Crawling The Tradingpost

Selve ItemListingDB Worker er dette script: daemons/worker-queue-item-listing-db.php.
Det vil pop elementer fra listen kø og behandle dem, disse kø-elementer er automatisk requeue’d med deres prioritet, så du bør kun nødt til at køre daemons/fill-queue-item-listing-db.php en gang for at få den første batch i.
Som v2/commerce API’er er aktiveret, arbejderen bruger v2/commerce/listings endpoint til at behandle den konfigurerede ‘items-per-request’ mængde af elementer på 1 gang (max 250!).

Men hvis scriptet fejler, kan vi nogle gange miste et kø-emne eller nye emner kan blive tilføjet til databasen på et tidspunkt sothere’s et daemons/supervise-queue-item-listing-db.php script, der sørger for, at køen stadig er fyldt korrekt.

Der er et prioritetssystem på plads, så nogle genstande (som våben over en vis sjældenhed/niveau) behandles oftere end andre (som salvage kits, som ingen køber fra TP …).
Se afsnittet Prioritetssystem nedenfor for mere info om det!

Gem Worker

daemons/worker-gem.php scriptet laver 2 forespørgsler til gem-exchange GW2-API for at hente vekselkurserne og volumen og sover derefter i 180 sekunder (3 minutter).

Running The Workers

The workers laver alle 100 loops for at udføre deres specifikke opgave, eller hvis der ikke er nogen opgaver laver de korte sleeps og venter på en opgave.
De vil også sove, hvis der ikke er nogen slots til rådighed.

Tidligere plejede jeg at køre 4 arbejdere parallelt ved hjælp afwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Hvor jeg erstatter .1 med hvilket nummer af de 4 det er, så jeg fik 4 logs til hale.

Jeg har nu tilføjet nogle bash scripts i bin mappen til bin/start-workers.sh <num-listing-workers> <num-gem-workers>og bin/stop-workers.sh <now> for at styre dem.
Du bør tjekke bash scripts og forstå dem før du kører dem imo 😉 men du kan også stole på mine blå øjne og bare køre det xD

Prioritetssystem

Mængden af forespørgsler vi laver er begrænset af vores requestslot system, desværre er vi nu bundet af at lave 1 emne pr. forespørgsel(tidligere kunne vi kombinere op til 250).
Så jeg oprettede et prioriteringssystem for at behandle ‘vigtige’ emner oftere, i dette regneark beregnede jeg prioriteterne:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0

Dette er blevet ændret en smule, jeg skal opdatere regnearket og burde skrive nogle ting her snart

GW2 Sessions (forældet)

Når vi spiderede, plejede vi at få adgang til tradingpost ved hjælp af en session oprettet ved at logge ind på konti.guildwars2.com.
Når vi logger ind giver det os en session_key, som giver os adgang til tradingpost, dog begrænset til kun at kunne få listerne over items!

Når man åbner tradingpost inde fra spillet får man adgang til den ved hjælp af en session_key genereret fra spillets login, disse sessioner har adgang til flere funktioner i tradingpost!
Med denne session kan man også se listen over tilbud for de forskellige priser, i stedet for kun det laveste salg og højeste køb!
For gem-exchange giver ingame session_key dig mulighed for at beregne konverteringer, mens accounts.guildwars2.com sessionen kun giver dig et afrundet gennemsnit (hvilket er lidt ubrugeligt).

Som på det seneste har ArenaNet rodet med item-listerne (søgeresultater og lignende), så de er meget upræcise (på grund af caching), dette kan du også se ingame.
Jeg vil også gerne indsamle gem-exchange data …
Så jeg havde brug for en måde at kunne bruge en ingame session_key når jeg spider!

Du kan opsnappe session_key ved enten at bruge Fiddle2r til at opsnappe HTTPS-trafikken eller bruge nogle brugerdefinerede værktøjer til at hente URL’erne fra share memory …
Jeg har tilføjet en tabel til databasen ved navn gw2session og en formular på /admin/session for at indsætte ingame session_key, det kræver, at du også udfylder en ‘secret’, som er lig med hvad du konfigurerer i konfigurationen eller ikke kræves på dev envs

Jeg ved ikke præcis, hvad du kan gøre med en andens session_key, derfor stoler jeg på, at jeg ikke slapper af og opdaterer session_key regelmæssigt og vil ikke acceptere, at andre mennesker giver mig deres session_key!
Jeg ved med sikkerhed at kombineret med en charid kan du placere købsordrer og lignende fra udenfor spillet, så du skal være forsigtig med denne information 😉

Jeg har et lille værktøj (leveret af en anden), der hurtigt kan få fat i session_key (ved at søge efter den i shared memory) uden meget besvær, jeg vil ikke dele det offentligt, men du kunne overveje at deltage i IRC-kanalen og bede om det 😉

Copyright og licens

Copyright (c) 2012, Ruben de Vries
Alle rettigheder forbeholdes.

Distribution og brug i kildekode- og binær form, med eller uden ændringer, er tilladt, forudsat at følgende betingelser er opfyldt:

  1. Distribution af kildekode skal indeholde ovenstående ophavsretsmeddelelse, denne liste over betingelser og følgende ansvarsfraskrivelse.
  2. Distribution i binær form skal gengive ovenstående ophavsretsmeddelelse, denne liste over betingelser og følgende ansvarsfraskrivelse i dokumentationenog/eller andet materiale, der leveres sammen med distributionen.

DENNE SOFTWARE LEVERES AF INDEHAVERNE AF OPHAVSRETTEN OG BIDRAGYDERNE “SOM DEN ER”, OG ENHVER UDTRYKKELIG ELLER STILTIENDE GARANTI, HERUNDER, MEN IKKE BEGRÆNSET TIL, DE STILTIENDE GARANTIER FOR SALGBARHED OG EGNETHED TIL ET BESTEMT FORMÅL, FRASKRIVES. OPHAVSRETTIGHEDSHAVEREN ELLER BIDRAGYDERNE ER UNDER INGEN OMSTÆNDIGHEDER ANSVARLIGE FOR NOGEN DIREKTE, INDIREKTE, TILFÆLDIGE, SÆRLIGE, EKSEMPLARISKE ELLER FØLGESKADER (HERUNDER, MEN IKKE BEGRÆNSET TIL, ANSKAFFELSE AF ERSTATNINGSVARER ELLER -TJENESTER, TAB AF BRUG, DATA ELLER FORTJENESTE ELLER DRIFTSAFBRYDELSE) UANSET ÅRSAG OG UANSET ANSVARSTEORI, UANSET OM DER ER TALE OM KONTRAKT, OBJEKTIVT ANSVAR ELLER ERSTATNINGSANSVAR (HERUNDER UAGTSOMHED ELLER ANDET), DER PÅ NOGEN MÅDE OPSTÅR I FORBINDELSE MED BRUGEN AF DENNE SOFTWARE, SELV OM DE ER BLEVET UNDERRETTET OM MULIGHEDEN FOR SÅDANNE SKADER.

De synspunkter og konklusioner, der er indeholdt i softwaren og dokumentationen, er forfatternes egne og bør ikke fortolkes som værende officielle politikker, hverken udtrykkeligt eller stiltiende, for gw2spidy-projektet.

Leave a Reply