rubensayshi / gw2spidy
Questo progetto ha lo scopo di fornirti i grafici degli annunci di vendita e di acquisto degli oggetti sul Trade Market di Guild Wars 2.
Come funziona?
ArenaNet ha costruito il Trade Market in modo che sia caricato nel gioco da un sito web.
Puoi anche accedere a questo sito web con un browser e usare il tuo account di gioco per accedere e vedere tutti gli oggetti e le inserzioni.
Ora quello che ho costruito sono alcuni strumenti che funzioneranno costantemente per accedere automaticamente a quel sito web e registrare tutti i dati che possiamo trovare, come risultato posso registrare le inserzioni di vendita per tutti gli oggetti circa ogni ora e con quei dati posso creare grafici con il prezzo che cambia nel tempo!
Contribuire
Tutti sono molto benvenuti a contribuire, il 99% delle possibilità che stai leggendo questo su github quindi non dovrebbe essere troppo difficile fare fork e pull request giusto 🙂
Se avete bisogno di aiuto con la configurazione del progetto o con l’uso di git(hub) allora contattatemi e sarò felice di aiutarvi!
Se volete un dump del database, dato che è molto più facile lavorarci, allora contattatemi 😉
Feedback / Aiuto
Se avete bisogno di aiuto o avete qualche feedback, potete contattarmi su [email protected] o raggiungermi su irc.gamesurge.net #gw2spidy Drakie
Dati data/ora
Come al solito non ho pensato molto ai fusi orari quando ho iniziato questo progetto, ma ora che più persone hanno biforcato il progetto e che sto esportando i dati ad alcune persone improvvisamente importa.Tutti i dati sono memorizzati nel fuso orario del server, tuttavia ho fatto in modo che i dati in uscita (grafici e API) siano convertiti in UTC (e Highcharts li converte nel fuso orario del browser).
Mailing List
Per favore iscriviti alla Mailing List di Google Groups per gw2spidy in modo che io possa tenerti aggiornato su qualsiasi (importante) cambiamento / nuova versione del Codebase!
Configurazione dell’ambiente
Il modo più semplice per iniziare è usare Vagrant. Questo metodo ti fornirà una macchina virtuale locale con un’istanza di gw2spidy in esecuzione con un singolo comando. Affinché questo funzioni avrai bisogno di tre cose: Virtualbox, Ruby e la gemma Vagrant. Una volta che hai tutto questo, semplicemente cd
nella directory di gw2spidy ed esegui vagrant up
. Questo recupererà la macchina virtuale di base per lo sviluppo (un server Ubuntu Precise 64bit), installerà tutti i pacchetti richiesti, configurerà mysql e nginx, poi inoltrerà la porta 80 della macchina virtuale alla porta 8080 della vostra macchina. Quando ha finito, visitate localhost:8080
in un browser e siete pronti a partire. Nota che questo fa solo una parte del crawling necessario per popolare il database. Per continuare la configurazione, vai a “Crawling del Tradingpost”.
In alternativa, segui i passi seguenti:
Ti fornirò alcune brevi istruzioni di configurazione per renderti la vita più facile se vuoi eseguire il codice per te o contribuire.C’è anche un file INSTALL che contiene uno snippet che copio e incollo quando configuro la mia VM, dovrebbe bastare 😉
Molto è cambiato e molto probabilmente continuerà ancora per un po’
Entra nel canale IRC e possiamo parlare!
Io (Drakie) e altre persone già coinvolte da un po’ sono felici di condividere le nostre conoscenze e di aiutarti, specialmente se consideri di contribuire!
Linux
Io gestisco il progetto su un server linux e molti dei requisiti potrebbero non essere disponibili su windows e io ho solo (un po’) di esperienza (negativa) con windows.
Se vuoi eseguire questo su una macchina windows, per scopi di sviluppo, allora ti suggerisco fortemente di eseguire una macchina virtuale con linux (vmware player è gratuito e funziona abbastanza bene).
Se ti fai strada nel canale IRC ho un’immagine della VM sul mio google drive (fatta da Marthisdil) con tutto impostato e pronto a girare 😉
PHP 5.3
Avrai bisogno di PHP5.3 o superiore per il supporto dei namespace ecc.
Hai bisogno delle seguenti estensioni installate:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
Penso che la 4.x sia sufficiente, anche se io uso la 5.x.
Sul lato PHP delle cose sto usando PropelORM, grazie a questo potresti probabilmente passare a PostgreSQL o MSSQL facilmente se devi 😉
Apache / Nginx / CLI
Il progetto funzionerà bene sia con Apache che con Nginx (in realtà uso apache sulla mia macchina dev e nginx in produzione), puoi trovare configurazioni di esempio nella cartella docs
di questo progetto.
Se vuoi eseguire il codice che esegue lo spider attraverso il mercato commerciale allora avrai bisogno dell’accesso alla linea di comando, se vuoi solo eseguire il codice frontend (e ottenere un dump del database da me) allora puoi vivere senza 😉
In una installazione pulita potresti aver bisogno di abilitare apache rewrite con il comando: a2enmod rewrite
Memcache
Utilizzando il demone memcache e la lib PHP Memcache per mettere facilmente in cache alcune cose in memoria (dati degli elementi e dei tipi).
Tuttavia, tutto funzionerà bene senza memcache, se hai installato memcache ma non vuoi che il progetto lo usi allora definisci MEMCACHED_DISABLED nel tuo config.inc.php e impostalo a true.
Hai bisogno della libreria php5-memcache, ma non userà memcache per niente 😉
Nota che hai bisogno di php5-memcache
non php5-memcached
Nota che devi avere l’estensione memcache, anche se non la vuoi usare!
Redis
Il codice di spidering usa una coda di attesa personalizzata e un sistema di attesa personalizzato per assicurarsi di non fare più di una quantità x di richieste.
Sia la coda che gli slot sono costruiti usando Redis (la libreria Predis è già inclusa nella cartella vendor
).
Precedentemente stavo usando MySQL per questo, ma usando MySQL era molto più pesante nel carico e usando Redis è anche leggermente più veloce!2 o superiore
Se stai usando debian devi costruire dai sorgenti, ubuntu ha un pacchetto aggiornato con apt-get 😉
Silex / Twig / Predis
Solo alcune librerie PHP, già incluse nella cartella vendor
.
jQuery / Highcharts / Twitter Bootstrap
Solo alcune librerie HTML / JS / CSS, già incluse nella cartella webroot/assets/vendor
.
Avrai bisogno della libreria pear Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js e grunt
Mentre Node.js e grunt non sono direttamente necessari per eseguire gw2spidy, grunt è necessario per costruire i file js e css che vengono serviti con le pagine web. Questo significa che non hai bisogno di node sul tuo webserver, ma puoi fare i compiti di grunt su qualsiasi altro computer, purché tu copi i file in webroot/assets/compiled
nella stessa directory sul web server.
Installa Node.js attraverso il solito meccanismo di installazione del tuo sistema operativo. In seguito esegui npm insall -g grunt
per installare globalmente installgrunt sulla macchina.
Impostazione del progetto
ArenaNet è d’accordo che io faccia questo, ma comunque voglio limitare la quantità di richieste che sto sparando al loro sito web o almeno distribuirle un po’.Mi è venuto in mente questo concetto di ‘slot di richiesta’, ho impostato una quantità x di slot, ne rivendico uno quando faccio una richiesta e poi gli do un acooldown prima di poterlo usare di nuovo.in questo modo posso controllare il flusso un po’ meglio, dal lato tecnico questo è fatto usando Redis set ordinati.
Code in background
Tutto il lavoro di crawling è fatto in processi / demoni in background e il lavoro pesante è fatto con alcune code, il processo delle code gestisce anche gli slot di richiesta precedentemente menzionati.Anche questo viene fatto usando gli insiemi ordinati Redis.
Config / Env
Pensate a un nome che rappresenti la vostra macchina / evn, ad esempio ruben-vm1 o gw2spidy-prod-vps2.
Copiate il config/cnf/example-custom-cnf.json
in config/cnf/<your-chosen-name>.json
e modificatelo per impostare i valori perauth_email e auth_password.
Copia config/cnf/example-env
in config/cnf/env
e modificalo, contiene una linea per ogni file di configurazione che dovrebbe caricare daconfig/cnf/<name>.json
Sostituisci la prima linea (ruben-vm1) con il nome che avevi scelto in precedenza, lascia dev e default, quelli sono altri file di configurazione che dovrebbe caricare (o cambia dev in prod se non vuoi la modalità debug.
I file di configurazione che specifichi config/cnf/env
saranno caricati (in ordine inverso), sovrascrivendo i precedenti.Per sovraccaricare altri valori di configurazione (come il login al database ecc.), controlla config/cnf/default.json
per tutte le opzioni che potresti anche vedere nel tuo file di configurazione personalizzato.
Il config/cnf/env
e qualsiasi config/cnf/*.json
diverso da default.json
, dev.json
e prod.json
sono su .gitignore sotheothey won’t be versioned controlled
Database Setup
Nella cartella config
c’è un config/schema.sql
(generato da propel sulla base di config/schema.xml
, quindi le modifiche al database dovrebbero essere fatte all’XML e poi alla generazione del file SQL).
Si dovrebbe creare un database chiamato ‘gw2spidy’ e caricare il config/schema.sql
. Dopo importaconfig/itemTypesAndDisciplines.sql
per ottenere certe Discipline stabili e tipi di oggetti.
RequestSlots Setup
Esegui tools/setup-request-slots.php
per creare gli slot di richiesta iniziali, puoi anche eseguirlo durante lo sviluppo per reinizializzare gli slot in modo da poterli usare di nuovo istantaneamente se sono tutti in cooldown.
Costruire il database degli oggetti
Gli script descritti di seguito sono chiamati dallo script bin/rebuild-items-recpipes.sh
.
Per costruire il database degli oggetti, vuoi eseguire tools/update-items-from-api.php
. Questo ti dà tutti gli oggetti conosciuti nel gioco e crea nuovi tipi e sottotipi al volo.
In seguito potresti voler eseguire lo script ogni notte per tenerti aggiornato sugli oggetti conosciuti.
Se vuoi o hai bisogno dei dati delle ricette nel database, devi anche eseguirephp tools/create-recipe-map /some/place/on/harddrive
. Dopo che questo è stato completato, devi anche importare la mappa conphp tools/import-recipe-map /some/place/on/harddrive
.
Creare le risorse web
gw2spidy serve file js e css in un unico file e (a seconda della configurazione) minificati. Per costruire questi file, hai semplicemente bisogno di eseguire grunt
.
Crawling del Tradingpost
Lo stesso ItemListingDB Worker è questo script: daemons/worker-queue-item-listing-db.php
.
Eseguirà gli articoli dalla coda delle inserzioni e li processerà, questi articoli in coda sono automaticamente requeue’d con la loro priorità, quindi dovresti dover eseguire daemons/fill-queue-item-listing-db.php
solo una volta per ottenere il batch iniziale.
Da quando le API v2/commerce sono abilitate, il worker usa l’endpoint v2/commerce/listings per processare la quantità configurata di articoli per richiesta in 1 volta (max 250!).
Tuttavia se lo script fallisce potremmo a volte perdere un articolo della coda o nuovi articoli potrebbero essere aggiunti al database ad un certo punto, quindi c’è uno script daemons/supervise-queue-item-listing-db.php
che si assicura che la coda sia ancora riempita correttamente.
C’è un sistema di priorità in atto in modo che alcuni oggetti (come le armi sopra una certa rarità / livello) siano processati più spesso di altri (come i kit di recupero, che nessuno compra dal TP …).
Vedi la sezione Sistema di priorità qui sotto per maggiori informazioni su questo!
Gem Worker
Lo script daemons/worker-gem.php
fa 2 richieste alla GW2-API di scambio gemme per recuperare i tassi di cambio e il volume e poi dorme per 180 secondi (3 minuti).
Running The Workers
I workers fanno tutti 100 loop per fare il loro compito specifico o se nessun compito fa un breve sonno in attesa di un compito.
Si addormentano anche se non ci sono slot disponibili.
Precedentemente eseguivo 4 lavoratori in parallelo usandowhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
dove sostituisco il .1 con quale numero dei 4 è in modo da avere 4 log in coda.
Ora ho aggiunto alcuni script bash nella cartella bin
a bin/start-workers.sh <num-listing-workers> <num-gem-workers>
e bin/stop-workers.sh <now>
per gestirli.
Dovreste controllare gli script bash e capirli prima di eseguirli imo 😉 ma potreste anche fidarvi dei miei occhi blu ed eseguirli e basta xD
Sistema di priorità
La quantità di richieste che facciamo è limitata dal nostro sistema di requestslot, sfortunatamente ora siamo limitati a fare 1 elemento per richiesta (prima potevamo combinare fino a 250).
Così ho creato un sistema di priorità per processare più spesso gli item ‘importanti’, in questo foglio di calcolo ho calcolato le priorità:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
questo è stato leggermente cambiato, devo aggiornare il foglio di calcolo e dovrei scrivere qualcosa qui presto
Sessioni GW2 (obsolete)
Quando si faceva lo spidering si accedeva al tradingpost usando una sessione creata facendo il login negli account.guildwars2.com.
Dopo il login ci dà una session_key che ci permette l’accesso al tradingpost, limitato però al solo poter ottenere le liste degli oggetti!
Quando si apre il tradingpost dall’interno del gioco si accede utilizzando una session_key generata dal login del gioco, queste sessioni hanno accesso a più funzioni del tradingpost!
Con quella sessione si può anche vedere la lista delle offerte per i vari prezzi, invece che solo la vendita più bassa e l’acquisto più alto!
Per lo scambio di gemme la session_key ingame ti permette di calcolare le conversioni, mentre la sessione accounts.guildwars2.com ti dà solo una media arrotondata (che è un po’ inutile).
Negli ultimi tempi ArenaNet ha incasinato le liste degli oggetti (risultati di ricerca e simili) per essere molto imprecise (a causa del caching), puoi vedere anche questo ingame.
Voglio anche raccogliere dati sullo scambio di gemme…
Quindi avevo bisogno di un modo per poter usare una session_key ingame quando si fa lo spidering!
Puoi intercettare la session_key usando Fiddle2r per intercettare il traffico HTTPS o usando alcuni strumenti personalizzati per prendere gli URL dalla memoria condivisa…
Ho aggiunto una tabella al database chiamata gw2session
e un modulo su /admin/session
per inserire la session_key di gioco, ti richiede di riempire anche un ‘segreto’ che è uguale a quello che configuri nella configurazione o non richiesto su dev envs
Non so esattamente cosa puoi fare con la session_key di qualcun altro, quindi faccio affidamento su me stesso per non rallentare e aggiornare la session_key regolarmente e non accetto che altre persone mi diano la loro session_key!
So per certo che in combinazione con una charid puoi piazzare ordini di acquisto e simili da fuori dal gioco, quindi dovresti stare attento con queste informazioni;)
Ho un piccolo strumento (fornito da qualcun altro) che afferra rapidamente la session_key (cercandola nella memoria condivisa) senza troppi problemi, non lo condividerò pubblicamente ma potresti considerare di unirti al canale IRC e chiederlo 😉
Copyright e Licenza
Copyright (c) 2012, Ruben de Vries
Tutti i diritti riservati.
La redistribuzione e l’uso in forma sorgente e binaria, con o senza modifiche, sono permessi a condizione che siano soddisfatte le seguenti condizioni:
- La redistribuzione del codice sorgente deve mantenere la nota di copyright di cui sopra, la presente lista di condizioni e la seguente clausola di esclusione della responsabilità.
- La redistribuzione in forma binaria deve riprodurre la nota di copyright di cui sopra, questa lista di condizioni e la seguente clausola di esclusione della responsabilità nella documentazione e/o in altri materiali forniti con la distribuzione.
QUESTO SOFTWARE È FORNITO DAI DETENTORI DEL COPYRIGHT E DAI COLLABORATORI “COSÌ COM’È” E QUALSIASI GARANZIA ESPLICITA O IMPLICITA, INCLUSE, MA NON LIMITATAMENTE A, LE GARANZIE IMPLICITE DI COMMERCIABILITÀ E IDONEITÀ PER UNO SCOPO PARTICOLARE, SONO ESCLUSE. IN NESSUN CASO IL PROPRIETARIO DEL COPYRIGHT O I COLLABORATORI SARANNO RESPONSABILI PER QUALSIASI DANNO DIRETTO, INDIRETTO, INCIDENTALE, SPECIALE, ESEMPLARE O CONSEQUENZIALE (INCLUSO, MA NON LIMITATO A, APPROVVIGIONAMENTO DI BENI O SERVIZI SOSTITUTIVI; PERDITA DI USO, DATI O PROFITTI; O INTERRUZIONE DELL’ATTIVITÀ) COMUNQUE CAUSATO E SU QUALSIASI TEORIA DI RESPONSABILITÀ, SIA PER CONTRATTO, RESPONSABILITÀ OGGETTIVA O TORTO (INCLUSA LA NEGLIGENZA O ALTRO) DERIVANTE IN QUALSIASI MODO DALL’USO DI QUESTO SOFTWARE, ANCHE SE AVVISATI DELLA POSSIBILITÀ DI TALI DANNI.
Le opinioni e le conclusioni contenute nel software e nella documentazione sono quelle degli autori e non devono essere interpretate come rappresentanti le politiche ufficiali, espresse o implicite, del progetto gw2spidy.
Leave a Reply