rubensayshi / gw2spidy

Tämän projektin tarkoituksena on tarjota sinulle grafiikoita Guild Wars 2:n kauppamarkkinoilla myytyjen ja ostettujen esineiden listauksista.

Miten se toimii?

ArenaNet on rakentanut Kauppatorin niin, että se ladataan peliin verkkosivulta.
Voit myös käyttää tätä verkkosivua selaimella ja käyttää pelitiliäsi kirjautuaksesi sisään ja katsellaksesi kaikkia esineitä ja listauksia.

Nyt olen rakentanut joitakin työkaluja, jotka toimivat jatkuvasti ja kirjautuvat automaattisesti tuolle sivustolle ja tallentavat kaiken löytämämme datan, jonka tuloksena voin tallentaa kaikkien esineiden myyntilistaukset noin tunnin välein ja tuon datan avulla voin luoda kaavioita, joissa hinta muuttuu ajan myötä!

Contributing

Kaikki ovat erittäin tervetulleita antamaan panoksensa, 99 %:n todennäköisyydellä luette tätä githubissa, joten ei pitäisi olla liian vaikeaa haarukoida ja tehdä pull requestit oikein 🙂 ?

Jos tarvitset apua projektin asentamisessa tai git(hubin) käyttämisessä, niin ota vain yhteyttä ja autan sinua mielelläni!
Jos haluat dumpin tietokannasta, koska sen kanssa on paljon helpompi työskennellä, niin ota vain yhteyttä 😉

Palaute / Apu

Jos tarvitset apua tai sinulla on palautetta, voit ottaa yhteyttä minuun osoitteessa [email protected] tai liittyä minuun ircissä.gamesurge.net #gw2spidy Drakie

Date/time data

Tavanomaiseen tapaan en oikeastaan ajatellut aikavyöhykkeitä aloittaessani tätä projektia, mutta nyt kun useat ihmiset haarautuvat projektista ja vien dataa joillekin ihmisille, sillä on yhtäkkiä väliä ….Kaikki tiedot tallennetaan palvelimen aikavyöhykkeessä, mutta olen kuitenkin varmistanut, että lähtevät tiedot (kaaviot ja API) muunnetaan UTC:ksi (ja Highcharts muuntaa ne selaimen aikavyöhykkeeseen).

Sähköpostilista

Liitythän gw2spidyn Google Groups -sähköpostilistalle, jotta voin pitää sinut ajan tasalla kaikista (suurista) muutoksista / uusista versioista koodipohjaan!

Ympäristön asetukset

Helppoimmin pääset alkuun käyttämällä Vagrantia. Tällä menetelmällä saat yhdellä komennolla paikallisen virtuaalikoneen, jossa on käynnissä oleva gw2spidy-instanssi. Jotta tämä toimisi, tarvitset kolme asiaa: Virtualbox, Ruby ja Vagrant-helmi. Kun sinulla on nämä, yksinkertaisesti cd gw2spidy-hakemistoon ja suorita vagrant up. Tämä hakee perusvirtuaalikoneen kehittämistä varten (Ubuntu Precise 64bit -palvelin), asentaa kaikki tarvittavat paketit, konfiguroi mysql:n ja nginx:n ja ohjaa sitten virtuaalikoneen portin 80 koneesi porttiin 8080. Kun se on valmis, käy localhost:8080 selaimessa ja olet valmis aloittamaan. Huomaa, että tämä tekee vain osan tietokannan täyttämiseen tarvittavasta indeksoinnista. Jos haluat jatkaa asennusta, siirry kohtaan ”Crawling the Tradingpost”.

Vaihtoehtoisesti voit seurata alla olevia vaiheita:

Seuraan lyhyitä asennusohjeita helpottaaksesi elämääsi, jos haluat käyttää koodia itsellesi tai osallistua.Siellä on myös INSTALL-tiedosto, joka sisältää pätkän, jonka kopioin liittää, kun asetan VM:n, sen pitäisi riittää 😉

PALJON on muuttunut ja todennäköisesti jatkuu vielä jonkin aikaa

Liity IRC-kanavalle ja voimme puhua!
Minä (Drakie) ja muut jo jonkin aikaa mukana olleet ihmiset jaamme mielellämme tietämystämme ja autamme sinua, varsinkin jos harkitset osallistumista!

Linux

Käynnistän projektia linux-palvelimella ja monet vaatimukset eivät välttämättä ole saatavilla windowsissa ja minulla on vain (vähän) (negatiivista) kokemusta windowsista.
Jos haluat ajaa tätä windows-koneella kehitystarkoituksessa, niin suosittelen vahvasti, että käytät vain virtuaalikonetta linuxilla (vmware player on ilmainen ja toimii aika hyvin).
Jos pääset IRC-kanavalle, minulla on Google Drive -asemallani VM-kuva (Marthisdilin tekemä), jossa on kaikki valmiina 😉

PHP 5.3

Tarvitset PHP5.3:n tai uudemman nimiavaruustuen jne. takia.
Tarvitset seuraavat laajennukset asennettuna:

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

MySQL / Propel

Luulempa että 4.x riittää, tosin käytän 5.x.
PHP-puolella käytän PropelORMia, sen ansiosta voisit varmaan vaihtaa PostgreSQL:ään tai MSSQL:ään helposti, jos on pakko 😉

Apache / Nginx / CLI

Projekti toimii hienosti sekä Apachen että Nginxin kanssa (itse käytän apachea dev-koneellani ja nginxiä tuotannossa), esimerkkikonfiguraatioita löydät tämän projektin docs-kansiosta.
Jos haluat ajaa koodia, joka hämähäkkeilee kauppamarkkinoiden läpi, niin tarvitset komentorivin käyttöoikeuden, jos haluat vain ajaa frontend-koodia (ja saada minulta tietokantadumppia), niin voit elää ilman 😉

Puhtaassa asennuksessa saatat joutua ottamaan käyttöön apache rewriten komennolla: a2enmod rewrite

Memcache

Käyttämällä memcache daemonia ja PHP Memcache lib:iä voit helposti välimuistiin kätkeä joitain juttuja muistiin (kohde- ja tyyppitiedot).
Mutta kaikki toimii hienosti ilman memcachea, jos sinulla on memcache asennettuna, mutta et halua projektin käyttävän sitä, määrittele MEMCACHED_DISABLED config.inc.php:ssäsi ja aseta se arvoon true.
Tarvitset kyllä php5-memcache-kirjastoa, mutta se ei käytä memcachea mihinkään 😉

Huomaa, että tarvitset php5-memcache et php5-memcached
Huomaa, että tarvitset memcache-laajennuksen, vaikka et haluaisi käyttää sitä!

Redis

Hämähäkkikoodi käyttää mukautettua brew-jonoa ja jotain mukautettua brew-systeemiä varmistaaksemme, ettemme tee enempää kuin x määrä pyyntöjä.
Kaikki jono ja slotit rakennetaan käyttäen Redisiä (Predis-kirjasto on jo mukana vendor-kansiossa).
Aiemmin käytin tähän MySQL:ää, mutta MySQL:n käyttäminen oli paljon kuormittavampaa ja Redisin käyttäminen on myös hieman nopeampaa!

Tarvitaan redis-palvelimen asennus ja sen pitää olla versio 2.2 tai uudempi
Jos käytät debiania sinun täytyy rakentaa lähdekoodista, ubuntussa on päivitetty paketti apt-get:llä 😉

Silex / Twig / Predis

Vain joitain PHP-libsejä, jotka ovat jo mukana vendor-kansiossa.

jQuery / Highcharts / Twitter Bootstrap

Vain joitain HTML / JS / CSS libs, jo mukana webroot/assets/vendor kansiossa.

Tarvitset päärynä kirjaston Log

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

Node.js ja grunt

Vaikka Node.js:ää ja gruntia ei suoraan tarvita gw2spidyn pyörittämiseen, gruntia tarvitaan rakentamaan js- ja css-tiedostoja, jotka areservoidaan verkkosivujen kanssa. Tämä tarkoittaa, että et tarvitse nodea web-palvelimellasi, mutta voit tehdä grunt-tehtävät millä tahansa muulla koneella, kunhan kopioit kohdassa webroot/assets/compiled olevat tiedostot samaan hakemistoon web-palvelimella.

Asenna Node.js käyttöjärjestelmäsi tavanomaisen asennusmekanismin kautta. Sen jälkeen suorita npm insall -g grunt asentaaksesi globaalisti installgruntin koneelle.

Project Setup

ArenaNetille sopii, että teen näin, mutta siitä huolimatta haluan rajoittaa pyyntöjen määrää, joita ammennan heidän sivustolleen tai ainakin hajauttaa niitä hieman.Keksin tämän konseptin ”pyyntöpaikkoja”, asetan x määrä paikkoja, lunastan yhden, kun teen pyynnön ja sitten antaa sen acooldown ennen kuin voin käyttää sitä uudelleen. näin voin hallita tulvaa hieman paremmin, tekniseltä puolelta tämä tehdään käyttämällä Redis lajiteltuja sarjoja.

Taustalla olevat jonot

Kaikki ryömintätyö tehdään taustaprosessissa / daemoneissa ja raskas työ tehdään muutamalla jonolla, jonoprosessi käsittelee myös aiemmin mainitut pyyntöpaikat.Tämäkin tapahtuu Redisin lajiteltujen joukkojen avulla.

Config / Env

Keksi nimi, joka edustaa konettasi / evn:tä, esim. ruben-vm1 tai gw2spidy-prod-vps2.
Kopioi config/cnf/example-custom-cnf.json kohtaan config/cnf/<your-chosen-name>.json ja muokkaa sitä asettaaksesi arvotauth_emailille ja auth_passwordille.

Kopioi config/cnf/example-env osoitteeseen config/cnf/env ja muokkaa sitä, se sisältää rivin jokaiselle konfigurointitiedostolle, josta sen pitäisi ladataconfig/cnf/<name>.json
Korvaa ensimmäinen rivi (ruben-vm1) aiemmin valitsemallasi nimellä, jätä dev- ja default-merkinnät jäljelle, ne ovat muitakin konfigurointitiedostoja, jotka sen pitäisi ladata (tai vaihda dev:stä prod:ksi, jos et halua debug-tilaa.

Määrittämäsi config-tiedostot config/cnf/env ladataan (käänteisessä järjestyksessä), korvaten edelliset.Muiden config-arvojen ylikuormitusta varten (kuten tietokannan kirjautuminen yms.), tarkista config/cnf/default.json kaikki vaihtoehdot, jotka voisit myös tiivistää omaan konfig-tiedostoosi.

config/cnf/env ja kaikki muut config/cnf/*.json kuin default.json, dev.json ja prod.json ovat päällä .gitignore, joten ne eivät ole versiohallittuja

Tietokanta-asetukset

Kansiossa config on config/schema.sql (propelin tuottama config/schema.xml:n perusteella, joten tietokantamuutokset tulisi tehdä XML:ään ja sen jälkeen luoda SQL-tiedosto!).
Tulee luoda tietokanta nimeltä ’gw2spidy’ ja ladata config/schema.sql sisään. Sen jälkeen importconfig/itemTypesAndDisciplines.sql saadaksesi tietyt vakaat Disciplines- ja item-tyypit.

RequestSlots Setup

Ajoita tools/setup-request-slots.php luodaksesi alkuperäiset request slotit, voit ajaa tämän myös kehityksen aikana käynnistääksesi slotit uudelleen, jotta voit käyttää niitä heti uudelleen, jos ne ovat kaikki cooldownissa.

Esinetietokannan rakentaminen

Alhaalla kuvattuja skriptejä kutsuu skripti bin/rebuild-items-recpipes.sh.

Esimerkkitietokannan rakentamiseksi haluat ajaa tools/update-items-from-api.php. Tämä antaa sinulle kaikki tunnetut esineet pelissä jaluo uusia tyyppejä ja alatyyppejä lennossa.

Sen jälkeen saatat haluta ajaa skriptin joka ilta, jotta pysyt ajan tasalla tunnettujen esineiden kanssa.

Jos haluat tai tarvitset reseptitietoja tietokannassa, sinun täytyy myös ajaaphp tools/create-recipe-map /some/place/on/harddrive. Kun tämä on valmis, sinun on myös tuotava karttaphp tools/import-recipe-map /some/place/on/harddrive:lla.

Verkkovarantojen luominen

gw2spidy tarjoilee js- ja css-tiedostot yhdessä tiedostossa ja (konfiguraatiosta riippuen) minified. Näiden tiedostojen rakentamiseksi sinun tarvitsee vain ajaa grunt.

Crawling The Tradingpost

The ItemListingDB Worker itsessään on tämä skripti: daemons/worker-queue-item-listing-db.php.
Se nostaa kohteita listausjonosta ja käsittelee ne, nämä jono-kohteet ovat automaattisesti requeue’d niiden prioriteetti joten sinun pitäisi vain ajaa daemons/fill-queue-item-listing-db.php kerran saadaksesi alkuperäisen erän sisään.
Koska v2/commerce API:t ovat käytössä, työläinen käyttää v2/commerce/listings päätepistettä käsitelläkseen konfiguroitua’item-per-request’ määrää kohteita kerralla (max 250!).).

Mutta jos skripti epäonnistuu, saatamme joskus menettää jono-kohteen tai uusia kohteita saatetaan lisätä tietokantaan jossain vaiheessa sothere’s daemons/supervise-queue-item-listing-db.php skripti, joka varmistaa, että jono on edelleen kunnolla täynnä.

Tässä on käytössä prioriteettijärjestelmä, jotta jotkin esineet (kuten tietyn harvinaisuuden / tason ylittävät aseet) käsitellään useammin kuin toiset (kuten pelastuspaketit, joita kukaan ei osta TP:stä …).
Katso Prioriteettijärjestelmä-osiosta alla lisää tietoa tästä!

Gem Worker

Skripti daemons/worker-gem.php tekee 2 pyyntöä gem-exchange GW2-API:lle hakeakseen vaihtokurssit ja volyymin ja sitten nukkuu 180 sekuntia (3 minuuttia).

Running The Workers

Työntekijät tekevät kaikki 100 silmukkaa tehdäkseen tietyn tehtävänsä, tai jos ei ole mitään tehtävää, he tekevät lyhyet lepotauot odottaakseen tehtävää.
Ne myös nukkuvat jos ei ole vapaita paikkoja.

Aiemmin käytin 4 työläistä rinnakkain käyttäenwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Jossa vaihdoin .1:n siihen mikä numero 4:stä se on joten sain 4 lokia hännille.

Lisäsin nyt joitain bash-skriptejä bin-kansioon bin/start-workers.sh <num-listing-workers> <num-gem-workers>ja bin/stop-workers.sh <now> hallitsemaan niitä.
Pitäisi tarkistaa bash-skriptit ja ymmärtää ne ennen niiden suorittamista imo 😉 mutta voit myös luottaa minuun sinisilmäisyyteeni ja vain suorittaa sen xD

Prioriteettijärjestelmä

Tekemiemme pyyntöjen määrää rajoittaa requestslot-järjestelmämme, valitettavasti olemme nyt sidottuja siihen, että voimme tehdä 1 kohteen pyyntöä kohden(aiemmin pystyimme yhdistelemään 250:een asti).
Loin siis prioriteettijärjestelmän käsitelläkseni ”tärkeitä” kohteita useammin, tässä laskentataulukossa laskin prioriteetit:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0

tämä on muuttunut hieman, minun täytyy päivittää laskentataulukko ja pitäisi kirjoittaa tänne pian jotain

GW2-istunnot (vanhentunut)

Kun hämähäkkeilimme pääsimme ennen tradingpostiin käyttäen istuntoa, joka luotiin kirjautumalla tileihin.guildwars2.com.
Sisäänkirjautumisen jälkeen se antaa meille session_key:n, joka mahdollistaa pääsyn tradingpostiin, kuitenkin rajoittuen vain siihen, että saamme vain esineiden listat!

Kun avaat kaupankäyntipostin pelin sisältä, pääset sinne sisäänkirjautumisen yhteydessä luodulla session_key:llä, näillä sessioilla pääsee käsiksi kaupankäyntipostin useampiin ominaisuuksiin!
Tällä sessiolla pääset näkemään myös tarjousluettelon eri hinnoilla, sen sijaan, että näkisit vain alhaisimman myynnin ja korkeimman oston!
Helmi-pörssin osalta ingame session_key:n avulla voit laskea konversiot, kun taas accounts.guildwars2.com-sessio antaa sinulle vain pyöristetyn keskiarvon (joka on tavallaan hyödytön).

Viime aikoina ArenaNet on sotkenut item-listat (hakutulokset yms.) hyvin epätarkoiksi (välimuistitallennuksen takia), näet tämän myös ingame:ssa.
Haluan myös kerätä gem-pörssin tiedot …
Tarvitsin siis keinon, jolla voin käyttää ingame session_keyta spideroinnissa!

Session_keyta voi siepata joko Fiddle2r:llä sieppaamalla HTTPS-liikennettä tai käyttämällä joitain omia työkaluja URL-osoitteiden nappaamiseen osakemuistista …
Olen lisännyt tietokantaan taulukon nimeltä gw2session ja lomakkeen /admin/session, johon voi lisätä ingame session_key:n, se vaatii sinua täyttämään myös ’salaisuuden’, joka on sama kuin mitä konfiguroit konfigissa tai jota ei tarvita dev envs:ssä

En tiedä tarkalleen mitä voit tehdä jonkun toisen session_key:llä, joten luotan siihen, että en itse laiskottele ja päivitän session_key:n säännöllisesti, enkä hyväksy sitä, että muut antavat minulle session_key:nsä!
Tiedän varmasti, että yhdistettynä charidiin voi tehdä ostotilauksia yms pelin ulkopuolelta, joten kannattaa olla varovainen näiden tietojen kanssa 😉

Minulla on pieni työkalu (jonkun muun toimittama), joka nappaa session_key:n nopeasti (etsimällä sen jaetusta muistista) ilman suurempaa vaivaa, en jaa sitä julkisesti, mutta voisit harkita IRC-kanavalle liittymistä ja sen pyytämistä 😉

Tekijänoikeudet ja lisenssi

Tekijänoikeudet (c) 2012, Ruben de Vries
Kaikki oikeudet pidätetään.

Jalostaminen ja käyttö lähde- ja binäärimuodossa, muokkauksin tai ilman, on sallittua edellyttäen, että seuraavat ehdot täyttyvät:

  1. Lähdekoodin jakelussa on säilytettävä ylläoleva tekijänoikeusilmoitus, tämä ehtoluettelo ja seuraava vastuuvapauslauseke.
  2. Binäärimuodossa tapahtuvassa levityksessä on toistettava ylläoleva tekijänoikeusilmoitus,tämä ehtoluettelo ja seuraava vastuuvapauslauseke dokumentaatiossa ja/tai muussa materiaalissa, joka toimitetaan levityksen mukana.

TEKIJÄNOIKEUKSIEN HALTIJAT JA TEKIJÄT TOIMITTAVAT TÄMÄN OHJELMISTON SELLAISENA KUIN SE ON, JA KAIKKI NIMENOMAISET TAI EPÄSUORAT TAKUUT, MUKAAN LUKIEN, MUTTA NIIHIN RAJOITTUMATTA, EPÄSUORAT TAKUUT MYYNTIKELPOISUUDESTA JA SOVELTUVUUDESTA TIETTYYN TARKOITUKSEEN, HYLÄTÄÄN. TEKIJÄNOIKEUKSIEN HALTIJAT TAI TEKIJÄT EIVÄT MISSÄÄN TAPAUKSESSA OLE VASTUUSSA MISTÄÄN SUORISTA, EPÄSUORISTA, SATUNNAISISTA, ERITYISISTÄ, ESIMERKILLISISTÄ TAI VÄLILLISISTÄ VAHINGOISTA (MUKAAN LUKIEN, MUTTA EI RAJOITTUEN, KORVAAVIEN TAVAROIDEN TAI PALVELUJEN HANKKIMINEN, KÄYTÖN, TIETOJEN TAI VOITTOJEN MENETYS TAI LIIKETOIMINNAN KESKEYTYMINEN) RIIPPUMATTA SIITÄ, MISTÄ NE JOHTUVAT JA MILLÄ TAHANSA VASTUUN TEORIALLA, OLIPA KYSE SITTEN SOPIMUKSESTA, ANKARASTA VASTUUSTA TAI VAHINGONKORVAUSVELVOLLISUUDESTA (MUKAAN LUKIEN HUOLIMATTOMUUS TAI MUU), JOTKA JOHTUVAT MILLÄÄN TAVALLA TÄMÄN OHJELMISTON KÄYTÖSTÄ, VAIKKA TÄLLAISTEN VAHINKOJEN MAHDOLLISUUS OLISI TIEDOSSA.

Ohjelmiston ja dokumentaation sisältämät näkemykset ja johtopäätökset ovat tekijöiden omia, eikä niiden tulisi tulkita edustavan gw2spidy-projektin virallista politiikkaa, ei nimenomaisesti eikä epäsuorasti ilmaistuna.

Leave a Reply