rubensayshi / gw2spidy

Detta projekt syftar till att förse dig med grafer av försäljnings- och köplistor för föremål på Guild Wars 2 Trade Market.

Hur fungerar det?

ArenaNet har byggt Trade Market så att den laddas in i spelet från en webbplats.
Du kan också komma åt denna webbplats med en webbläsare och använda ditt spelkonto för att logga in och se alla föremål och listor.

Nu har jag byggt några verktyg som kommer att köras konstant för att automatiskt logga in på denna webbplats och registrera all data vi kan hitta, som ett resultat kan jag registrera försäljningslistorna för alla föremål ungefär varje timme och med den datan kan jag skapa grafer med priset som förändras över tiden!

Bidra till

Alla är varmt välkomna att bidra, 99% chans att du läser det här på github så det borde inte vara så svårt att gaffa och göra pull requests rätt 🙂 ?

Om du behöver hjälp med att sätta upp projektet eller använda git(hub) är det bara att kontakta mig så hjälper jag dig gärna!
Om du vill ha en dump av databasen, eftersom det är mycket lättare att jobba med, är det bara att kontakta mig 😉

Feedback / Hjälp

Om du behöver hjälp eller har feedback kan du kontakta mig på [email protected] eller ansluta dig till mig på irc.gamesurge.net #gw2spidy Drakie

Datum/tidsdata

Som vanligt tänkte jag inte riktigt på tidszoner när jag startade det här projektet, men nu när flera personer har forkat projektet och jag exporterar data till vissa personer spelar det plötsligt roll….Alla data lagras i serverns tidszon, men jag har sett till att data som skickas ut (diagram och API) konverteras till UTC (och Highcharts konverterar den till webbläsarens tidszon).

Mailing List

Genmäl dig till Google Groups Mailing List för gw2spidy så att jag kan hålla dig uppdaterad om eventuella (större) ändringar/nya versioner av kodbasen!

Miljöuppsättning

Det enklaste sättet att komma igång är att använda Vagrant. Denna metod ger dig en lokal virtuell maskin med en körd instans av gw2spidy med ett enda kommando. För att detta ska fungera behöver du tre saker: Virtualbox, Ruby och Vagrant-gemen. När du har detta, behöver du bara cd in i gw2spidy-katalogen och köra vagrant up. Detta kommer att hämta den virtuella basmaskinen för utveckling (en Ubuntu Precise 64bit-server), installera alla nödvändiga paket, konfigurera mysql och nginx och sedan vidarebefordra den virtuella maskinens port 80 till din maskins port 8080. När det är klart besöker du localhost:8080 i en webbläsare så är du redo att börja. Observera att detta bara gör en del av den crawling som krävs för att fylla databasen. För att fortsätta installationen går du till ”Crawling the Tradingpost”.

Alternativt kan du följa stegen nedan:

Jag kommer att ge dig några korta installationsinstruktioner för att göra ditt liv enklare om du vill köra koden för dig själv eller bidra.Det finns också en INSTALL-fil som innehåller ett stycke som jag kopierar och klistrar in när jag installerar min VM, det borde räcka 😉

MEDEL har förändrats och kommer troligen att fortsätta ett tag till

Gäng med i IRC-kanalen så kan vi prata!
Mig (Drakie) och andra personer som redan varit involverade ett tag delar gärna med oss av vår kunskap och hjälper dig, speciellt om du funderar på att bidra!

Linux

Jag driver projektet på en Linux-server och många av kraven kanske inte finns tillgängliga i Windows och jag har bara (en liten bit) av (negativ) erfarenhet av Windows.
Om du vill köra detta på en windows-maskin, i utvecklingssyfte, rekommenderar jag starkt att du bara kör en virtuell maskin med linux (vmware player är gratis och fungerar ganska bra).
Om du tar dig till IRC-kanalen har jag en VM-avbildning på min google drive (gjord av Marthisdil) med allting inställt och redo att rulla 😉

PHP 5.3

Du behöver PHP5.3 eller högre för stöd för namespace etc.
Du behöver följande tillägg installerade:

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

MySQL / Propel

Jag tror att 4.x räcker, även om jag kör 5.x.
På PHP-sidan använder jag PropelORM, tack vare det kan du förmodligen byta till PostgreSQL eller MSSQL enkelt om du måste 😉

Apache / Nginx / CLI

Projektet kommer att fungera bra med både Apache eller Nginx (jag kör faktiskt apache på min dev-maskin och Nginx i produktionen), du kan hitta exempelkonfigurationer i docs-mappen i detta projekt.
Om du vill köra koden som spindlar genom handelsmarknaden behöver du tillgång till kommandoraden, om du bara vill köra frontendkoden (och få en databasdump från mig) kan du leva utan 😉

På en ren installation kan du behöva aktivera apache rewrite med kommandot: a2enmod rewrite

Memcache

Användning av memcache daemon och PHP Memcache lib för att enkelt cachelagra vissa saker i minnet (artikel- och typdata).
Hursomhelst kommer allt att fungera bra utan memcache, om du har memcache installerat men inte vill att projektet ska använda det, definiera MEMCACHED_DISABLED i din config.inc.php och ställ in det på true.
Du behöver biblioteket php5-memcache, men det kommer inte att använda memcache för någonting 😉

Notera att du behöver php5-memcache inte php5-memcached
Notera att du måste ha tillägget memcache, även om du inte vill använda det!

Redis

Spideringskoden använder en anpassad bryggkö och något anpassat bryggsystem för att se till att vi inte gör mer än x antal förfrågningar.
Både kön och slots byggs med hjälp av Redis (Predis-biblioteket finns redan med i vendor-mappen).
Förut använde jag MySQL för detta, men MySQL var mycket tyngre på belastningen och med Redis är det också något snabbare!

Du måste installera redis-server och det måste vara version 2.2 eller högre
Om du använder debian måste du bygga från källan, ubuntu har ett uppdaterat paket med apt-get 😉

Silex / Twig / Predis

Just några PHP libs, redan inkluderade i mappen vendor.

jQuery / Highcharts / Twitter Bootstrap

Bara några HTML / JS / CSS libs, redan inkluderade i webroot/assets/vendor mappen.

Du behöver päronbiblioteket Log

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

Node.js och grunt

Och även om Node.js och grunt inte behövs direkt för att köra gw2spidy, behövs grunt för att bygga de js och css-filer som serveras med webbsidorna. Det betyder att du inte behöver Node på din webbserver, men att du kan utföra grunt-uppgifterna på vilken annan dator som helst så länge du kopierar filerna i webroot/assets/compiled till samma katalog på webbservern.

Installera Node.js via den vanliga installationsmekanismen för ditt operativsystem. Kör sedan npm insall -g grunt för att globalt installera grunt på maskinen.

Projektinställning

ArenaNet är okej med att jag gör detta, men jag vill ändå begränsa antalet förfrågningar som jag skickar till deras webbplats eller åtminstone sprida ut dem lite.Jag kom på det här konceptet med ”request slots”, jag ställer in ett x antal slots, gör anspråk på en när jag gör en förfrågan och ger den sedan en avkylning innan jag kan använda den igen.På så sätt kan jag kontrollera översvämningen lite bättre, från den tekniska sidan görs detta med hjälp av Redis sorterade uppsättningar.

Bakgrundsköer

Alt crawlingarbete sker i bakgrundsprocesser/demoner och det tunga arbetet görs med några köer, köprocessen hanterar också de tidigare nämnda förfrågningsutrymmena.Detta görs också med hjälp av Redis sorterade uppsättningar.

Config / Env

Tänk på ett namn som representerar din maskin / evn, t.ex. ruben-vm1 eller gw2spidy-prod-vps2.
Kopiera config/cnf/example-custom-cnf.json till config/cnf/<your-chosen-name>.json och redigera den för att ställa in värdena forauth_email och auth_password.

Kopiera config/cnf/example-env till config/cnf/env och redigera den, den innehåller en rad för varje konfigurationsfil som den ska ladda frånconfig/cnf/<name>.json
Ersätt den första raden (ruben-vm1) med det namn som du tidigare hade valt, lämna dev och default, det är andrakonfigurationsfiler som den ska ladda också (eller ändra dev till prod om du inte vill ha felsökningsläge.

De konfigurationsfiler du anger config/cnf/env kommer att laddas (i omvänd ordning) och skriva över de tidigare filerna.För överladdning av andra konfigurationsvärden (som databasinloggning osv.).), kontrollera config/cnf/default.json för alla alternativ som du också kan se i din egen konfigurationsfil.

Den config/cnf/env och alla config/cnf/*.json andra än default.json, dev.json och prod.json är på .gitignore så de kommer inte att versionskontrolleras

Databasinstallation

I mappen config finns en config/schema.sql (genererad av propel baserat på config/schema.xml, så databasändringar bör göras i XML-filen och sedan generera SQL-filen!).
Du bör skapa en databas som heter ”gw2spidy” och ladda in config/schema.sql. Därefter importeraconfig/itemTypesAndDisciplines.sql för att få vissa stabila Discipliner och föremålstyper.

RequestSlots Setup

Kör tools/setup-request-slots.php för att skapa de initiala request-slots, du kan också köra det här under utvecklingen för att återinitiera slotsen så att du omedelbart kan använda dem igen om de alla är på cooldown.

Bygga upp Item Database

De skript som beskrivs nedan anropas av skriptet bin/rebuild-items-recpipes.sh.

För att bygga upp Item Database vill du köra tools/update-items-from-api.php. Detta ger dig alla kända föremål i spelet och skapar nya typer och undertyper i farten.

Därefter kanske du vill köra skriptet varje natt för att hålla dig uppdaterad med kända föremål.

Om du vill ha eller behöver receptdata i databasen måste du också köraphp tools/create-recipe-map /some/place/on/harddrive. När detta är klart måste du också importera kartan medphp tools/import-recipe-map /some/place/on/harddrive.

Skapa webbtillgångar

gw2spidy serverar js och css-filer i en enda fil och (beroende på konfigurationen) minifierade. För att bygga dessa filer behöver du bara köra grunt.

Krypning av Tradingpost

Arboten ItemListingDB är det här skriptet: daemons/worker-queue-item-listing-db.php.
Det kommer att plocka upp objekt från listningskön och bearbeta dem, dessa kö-objekt är automatiskt requeue’d med sin prioritet så du bör bara behöva köra daemons/fill-queue-item-listing-db.php en gång för att få in den första batchen.
När v2/commerce API:erna är aktiverade, använder arbetaren v2/commerce/listings endpoint för att bearbeta det konfigurerade ”items-per-request” beloppet av objekt på en gång (max 250!).

Och om skriptet misslyckas kan vi ibland förlora ett köobjekt eller nya objekt kan läggas till i databasen vid någon tidpunkt, så det finns ett daemons/supervise-queue-item-listing-db.php skript som ser till att kön fortfarande fylls på rätt sätt.

Det finns ett prioriteringssystem så att vissa föremål (som vapen över en viss sällsynthet/nivå) behandlas oftare än andra (som bärgningssatser, som ingen köper från TP …).
Se avsnittet Prioritetssystem nedan för mer information om detta!

Gem Worker

Skriptet daemons/worker-gem.php gör två förfrågningar till gem-exchange GW2-API för att hämta växelkurser och volym och sover sedan i 180 sekunder (3 minuter).

Running The Workers

Arbetsgivarna gör alla 100 slingor för att göra sin specifika uppgift, eller om det inte finns några uppgifter så gör de en kort sömn och väntar på en uppgift.
De kommer också att sova om det inte finns några platser tillgängliga.

Förut brukade jag köra 4 arbetare parallellt med hjälp avwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Varvid jag ersätter .1 med vilket nummer av de 4 det är så att jag fick 4 loggar att svansa.

Jag har nu lagt till några bash-skript i mappen bin till bin/start-workers.sh <num-listing-workers> <num-gem-workers>och bin/stop-workers.sh <now> för att hantera dem.
Du bör kontrollera bash-skripten och förstå dem innan du kör dem imo 😉 men du kan också lita på mina blå ögon och bara köra det xD

Prioritetssystem

Mängden förfrågningar som vi gör begränsas av vårt system för förfrågningslots, tyvärr är vi nu bundna till att göra 1 objekt per förfrågan (tidigare kunde vi kombinera upp till 250).
Så jag skapade ett prioriteringssystem för att behandla ”viktiga” objekt oftare, i det här kalkylbladet beräknade jag prioriteringarna:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0

Detta har ändrats en aning, jag måste uppdatera kalkylbladet och borde skriva några saker här snart

GW2-sessioner (föråldrade)

När vi spidade brukade vi få tillgång till handelsposten med hjälp av en session skapad genom att logga in på konton.guildwars2.com.
När vi loggar in får vi en session_key som ger oss tillgång till tradingpost, dock begränsat till att bara kunna få listorna över föremål!

När du öppnar handelsposten inifrån spelet får du tillgång till den med hjälp av en session_key som genereras från spelinloggningen, dessa sessioner har tillgång till fler funktioner i handelsposten!
Med den sessionen kan du också se listan över erbjudanden för de olika priserna, istället för att bara se den lägsta försäljningen och högsta köpet!
För gem-exchange tillåter ingame session_key dig att beräkna konverteringar, medan accounts.guildwars2.com sessionen bara ger dig ett avrundat medelvärde (vilket är ganska värdelöst).

Som på senare tid har ArenaNet strulat till föremålslistorna (sökresultat och så vidare) så att de är mycket oprecisa (på grund av caching), du kan också se detta ingame.
Jag vill också samla in gem-exchange data …
Så jag behövde ett sätt att kunna använda en ingame session_key när jag spider!

Du kan avlyssna session_key genom att antingen använda Fiddle2r för att avlyssna HTTPS-trafiken eller genom att använda några anpassade verktyg för att hämta URL:erna från delat minne …
Jag har lagt till en tabell i databasen som heter gw2session och ett formulär på /admin/session för att lägga in sessionsnyckeln i spelet, det kräver att du också fyller i en ”hemlighet” som är lika med vad du konfigurerar i konfigurationen eller som inte krävs på dev envs

Jag vet inte exakt vad du kan göra med någons sessionsnyckel, därför förlitar jag mig på att jag själv inte slarvar och uppdaterar sessionsnyckeln regelbundet och jag kommer inte att acceptera att andra människor ger mig sin sessionsnyckel!
Jag vet med säkerhet att i kombination med en charid kan du lägga köporder och liknande utanför spelet, så du bör vara försiktig med denna information 😉

Jag har ett litet verktyg (tillhandahållet av någon annan) som snabbt tar session_key (genom att söka efter den i delat minne) utan större problem, jag kommer inte att dela med mig av det offentligt, men du kan överväga att gå med i IRC-kanalen och be om det 😉

Upphovsrätt och licens

Copyright (c) 2012, Ruben de Vries
Alla rättigheter förbehållna.

Distribution och användning i källkod och binär form, med eller utan ändringar, är tillåten under förutsättning att följande villkor är uppfyllda:

  1. Distribution av källkod måste behålla ovanstående upphovsrättsmeddelande, denna lista över villkor och följande ansvarsfriskrivning.
  2. Distribution i binär form måste återge ovanstående upphovsrättsmeddelande, denna lista över villkor och följande ansvarsfriskrivning i dokumentationen och/eller annat material som tillhandahålls med distributionen.

DENNA PROGRAMVARA TILLHANDAHÅLLS AV UPPHOVSRÄTTSINNEHAVARNA OCH BIDRAGSGIVARNA ”I BEFINTLIGT SKICK” OCH ALLA UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA GARANTIER, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, DE UNDERFÖRSTÅDDA GARANTIERNA OM SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL, AVVISAS. UNDER INGA OMSTÄNDIGHETER SKA UPPHOVSRÄTTSINNEHAVAREN ELLER BIDRAGSGIVARNA VARA ANSVARIGA FÖR DIREKTA, INDIREKTA, TILLFÄLLIGA, SÄRSKILDA, EXEMPLIFIERANDE ELLER FÖLJDSKADOR (INKLUSIVE, MEN INTE BEGRÄNSAT TILL, ANSKAFFNING AV ERSÄTTNINGSVAROR ELLER -TJÄNSTER, FÖRLUST AV ANVÄNDNING, DATA ELLER VINST, ELLER AVBROTT I VERKSAMHETEN), OAVSETT HUR DE ORSAKATS OCH ENLIGT NÅGON FORM AV ANSVARSTEORI, OAVSETT OM DET RÖR SIG OM AVTAL, STRIKT ANSVAR ELLER SKADESTÅNDSSKYLDIGHET (INKLUSIVE VÅRDSLÖSHET ELLER PÅ ANNAT SÄTT), SOM PÅ NÅGOT SÄTT UPPKOMMER I SAMBAND MED ANVÄNDNINGEN AV PROGRAMVARAN, ÄVEN OM DE HAR BLIVIT INFORMERADE OM MÖJLIGHETEN AV SÅDANA SKADOR.

Åsikterna och slutsatserna i programvaran och dokumentationen är författarnas och bör inte tolkas som att de representerar officiell politik, vare sig uttrycklig eller underförstådd, för gw2spidy-projektet.

Leave a Reply