rubensayshi / gw2spidy
Ten projekt ma na celu dostarczenie wam wykresów sprzedaży i kupna przedmiotów na Guild Wars 2 Trade Market.
Jak to działa?
ArenaNet zbudował Trade Market tak, że jest on ładowany do gry ze strony internetowej.
Możesz również wejść na tę stronę za pomocą przeglądarki i użyć swojego konta w grze, aby się zalogować i zobaczyć wszystkie przedmioty i oferty.
Teraz zbudowałem kilka narzędzi, które będą działać ciągle, aby automatycznie logować się na tej stronie i zapisywać wszystkie dane, które możemy znaleźć, w rezultacie mogę zapisywać aukcje sprzedaży wszystkich przedmiotów co godzinę i z tych danych mogę tworzyć wykresy ze zmieniającą się ceną w czasie!
Współtworzenie
Każdy jest bardzo mile widziany, 99% szans, że czytasz to na githubie, więc nie powinno być zbyt trudno rozwidlić i zrobić pull requesty dobrze 🙂
Jeśli potrzebujesz pomocy z konfiguracją projektu lub używaniem git(hub) to po prostu skontaktuj się ze mną, a ja z chęcią Ci pomogę!
Jeśli chcesz zrzut bazy danych, ponieważ jest to o wiele łatwiejsze do pracy, to po prostu skontaktuj się ze mną 😉
Opinie / Pomoc
Jeśli potrzebujesz pomocy lub masz jakieś opinie, możesz skontaktować się ze mną na [email protected] lub dołączyć do mnie na irc.gamesurge.net #gw2spidy Drakie
Dane dotyczące daty/czasu
Jak zwykle nie myślałem o strefach czasowych, gdy zaczynałem ten projekt, ale teraz, gdy wiele osób rozwidliło projekt i gdy eksportuję dane do niektórych osób, nagle ma to znaczenie….Wszystkie dane są przechowywane w strefie czasowej serwera, jednak upewniłem się, że dane wychodzące (wykresy i API) są konwertowane na UTC (a Highcharts konwertuje je do strefy czasowej przeglądarki).
Lista mailingowa
Proszę dołączyć do listy mailingowej Google Groups dla gw2spidy, abym mógł informować Cię na bieżąco o wszelkich (większych) zmianach / nowych wersjach bazy kodowej!
Konfiguracja środowiska
Najprostszym sposobem na rozpoczęcie pracy jest użycie Vagranta. Ta metoda zapewni Ci lokalną maszynę wirtualną z działającą instancją gw2spidy za pomocą jednego polecenia. Aby to zadziałało będziesz potrzebował trzech rzeczy: Virtualbox, Ruby, oraz gem Vagrant. Kiedy już je masz, po prostu cd
do katalogu gw2spidy i uruchom vagrant up
. To pobierze podstawową maszynę wirtualną do rozwoju (serwer Ubuntu Precise 64bit), zainstaluje wszystkie wymagane pakiety, skonfiguruje mysql i nginx, a następnie przekieruje port 80 maszyny wirtualnej na port 8080 twojego komputera. Kiedy to się skończy, odwiedź localhost:8080
w przeglądarce i jesteś gotowy do pracy. Zauważ, że to wykonuje tylko część czynności wymaganych do wypełnienia bazy danych. Aby kontynuować konfigurację, przejdź do „Crawling the Tradingpost”.
Alternatywnie, wykonaj poniższe kroki:
Dostarczę ci kilka krótkich instrukcji konfiguracji, aby ułatwić ci życie, jeśli chcesz uruchomić kod dla siebie lub wnieść swój wkład.Jest tam również plik INSTALL, który zawiera fragment, który kopiuję i wklejam, gdy konfiguruję moją maszynę wirtualną, to powinno wystarczyć 😉
Wiele się zmieniło i najprawdopodobniej będzie się zmieniać jeszcze przez jakiś czas
Dołącz do kanału IRC i możemy porozmawiać!
Mnie (Drakie) i innych ludzi już zaangażowanych od jakiegoś czasu chętnie podzielimy się naszą wiedzą i pomożemy ci, szczególnie jeśli rozważasz wniesienie wkładu!
Linux
Prowadzę projekt na serwerze linuksowym i wiele z wymagań może nie być dostępnych na Windowsie, a ja mam tylko (malutkie) (negatywne) doświadczenie z Windowsem.
Jeśli chcesz uruchomić to na maszynie windowsowej, dla celów rozwojowych, to zdecydowanie sugeruję uruchomienie maszyny wirtualnej z linuxem (vmware player jest darmowy i działa całkiem nieźle).
Jeśli przejdziesz na kanał IRC, mam obraz maszyny wirtualnej na moim dysku google (zrobiony przez Marthisdil) ze wszystkim skonfigurowanym i gotowym do pracy 😉
PHP 5.3
Będziesz potrzebował PHP5.3 lub wyższego dla obsługi przestrzeni nazw itp.
Będziesz potrzebował zainstalowanych następujących rozszerzeń:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
Myślę, że 4.x wystarczy, choć ja używam 5.x.
Po stronie PHP używam PropelORM, dzięki temu prawdopodobnie mógłbyś łatwo przełączyć się na PostgreSQL lub MSSQL, gdybyś musiał 😉
Apache / Nginx / CLI
Projekt będzie działał dobrze zarówno z Apache jak i Nginx (w rzeczywistości używam apache na mojej maszynie dev i nginx w produkcji), możesz znaleźć przykładowe konfiguracje w folderze docs
tego projektu.
Jeśli chcesz uruchomić kod, który przeszukuje rynek handlowy, będziesz potrzebował dostępu z linii poleceń, jeśli chcesz tylko uruchomić kod frontendowy (i dostać ode mnie zrzut bazy danych), to możesz żyć bez 😉
Na czystej instalacji możesz potrzebować włączyć apache rewrite za pomocą polecenia: a2enmod rewrite
Memcache
Używając demona memcache i lib PHP Memcache łatwo buforować niektóre rzeczy w pamięci (dane o przedmiotach i typach).
Jednakże wszystko będzie działać dobrze bez memcache, jeśli masz zainstalowany memcache, ale nie chcesz aby projekt go używał to zdefiniuj MEMCACHED_DISABLED w swoim config.inc.php i ustaw go na true.
Potrzebujesz biblioteki php5-memcache, ale nie będzie ona używała memcache do niczego 😉
Uwaga, że potrzebujesz php5-memcache
nie php5-memcached
Uwaga, że musisz mieć rozszerzenie memcache, nawet jeśli nie chcesz go używać!
Redis
Kod spideringu używa niestandardowej kolejki brew i jakiegoś niestandardowego systemu brew, aby upewnić się, że nie robimy więcej niż x ilości żądań.
Zarówno kolejka jak i sloty są zbudowane przy użyciu Redis (biblioteka Predis jest już zawarta w folderze vendor
).
Poprzednio używałem do tego MySQL, ale używanie MySQL było o wiele cięższe przy obciążeniu, a używanie Redis jest również nieco szybsze!
Potrzebujesz zainstalować redis-server i musi to być wersja 2.2 lub wyższa
Jeśli używasz debiana, musisz budować ze źródła, ubuntu ma zaktualizowany pakiet z apt-get 😉
Silex / Twig / Predis
Tylko niektóre libs PHP, już zawarte w folderze vendor
.
jQuery / Highcharts / Twitter Bootstrap
Tylko niektóre biblioteki HTML / JS / CSS, już zawarte w folderze webroot/assets/vendor
.
Będziesz potrzebował biblioteki gruszki Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js i grunt
While Node.js i grunt nie są bezpośrednio potrzebne do uruchomienia gw2spidy, grunt jest potrzebny do budowania plików js i css, które są dostarczane ze stronami internetowymi. Oznacza to, że nie potrzebujesz node’a na swoim serwerze WWW, ale możesz wykonywać zadania grunt na każdym innym macu tak długo, jak długo kopiujesz pliki w webroot/assets/compiled
do tego samego katalogu na serwerze WWW.
Zainstaluj Node.js poprzez zwykły mechanizm instalacyjny dla twojego systemu operacyjnego. Następnie uruchom npm insall -g grunt
, aby globalnie zainstalowaćgrunt na maszynie.
Konfiguracja projektu
ArenaNet nie ma nic przeciwko temu, że to robię, ale mimo to chcę ograniczyć ilość żądań, które wystrzeliwuję na ich stronę lub przynajmniej trochę je rozłożyć.Wymyśliłem koncepcję 'slotów na żądania’, ustawiam x slotów, roszczę sobie prawo do jednego z nich kiedy robię żądanie, a następnie daję mu czas na ostygnięcie zanim będę mógł go użyć ponownie. W ten sposób mogę kontrolować powódź nieco lepiej, od strony technicznej odbywa się to przy użyciu posortowanych zestawów Redis.
Kolejki tła
Wszystkie prace związane z indeksowaniem są wykonywane w procesach / demonach tła, a ciężka praca jest wykonywana przez kilka kolejek, proces kolejek obsługuje również wcześniej wspomniane sloty na żądania.Odbywa się to również przy użyciu posortowanych zestawów Redis.
Config / Env
Pomyśl o nazwie, która reprezentuje twoją maszynę / evn, np. ruben-vm1 lub gw2spidy-prod-vps2.
Kopiuj config/cnf/example-custom-cnf.json
do config/cnf/<your-chosen-name>.json
i edytuj ją, aby ustawić wartości dlaauth_email i auth_password.
Kopiuje config/cnf/example-env
do config/cnf/env
i edytuje go, zawiera linię dla każdego pliku konfiguracyjnego, który powinien zostać załadowanyconfig/cnf/<name>.json
Zastąp pierwszą linię (ruben-vm1) nazwą, którą wcześniej wybrałeś, pozostaw dev i default, to są inne pliki konfiguracyjne, które również powinien załadować (lub zmień dev na prod, jeśli nie chcesz trybu debug.
Pliki konfiguracyjne, które określisz config/cnf/env
zostaną załadowane (w odwrotnej kolejności), nadpisując poprzednie.Dla przeładowania innych wartości konfiguracyjnych (jak login bazy danych itp.), sprawdź config/cnf/default.json
dla wszystkich opcji, które możeszalso se w swoim niestandardowym pliku konfiguracyjnym.
The config/cnf/env
and any config/cnf/*.json
other then default.json
, dev.json
and prod.json
are on .gitignore sothey won’t be versioned controlled
Database Setup
W folderze config
znajduje się config/schema.sql
(wygenerowany przez propel na podstawie config/schema.xml
, więc zmiany w bazie danych powinny być dokonane w XML, a następnie wygenerowane w pliku SQL!).
Powinieneś utworzyć bazę danych o nazwie 'gw2spidy’ i załadować do niej config/schema.sql
. Następnie zaimportujconfig/itemTypesAndDisciplines.sql
, aby uzyskać pewne stabilne Dyscypliny i typy przedmiotów.
RequestSlots Setup
Uruchom tools/setup-request-slots.php
, aby utworzyć początkowe sloty na żądania, możesz również uruchomić to podczas rozwoju, aby ponownie uruchomić sloty, tak abyś mógł natychmiast użyć ich ponownie, jeśli wszystkie są na cooldown.
Budowanie bazy danych przedmiotów
Skrypty opisane poniżej są wywoływane przez skrypt bin/rebuild-items-recpipes.sh
.
Aby zbudować bazę danych przedmiotów, chcesz uruchomić tools/update-items-from-api.php
. To daje ci wszystkie znane przedmioty w grze i tworzy nowe typy i podtypy w locie.
Potem możesz chcieć uruchamiać ten skrypt co noc, aby być na bieżąco ze znanymi przedmiotami.
Jeśli chcesz lub potrzebujesz danych o przepisach w bazie danych, musisz także uruchomićphp tools/create-recipe-map /some/place/on/harddrive
. Po zakończeniu tego, musisz również zaimportować mapę za pomocąphp tools/import-recipe-map /some/place/on/harddrive
.
Tworzenie aktywów internetowych
gw2spidy serwuje pliki js i css w pojedynczym pliku i (w zależności od konfiguracji) zminifikowane. Aby zbudować te pliki, musisz po prostu uruchomić grunt
.
Crawling The Tradingpost
Sam ItemListingDB Worker jest tym skryptem: daemons/worker-queue-item-listing-db.php
.
Wykopie on pozycje z kolejki listingów i przetworzy je, te pozycje z kolejki są automatycznie requeue’d z ich priorytetem, więc powinieneś mieć tylko jeden raz uruchomiony daemons/fill-queue-item-listing-db.php
, aby uzyskać początkową partię w.
Ponieważ API v2/commerce są włączone, robotnik używa punktu końcowego v2/commerce/listings, aby przetworzyć skonfigurowaną 'items-per-request’ ilość pozycji w jednym czasie (max 250!).
Jednakże jeśli skrypt zawiedzie, możemy czasami stracić element kolejki lub nowe elementy mogą zostać dodane do bazy danych w pewnym momencie sothere’s daemons/supervise-queue-item-listing-db.php
script which makes sure that the queue is still filled properly.
Istnieje system priorytetów, tak że niektóre przedmioty (jak broń powyżej pewnego poziomu / rzadkości) są przetwarzane częściej niż inne (jak zestawy ratunkowe, których nikt nie kupuje od TP …).
Zobacz sekcję System Priorytetów poniżej, aby uzyskać więcej informacji na ten temat!
Gem Worker
Skrypt daemons/worker-gem.php
wykonuje 2 żądania do gem-exchange GW2-API, aby pobrać kursy wymiany i ilość, a następnie śpi przez 180 sekund (3 minuty).
Uruchamianie robotników
Wszyscy robotnicy wykonują 100 pętli, aby wykonać swoje konkretne zadanie lub jeśli nie mają zadań, wykonują krótkie uśpienia w oczekiwaniu na zadanie.
Będą również spać, jeśli nie ma dostępnych slotów.
Poprzednio używałem 4 robotników równolegle używającwhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Gdzie zamieniałem .1 z którym numerem z 4 to jest, więc dostałem 4 logi do ogona.
Dodałem teraz kilka skryptów basha w folderze bin
do bin/start-workers.sh <num-listing-workers> <num-gem-workers>
i bin/stop-workers.sh <now>
aby nimi zarządzać.
Powinieneś sprawdzić skrypty bash i zrozumieć je zanim je uruchomisz imo 😉 ale możesz też zaufać mi na moje niebieskie oczy i po prostu je uruchomić xD
System priorytetów
Ilość próśb, które wykonujemy jest ograniczona przez nasz system requestslot, niestety teraz jesteśmy ograniczeni przez wykonywanie 1 przedmiotu na prośbę (poprzednio mogliśmy połączyć do 250).
Więc stworzyłem system priorytetów, aby przetwarzać 'ważne’ przedmioty częściej, w tym arkuszu kalkulacyjnym obliczyłem priorytety:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
To zostało nieco zmienione, muszę zaktualizować arkusz kalkulacyjny i powinienem napisać kilka rzeczy tutaj wkrótce
Sesje GW2 (przestarzałe)
Podczas spideringu używaliśmy dostępu do tradingpost używając sesji utworzonej przez zalogowanie się na konta.guildwars2.com.
Po zalogowaniu się daje nam session_key, który pozwala na dostęp do tradingpostu, jednak ograniczony tylko do możliwości uzyskania list przedmiotów!
Kiedy otwierasz tradingpost z poziomu gry, masz do niego dostęp używając session_key wygenerowanego z logowania do gry, te sesje mają dostęp do większej ilości funkcji tradingpostu!
Z tą sesją możesz również zobaczyć listę ofert dla różnych cen, zamiast tylko najniższej sprzedaży i najwyższej kupna!
Dla gem-exchange sesja ingame session_key pozwala ci obliczyć konwersje, podczas gdy sesja accounts.guildwars2.com daje ci tylko zaokrągloną średnią (która jest bezużyteczna).
Ostatnio ArenaNet zepsuła listy przedmiotów (wyniki wyszukiwania i takie tam), które są bardzo niedokładne (z powodu buforowania), możesz to również zobaczyć ingame.
Chcę również zebrać dane dotyczące gem-exchange…
Potrzebowałem więc sposobu, aby móc używać ingame session_key podczas spideringu!
Możesz przechwycić session_key używając Fiddle2r do przechwytywania HTTPS trafic lub używając niestandardowych narzędzi do przechwytywania adresów URL z pamięci współdzielonej …
Dodałem tabelę do bazy danych o nazwie gw2session
i formularz na /admin/session
aby wstawić ingame session_key, wymaga to również wypełnienia 'secret’ który jest równy temu co skonfigurujesz w configu lub nie jest wymagany na dev envs
Nie wiem dokładnie co możesz zrobić z czyimś session_key więc polegam na sobie nie obijając się i aktualizując session_key regularnie i nie zaakceptuje innych ludzi dających mi swój session_key!
Wiem na pewno, że w połączeniu z charidem możesz składać zlecenia kupna i takie tam spoza gry, więc powinieneś być ostrożny z tymi informacjami;)
Mam małe narzędzie (dostarczone przez kogoś innego), które szybko łapie session_key (poprzez szukanie go w pamięci współdzielonej) bez większego kłopotu, nie będę się nim dzielił publicznie, ale możesz rozważyć dołączenie do kanału IRC i poproszenie o nie 😉
Prawa autorskie i licencja
Copyright (c) 2012, Ruben de Vries
Wszystkie prawa zastrzeżone.
Redystrybucja i użycie w formie źródłowej i binarnej, z lub bez modyfikacji, są dozwolone pod warunkiem, że spełnione są następujące warunki:
- Redystrybucja kodu źródłowego musi zachować powyższą informację o prawach autorskich, tę listę warunków i następujące zrzeczenie się odpowiedzialności.
- Redystrybucja w formie binarnej musi odtworzyć powyższą informację o prawach autorskich, tę listę warunków i następujące zrzeczenie się odpowiedzialności w dokumentacji i/lub innych materiałach dostarczonych z dystrybucją.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS „AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ANDON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Poglądy i wnioski zawarte w oprogramowaniu i dokumentacji są poglądami autorów i nie powinny być interpretowane jako reprezentujące oficjalne polityki, wyrażone lub domniemane, projektu gw2spidy.
Leave a Reply