rubensayshi / gw2spidy
Dieses Projekt zielt darauf ab, euch Graphen der Verkaufs- und Kauflisten von Gegenständen auf dem Guild Wars 2 Trade Market zur Verfügung zu stellen.
Wie funktioniert es?
ArenaNet hat den Handelsmarkt so aufgebaut, dass er von einer Website in das Spiel geladen wird.
Ihr könnt auch mit einem Browser auf diese Website zugreifen und euren Spiel-Account benutzen, um euch einzuloggen und alle Gegenstände und Angebote anzusehen.
Nun habe ich einige Tools gebaut, die ständig laufen, um sich automatisch auf dieser Webseite einzuloggen und alle Daten aufzuzeichnen, die wir finden können, als Ergebnis kann ich die Verkaufslisten für alle Gegenstände etwa jede Stunde aufzeichnen und mit diesen Daten kann ich Graphen erstellen, in denen sich der Preis im Laufe der Zeit ändert!
Mitwirken
Jeder ist herzlich willkommen, etwas beizutragen, mit 99%iger Wahrscheinlichkeit lest ihr das hier auf github, also sollte es nicht zu schwer sein, zu forken und Pull Requests zu machen, richtig 🙂
Wenn ihr Hilfe bei der Einrichtung des Projekts oder bei der Verwendung von git(hub) braucht, dann kontaktiert mich einfach und ich helfe euch gerne!
Wenn ihr einen Dump der Datenbank haben wollt, da das viel einfacher zu bearbeiten ist, dann kontaktiert mich einfach 😉
Feedback / Hilfe
Wenn ihr Hilfe braucht oder ein Feedback habt, könnt ihr mich auf [email protected] kontaktieren oder mir auf irc beitreten.gamesurge.net #gw2spidy Drakie
Datums-/Zeitdaten
Wie üblich habe ich nicht wirklich über Zeitzonen nachgedacht, als ich dieses Projekt begonnen habe, aber jetzt, wo mehrere Leute das Projekt gegabelt haben und ich Daten an einige Leute exportiere, ist es plötzlich wichtig.Alle Daten werden in der Zeitzone des Servers gespeichert, aber ich habe dafür gesorgt, dass die Daten, die nach außen gehen (Diagramme und API), in UTC konvertiert werden (und Highcharts konvertiert sie in die Zeitzone des Browsers).
Mailing-Liste
Bitte treten Sie der Google Groups Mailing-Liste für gw2spidy bei, damit ich Sie über (größere) Änderungen / neue Versionen der Codebase auf dem Laufenden halten kann!
Einrichtung der Umgebung
Am einfachsten ist es, mit Vagrant zu beginnen. Diese Methode stellt Ihnen eine lokale virtuelle Maschine mit einer laufenden Instanz von gw2spidy mit einem einzigen Befehl zur Verfügung. Damit dies funktioniert, benötigen Sie drei Dinge: Virtualbox, Ruby und das Vagrant-Gem. Sobald Sie dies haben, gehen Sie einfach cd
in das gw2spidy-Verzeichnis und führen vagrant up
aus. Dadurch wird die virtuelle Basismaschine für die Entwicklung geholt (ein Ubuntu Precise 64bit-Server), alle erforderlichen Pakete werden installiert, mysql und nginx werden konfiguriert und der Port 80 der virtuellen Maschine wird an den Port 8080 Ihres Computers weitergeleitet. Wenn Sie fertig sind, besuchen Sie localhost:8080
in einem Browser und Sie können loslegen. Beachten Sie, dass damit nur ein Teil des Crawlings durchgeführt wird, das zum Auffüllen der Datenbank erforderlich ist. Um mit der Einrichtung fortzufahren, gehen Sie zu „Crawling the Tradingpost“.
Alternativ dazu können Sie die folgenden Schritte befolgen:
Ich werde Ihnen einige kurze Anweisungen zur Einrichtung geben, um Ihnen das Leben zu erleichtern, wenn Sie den Code für sich selbst ausführen oder etwas dazu beitragen möchten.Es gibt auch eine INSTALL-Datei, die einen Ausschnitt enthält, den ich kopiere, wenn ich meine VM einrichte, das sollte genügen 😉
Vieles hat sich geändert und wird wahrscheinlich noch eine Weile weitergehen
Tretet dem IRC-Kanal bei und wir können reden!
Mich (Drakie) und andere Leute, die schon eine Weile dabei sind, freuen sich, unser Wissen zu teilen und dir zu helfen, besonders, wenn du in Betracht ziehst, einen Beitrag zu leisten!
Linux
Ich betreibe das Projekt auf einem Linux-Server und viele der Anforderungen sind möglicherweise nicht auf Windows verfügbar und ich habe nur (ein kleines bisschen) (negative) Erfahrung mit Windows.
Wenn du das Projekt zu Entwicklungszwecken auf einem Windows-Rechner laufen lassen willst, dann empfehle ich dir dringend, eine virtuelle Maschine mit Linux laufen zu lassen (vmware player ist kostenlos und funktioniert ziemlich gut).
Wenn du dich in den IRC-Kanal begibst, habe ich ein VM-Image auf meinem Google Drive (erstellt von Marthisdil), in dem alles eingerichtet und einsatzbereit ist 😉
PHP 5.3
Du brauchst PHP5.3 oder höher für die Namespace-Unterstützung usw.
Die folgenden Erweiterungen müssen installiert sein:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
Ich denke, 4.x wird ausreichen, obwohl ich 5.x verwende.
Auf der PHP-Seite verwende ich PropelORM, dank dessen man wahrscheinlich leicht auf PostgreSQL oder MSSQL umsteigen kann, wenn man muss 😉
Apache / Nginx / CLI
Das Projekt funktioniert sowohl mit Apache als auch mit Nginx (ich verwende Apache auf meinem Entwicklungsrechner und Nginx in der Produktion), Sie können Beispielkonfigurationen im Ordner docs
dieses Projekts finden.
Wenn du den Code ausführen willst, der den Handelsmarkt durchspinnt, dann brauchst du Kommandozeilenzugriff, wenn du nur den Frontend-Code ausführen willst (und einen Datenbank-Dump von mir bekommen willst), dann kannst du auch ohne leben 😉
Bei einer sauberen Installation musst du vielleicht Apache Rewrite mit dem Befehl aktivieren: a2enmod rewrite
Memcache
Mit dem Memcache-Daemon und der PHP-Memcache-Lib lassen sich einige Dinge einfach im Speicher zwischenspeichern (Artikel- und Typdaten).
Allerdings funktioniert alles auch ohne Memcache, wenn du Memcache installiert hast, aber nicht willst, dass das Projekt es benutzt, dann definiere MEMCACHED_DISABLED in deiner config.inc.php und setze es auf true.
Du brauchst die php5-memcache Bibliothek, aber sie wird memcache nicht für irgendetwas benutzen 😉
Beachte, dass du php5-memcache
brauchst, nicht php5-memcached
Beachte, dass du die memcache Erweiterung haben musst, auch wenn du sie nicht benutzen willst!
Redis
Der Spidering-Code verwendet eine benutzerdefinierte Brau-Warteschlange und ein benutzerdefiniertes Brau-System, um sicherzustellen, dass wir nicht mehr als x Anfragen machen.
Sowohl die Warteschlange als auch die Slots werden mit Redis erstellt (die Predis-Bibliothek ist bereits im Ordner vendor
enthalten).
Vorher habe ich MySQL dafür benutzt, aber MySQL war viel belastender und mit Redis ist es auch etwas schneller!
Sie müssen redis-server installieren und es muss die Version 2.2 oder höher sein
Wenn du debian verwendest, musst du vom Quellcode bauen, ubuntu hat ein aktualisiertes Paket mit apt-get 😉
Silex / Twig / Predis
Ein paar PHP-Libs, die bereits im vendor
Ordner enthalten sind.
jQuery / Highcharts / Twitter Bootstrap
Nur einige HTML / JS / CSS Bibliotheken, bereits im Ordner webroot/assets/vendor
enthalten.
Sie benötigen die Birnenbibliothek Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js und grunt
Während Node.js und grunt nicht direkt für den Betrieb von gw2spidy benötigt werden, wird grunt benötigt, um die js und css Dateien zu erstellen, die mit den Webseiten geliefert werden. Das bedeutet, dass Sie Node nicht auf Ihrem Webserver benötigen, sondern die Grunt-Aufgaben auf jedem anderen Mac ausführen können, solange Sie die Dateien in webroot/assets/compiled
in das gleiche Verzeichnis auf dem Webserver kopieren.
Installieren Sie Node.js über den üblichen Installationsmechanismus für Ihr Betriebssystem. Führen Sie anschließend npm insall -g grunt
aus, um installgrunt global auf dem Rechner zu installieren.
Project Setup
ArenaNet ist damit einverstanden, dass ich das tue, aber trotzdem möchte ich die Anzahl der Anfragen, die ich auf ihre Website schieße, begrenzen oder sie zumindest ein wenig verteilen.Ich habe mir das Konzept der „Anfrage-Slots“ ausgedacht, ich richte eine x-fache Anzahl von Slots ein, beanspruche einen, wenn ich eine Anfrage stelle, und lasse ihn dann abkühlen, bevor ich ihn wieder benutzen kann. auf diese Weise kann ich die Flut etwas besser kontrollieren, von der technischen Seite aus gesehen wird dies mit sortierten Redis-Sets gemacht.
Hintergrund-Warteschlangen
Alle Crawling-Arbeiten werden in Hintergrundprozessen / Daemons erledigt und die schwere Arbeit wird mit ein paar Warteschlangen erledigt, der Warteschlangen-Prozess kümmert sich auch um die zuvor erwähnten Anfrage-Slots.Dies geschieht ebenfalls mit Redis sortierten Sets.
Config / Env
Denken Sie an einen Namen, der Ihre Maschine / evn repräsentiert, z.B. ruben-vm1 oder gw2spidy-prod-vps2.
Kopieren Sie die config/cnf/example-custom-cnf.json
nach config/cnf/<your-chosen-name>.json
und bearbeiten Sie sie, um die Werte fürauth_email und auth_password zu setzen.
Kopieren Sie config/cnf/example-env
nach config/cnf/env
und bearbeiten Sie es, es enthält eine Zeile für jede Konfigurationsdatei, aus der es geladen werden sollconfig/cnf/<name>.json
Ersetzen Sie die erste Zeile (ruben-vm1) mit dem Namen, den Sie zuvor gewählt haben, lassen Sie dev und default, das sind andere Konfigurationsdateien, die es auch laden soll (oder ändern Sie dev in prod, wenn Sie den Debug-Modus nicht wollen.
Die Konfigurationsdateien, die Sie angeben config/cnf/env
, werden geladen (in umgekehrter Reihenfolge) und überschreiben die vorherigen.), überprüfen Sie config/cnf/default.json
für alle Optionen, die Sie auch in Ihrer benutzerdefinierten Konfigurationsdatei setzen können.
Die config/cnf/env
und alle config/cnf/*.json
außer default.json
, dev.json
und prod.json
sind auf .gitignore, damit sie nicht versionskontrolliert werden
Datenbank-Setup
Im config
-Ordner befindet sich ein config/schema.sql
(generiert von propel auf der Basis von config/schema.xml
, daher sollten Datenbank-Änderungen am XML vorgenommen werden und dann die SQL-Datei generiert werden! Danach importiereconfig/itemTypesAndDisciplines.sql
, um bestimmte stabile Disziplinen und Gegenstandstypen zu erhalten.
RequestSlots Setup
Lasse tools/setup-request-slots.php
laufen, um die anfänglichen Request-Slots zu erstellen, du kannst dies auch während der Entwicklung laufen lassen, um die Slots neu zu initiieren, damit du sie sofort wieder benutzen kannst, wenn sie alle auf Abklingzeit sind.
Erstellen der Gegenstandsdatenbank
Die im Folgenden beschriebenen Skripte werden vom Skript bin/rebuild-items-recpipes.sh
aufgerufen.
Um die Gegenstandsdatenbank zu erstellen, musst du tools/update-items-from-api.php
ausführen. Dadurch erhältst du alle bekannten Gegenstände im Spiel und erstellst neue Typen und Untertypen im Handumdrehen.
Danach kannst du das Skript jede Nacht ausführen, um mit den bekannten Gegenständen auf dem Laufenden zu bleiben.
Wenn du die Rezeptdaten in der Datenbank haben willst oder brauchst, musst du auch php tools/create-recipe-map /some/place/on/harddrive
ausführen. Nachdem dies abgeschlossen ist, müssen Sie auch die Karte mitphp tools/import-recipe-map /some/place/on/harddrive
importieren.
Erstellen der Web-Assets
gw2spidy serviert js und css Dateien in einer einzigen Datei und (je nach Konfiguration) minified. Um diese Dateien zu erstellen, müssen Sie einfach grunt
.
Crawling The Tradingpost
Der ItemListingDB Worker selbst ist dieses Skript: daemons/worker-queue-item-listing-db.php
.
Es holt Artikel aus der Listing-Warteschlange und verarbeitet sie, diese Warteschlangen-Artikel werden automatisch mit ihrer Priorität angefordert, so dass Sie daemons/fill-queue-item-listing-db.php
nur einmal ausführen müssen, um den ersten Stapel zu erhalten.
Da die v2/Commerce-APIs aktiviert sind, verwendet der Worker den v2/Commerce/Listings-Endpunkt, um die konfigurierte „Artikel-pro-Anfrage“-Anzahl von Artikeln auf einmal zu verarbeiten (max. 250!
Wenn das Skript jedoch fehlschlägt, kann es vorkommen, dass ein Eintrag in der Warteschlange verloren geht oder neue Einträge in die Datenbank eingefügt werden, daher gibt es ein daemons/supervise-queue-item-listing-db.php
Skript, das sicherstellt, dass die Warteschlange weiterhin ordnungsgemäß gefüllt ist.
Es gibt ein Prioritätssystem, so dass einige Items (wie Waffen ab einer bestimmten Seltenheit / Stufe) häufiger bearbeitet werden als andere (wie Bergungskits, die niemand aus dem TP kauft …).
Siehe den Abschnitt Prioritätssystem weiter unten für weitere Informationen dazu!
Gem Worker
Das daemons/worker-gem.php
Skript führt 2 Anfragen an die GW2-API der Edelsteinbörse aus, um die Wechselkurse und das Volumen abzurufen, und schläft dann für 180 Sekunden (3 Minuten).
Die Worker laufen
Die Worker führen alle 100 Schleifen aus, um ihre spezifische Aufgabe zu erledigen, oder wenn sie keine Aufgabe haben, machen sie kurze Schläfchen und warten auf eine Aufgabe.
Sie schlafen auch, wenn keine Slots verfügbar sind.
Früher habe ich 4 Worker parallel laufen lassen, indem ichwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
die .1 durch die Nummer der 4 ersetzt habe, so dass ich 4 Logs am Ende habe.
Ich habe jetzt einige Bash-Skripte im Ordner bin
zu bin/start-workers.sh <num-listing-workers> <num-gem-workers>
und bin/stop-workers.sh <now>
hinzugefügt, um sie zu verwalten.
Du solltest dir die Bash-Skripte ansehen und sie verstehen, bevor du sie ausführst 😉 aber du könntest mir auch auf meine blauen Augen vertrauen und sie einfach ausführen xD
Prioritätssystem
Die Anzahl der Anfragen, die wir bearbeiten, ist durch unser Anfrageslot-System begrenzt, leider sind wir jetzt daran gebunden, 1 Artikel pro Anfrage zu bearbeiten (vorher konnten wir bis zu 250 kombinieren).
Also habe ich ein Prioritätssystem erstellt, um ‚wichtige‘ Items öfter zu bearbeiten, in dieser Tabelle habe ich die Prioritäten berechnet:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
Dies wurde leicht geändert, ich muss die Tabelle aktualisieren und sollte hier bald etwas schreiben
GW2 Sessions (veraltet)
Wenn wir Spidering betrieben haben, haben wir auf den Tradingpost mit einer Session zugegriffen, die durch das Einloggen in Accounts erstellt wurde.guildwars2.com.
Nach dem Einloggen erhalten wir einen session_key, der uns den Zugang zum Tradingpost ermöglicht, allerdings mit der Einschränkung, dass wir nur die Listen der Items bekommen können!
Wenn man den Handelsposten aus dem Spiel heraus öffnet, greift man mit einem session_key zu, der aus dem Spiellogin generiert wird, diese Sessions haben Zugang zu mehr Funktionen des Handelspostens!
Mit dieser Session kann man auch die Liste der Angebote für die verschiedenen Preise sehen, anstatt nur den niedrigsten Verkauf und den höchsten Kauf!
Für den Edelsteintausch kann man mit dem ingame session_key die Umrechnungen berechnen, während man mit der accounts.guildwars2.com-Sitzung nur einen gerundeten Durchschnittswert erhält (was ziemlich nutzlos ist).
In letzter Zeit hat ArenaNet die Item-Listen (Suchergebnisse und so) so durcheinander gebracht, dass sie sehr ungenau sind (aufgrund von Caching), das kann man auch ingame sehen.
Ich möchte auch Daten zum Edelsteintausch sammeln ….
So brauchte ich eine Möglichkeit, einen ingame session_key beim Spidern zu verwenden!
Man kann den session_key abfangen, indem man entweder Fiddle2r benutzt, um den HTTPS-Traffic abzufangen, oder indem man einige benutzerdefinierte Tools benutzt, um die URLs aus dem gemeinsamen Speicher zu holen …
Ich habe eine Tabelle mit dem Namen gw2session
in die Datenbank eingefügt und ein Formular auf /admin/session
, um den Session_key im Spiel einzugeben, es erfordert, dass man auch ein ’secret‘ ausfüllt, das dem entspricht, was man in der Config konfiguriert oder auf Dev Envs nicht benötigt wird
Ich weiß nicht genau, was man mit dem Session_key eines anderen machen kann, daher verlasse ich mich darauf, dass ich nicht nachlasse und den Session_key regelmäßig aktualisiere und werde nicht akzeptieren, dass andere Leute mir ihren Session_key geben!
Ich weiß mit Sicherheit, dass man in Verbindung mit einem Charid auch von außerhalb des Spiels Kaufaufträge und dergleichen erteilen kann, also sollte man mit diesen Informationen vorsichtig sein;)
Ich habe ein kleines Tool (von jemand anderem zur Verfügung gestellt), das den session_key schnell und ohne viel Aufwand auslesen kann (indem es im gemeinsamen Speicher gesucht wird), ich werde es nicht öffentlich teilen, aber du könntest in Erwägung ziehen, dem IRC-Kanal beizutreten und danach zu fragen 😉
Copyright und Lizenz
Copyright (c) 2012, Ruben de Vries
Alle Rechte vorbehalten.
Weitergabe und Verwendung in Quell- und Binärform, mit oder ohne Modifikation, sind erlaubt, vorausgesetzt, dass die folgenden Bedingungen erfüllt sind:
- Weitergaben von Quellcode müssen den obigen Copyright-Hinweis, diese Liste der Bedingungen und den folgenden Haftungsausschluss enthalten.
- Weitergaben in Binärform müssen den obigen Copyright-Hinweis, diese Liste der Bedingungen und den folgenden Haftungsausschluss in der Dokumentation und/oder anderen mit der Weitergabe bereitgestellten Materialien wiedergeben.
DIESE SOFTWARE WIRD VON DEN URHEBERRECHTSINHABERN UND MITWIRKENDEN „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT, UND ALLE AUSDRÜCKLICHEN ODER STILLSCHWEIGENDEN GARANTIEN, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE STILLSCHWEIGENDEN GARANTIEN DER MARKTGÄNGIGKEIT UND DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK, WERDEN ABGELEHNT. IN KEINEM FALL HAFTEN DER URHEBERRECHTSINHABER ODER DIE MITWIRKENDEN FÜR DIREKTE, INDIREKTE, ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE SCHÄDEN ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE BESCHAFFUNG VON ERSATZGÜTERN ODER -DIENSTLEISTUNGEN, NUTZUNGS-, DATEN- ODER GEWINNVERLUSTE ODER GESCHÄFTSUNTERBRECHUNGEN), UNABHÄNGIG DAVON, WIE DIESE VERURSACHT WURDEN, UND UNABHÄNGIG VON DER HAFTUNGSTHEORIE, OB ES SICH UM VERTRAGSHAFTUNG, VERSCHULDENSUNABHÄNGIGE HAFTUNG ODER UNERLAUBTE HANDLUNG (EINSCHLIESSLICH FAHRLÄSSIGKEIT ODER SONSTIGES) HANDELT, DIE SICH IN IRGENDEINER WEISE AUS DER NUTZUNG DIESER SOFTWARE ERGEBEN, AUCH WENN AUF DIE MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDE.
Die in der Software und der Dokumentation enthaltenen Ansichten und Schlussfolgerungen sind die der Autoren und sollten nicht als offizielle Politik des gw2spidy-Projekts interpretiert werden, weder ausdrücklich noch stillschweigend.
Leave a Reply