rubensayshi / gw2spidy
Este proyecto pretende ofrecerte gráficos de los listados de venta y compra de artículos en el Mercado de Comercio de Guild Wars 2.
¿Cómo funciona?
ArenaNet ha construido el Mercado de Comercio para que se cargue en el juego desde un sitio web.
También puedes acceder a este sitio web con un navegador y utilizar tu cuenta del juego para iniciar sesión y ver todos los artículos y listados.
Ahora lo que he construido son algunas herramientas que se ejecutarán constantemente para iniciar sesión automáticamente en ese sitio web y registrar todos los datos que podemos encontrar, como resultado puedo registrar los listados de venta para todos los artículos alrededor de cada hora y con esos datos puedo crear gráficos con el precio que cambia con el tiempo!
Contribuir
Todo el mundo es muy bienvenido a contribuir, el 99% de probabilidad de que usted está leyendo esto en github por lo que no debería ser demasiado difícil de bifurcar y hacer solicitudes de extracción derecha 🙂
Si necesitas ayuda con la configuración del proyecto o con el uso de git(hub) entonces sólo ponte en contacto conmigo y estaré encantado de ayudarte!
Si quieres un volcado de la base de datos, ya que es mucho más fácil de trabajar, entonces sólo ponte en contacto conmigo 😉
Comentarios / Ayuda
Si necesitas ayuda o tienes algún comentario, puedes ponerte en contacto conmigo en [email protected] o unirte a mí en irc.gamesurge.net #gw2spidy Drakie
Datos de fecha/hora
Como siempre, no pensé realmente en las zonas horarias cuando empecé este proyecto, pero ahora que varias personas bifurcaron el proyecto y que estoy exportando datos a algunas personas de repente importa ….Todos los datos se almacenan en la zona horaria del servidor, sin embargo me he asegurado de que los datos que salen (gráficos y API) se convierten a UTC (y Highcharts los convierte a la zona horaria del navegador).
Lista de correo
Por favor, únete a la lista de correo de Google Groups para gw2spidy para que pueda mantenerte al día de cualquier cambio (importante) / nuevas versiones de la base de código!
Configuración del entorno
La forma más fácil de empezar es mediante el uso de Vagrant. Este método le proporcionará una máquina virtual local con una instancia de ejecución de gw2spidy en un solo comando. Para que esto funcione necesitarás tres cosas: Virtualbox, Ruby y la gema Vagrant. Una vez que usted tiene esto, simplemente cd
en el directorio gw2spidy y ejecutar vagrant up
. Esto obtendrá la máquina virtual base para el desarrollo (un servidor Ubuntu Precise 64bit), instalará todos los paquetes necesarios, configurará mysql y nginx, y luego reenviará el puerto 80 de la máquina virtual al puerto 8080 de tu máquina. Cuando haya terminado, visite localhost:8080
en un navegador y estará listo. Tenga en cuenta que esto sólo hace parte del rastreo necesario para poblar la base de datos. Para continuar con la configuración, vaya a «Crawling the Tradingpost».
Alternativamente, siga los pasos siguientes:
Le proporcionaré unas breves instrucciones de configuración para facilitarle la vida si quiere ejecutar el código por sí mismo o contribuir.También hay un archivo INSTALL que contiene un fragmento que copio y pego cuando configuro mi VM, debería ser suficiente 😉
Mucho ha cambiado y lo más probable es que continúe un tiempo más
¡Únete al canal de IRC y podemos hablar!
Yo (Drakie) y otras personas ya involucradas por un tiempo estamos felices de compartir nuestro conocimiento y ayudarte, especialmente si consideras contribuir!
Linux
Ejecuto el proyecto en un servidor linux y muchos de los requerimientos podrían no estar disponibles en windows y sólo tengo (un poco) de experiencia (negativa) con windows.
Si quieres ejecutar esto en una máquina con windows, para propósitos de desarrollo, entonces te sugiero encarecidamente que sólo ejecutes una máquina virtual con linux (vmware player es gratis y funciona bastante bien).
Si te diriges al canal de IRC tengo una imagen de VM en mi google drive (hecha por Marthisdil) con todo configurado y listo para rodar 😉
PHP 5.3
Necesitarás PHP5.3 o superior para el soporte de namespace etc.
Necesitarás las siguientes extensiones instaladas:
- php5-curl
- php5-mysql
- php5-memcache
MySQL / Propel
Creo que 4.x será suficiente, aunque yo corro 5.x.
En la parte de PHP estoy usando PropelORM, gracias a eso probablemente podrías cambiar a PostgreSQL o MSSQL fácilmente si tienes que hacerlo 😉
Apache / Nginx / CLI
El proyecto funcionará bien tanto con Apache como con Nginx (de hecho corro apache en mi máquina de desarrollo y nginx en producción), puedes encontrar configuraciones de ejemplo en la carpeta docs
de este proyecto.
Si quieres ejecutar el código que araña el mercado comercial entonces necesitarás acceso a la línea de comandos, si sólo quieres ejecutar el código del frontend (y obtener un volcado de la base de datos de mi parte) entonces puedes vivir sin 😉
En una instalación limpia podrías necesitar habilitar la reescritura de apache con el comando: a2enmod rewrite
Memcache
Usando el demonio memcache y la librería Memcache de PHP para almacenar fácilmente algunas cosas en memoria (datos de artículos y tipos).
Sin embargo, todo funcionará bien sin memcache, si tienes memcache instalado pero no quieres que el proyecto lo use entonces define MEMCACHED_DISABLED en tu config.inc.php y ponlo a true.
Necesitas la librería php5-memcache, pero no usará memcache para nada 😉
Nota que necesitas php5-memcache
no php5-memcached
¡Nota que necesitas tener la extensión memcache, incluso si no quieres usarla!
Redis
El código de spidering utiliza una cola de brew personalizada y algún sistema de brew personalizado para asegurarse de que no hacemos más de x cantidad de peticiones.
Tanto la cola como los slots se construyen utilizando Redis (la librería Predis ya está incluida en la carpeta vendor
).
Previamente estaba usando MySQL para esto, pero usar MySQL era mucho más pesado en la carga y usando Redis es también ligeramente más rápido!
Necesitas instalar redis-server y necesita ser la versión 2.2 o superior
Si estás usando debian necesitas construir desde la fuente, ubuntu tiene un paquete actualizado con apt-get 😉
Silex / Twig / Predis
Sólo algunas librerías de PHP, ya incluidas en la carpeta vendor
.
jQuery / Highcharts / Twitter Bootstrap
Sólo algunas librerías HTML / JS / CSS, ya incluidas en la carpeta webroot/assets/vendor
.
Necesitarás la librería pear Log
pear channel-discover pear.phing.infopear install phing/phingpear install Log
Node.js y grunt
Aunque Node.js y grunt no son directamente necesarios para ejecutar gw2spidy, grunt es necesario para construir los archivos js y css que se sirven con las páginas web. Esto significa que usted no necesita node en su servidor web, pero puede hacer las tareas de grunt en cualquier otro macine aslong como usted copia los archivos en webroot/assets/compiled
sobre el mismo directorio en el servidor web.
Instalar Node.js a través del mecanismo de instalación habitual para su sistema operativo. Después ejecuta npm insall -g grunt
para instalar globalmente installgrunt en la máquina.
Configuración del proyecto
ArenaNet está de acuerdo con que haga esto, pero sin embargo quiero limitar la cantidad de peticiones que estoy disparando en su sitio web o al menos repartirlas un poco.Se me ocurrió este concepto de ‘ranuras de solicitud’, configuro una cantidad x de ranuras, reclamo una cuando hago una solicitud y luego le doy acooldown antes de que pueda usarla de nuevo.De esta manera puedo controlar la inundación un poco mejor, desde el punto de vista técnico esto se hace utilizando conjuntos ordenados Redis.
Colas de fondo
Todo el trabajo de rastreo se hace en procesos de fondo / demonios y el trabajo pesado se hace con algunas colas, el proceso de colas también maneja las ranuras de solicitud antes mencionadas.Esto también se hace usando conjuntos ordenados de Redis.
Config / Env
Piense en un nombre que represente su máquina / evn, por ejemplo ruben-vm1 o gw2spidy-prod-vps2.
Copie el config/cnf/example-custom-cnf.json
a config/cnf/<your-chosen-name>.json
y edítelo para establecer los valores paraauth_email y auth_password.
Copia config/cnf/example-env
a config/cnf/env
y edítalo, contiene una línea para cada archivo de configuración que debe cargarconfig/cnf/<name>.json
Reemplaza la primera línea (ruben-vm1) con el nombre que habías elegido previamente, deja el dev y el default, esos son otros archivos de configuración que debe cargar también (o cambia dev a prod si no quieres el modo debug.
Los archivos de configuración que especifique config/cnf/env
se cargarán (en orden inverso), sobrescribiendo los anteriores.Para sobrecargar otros valores de configuración (como el login de la base de datos, etc.), compruebe config/cnf/default.json
para todas las opciones que podría ver en su archivo de configuración personalizado.
El config/cnf/env
y cualquier config/cnf/*.json
que no sea default.json
, dev.json
y prod.json
están en .gitignore por lo que no serán controlados por versiones.
Configuración de la base de datos
En la carpeta config
hay un config/schema.sql
(generado por propel basado en config/schema.xml
, por lo que los cambios en la base de datos deben hacerse en el XML y luego generar el archivo SQL).
Debe crear una base de datos llamada ‘gw2spidy’ y cargar el config/schema.sql
. Después importarconfig/itemTypesAndDisciplines.sql
para obtener ciertas Disciplinas estables y tipos de artículos.
RequestSlots Setup
Ejecutar tools/setup-request-slots.php
para crear las ranuras de solicitud inicial, también puede ejecutar esto durante el desarrollo para reiniciar las ranuras para que pueda utilizar al instante de nuevo si están todos en cooldown.
Construyendo la base de datos de ítems
Los scripts descritos a continuación son llamados por el script bin/rebuild-items-recpipes.sh
.
Para construir la base de datos de ítems, quieres ejecutar tools/update-items-from-api.php
. Esto te da todos los ítems conocidos en el juego y crea nuevos tipos y subtipos sobre la marcha.
Después puedes querer ejecutar el script cada noche para mantenerte al día con los ítems conocidos.
Si quieres o necesitas los datos de las recetas en la base de datos, también necesitas ejecutarphp tools/create-recipe-map /some/place/on/harddrive
. Una vez completado esto, también tienes que importar el mapa conphp tools/import-recipe-map /some/place/on/harddrive
.
Crear los activos web
gw2spidy sirve los archivos js y css en un único archivo y (dependiendo de la configuración) minificado. Para construir estos archivos, sólo tiene que ejecutar grunt
.
Crawling The Tradingpost
El propio ItemListingDB Worker es este script: daemons/worker-queue-item-listing-db.php
.
Sacará los artículos de la cola de listados y los procesará, estos artículos de la cola son automáticamente requeue’d con su prioridad soyou sólo debe tener que ejecutar daemons/fill-queue-item-listing-db.php
una vez para obtener el lote inicial in.
Dado que las APIs v2/commerce están habilitadas, el trabajador utiliza el v2/commerce/listings endpoint para procesar el configured’items-per-request’ cantidad de artículos en 1 tiempo (¡máximo 250!).
Sin embargo, si el script falla, a veces podemos perder un elemento de la cola o se pueden añadir nuevos elementos a la base de datos en algún momento, por lo que hay un script daemons/supervise-queue-item-listing-db.php
que se asegura de que la cola se siga llenando correctamente.
Hay un sistema de prioridad para que algunos artículos (como las armas por encima de cierta rareza / nivel) se procesen más a menudo que otros (como los kits de salvamento, que nadie compra en el TP …).
¡Vea la sección de Sistema de Prioridad más abajo para más información sobre eso!
Trabajador de Gemas
El script daemons/worker-gem.php
hace 2 peticiones a la GW2-API de intercambio de gemas para recuperar los tipos de cambio y el volumen y luego duerme durante 180 segundos (3 minutos).
Ejecutando los Trabajadores
Todos los trabajadores hacen 100 bucles para hacer su tarea específica o si no hay tareas hacen pequeñas duermevelas esperando una tarea.
También dormirán si no hay ranuras disponibles.
Antes solía ejecutar 4 trabajadores en paralelo usandowhile ; do php daemons/worker-queue-item-listing-db.php >> /var/log/gw2spidy/worker.1.log; echo "restart"; done;
Donde reemplazo el .1 con el número de los 4 que es para tener 4 registros a la cola.
Ahora agregué algunos scripts bash en la carpeta bin
a bin/start-workers.sh <num-listing-workers> <num-gem-workers>
y bin/stop-workers.sh <now>
para manejarlos.
Deberíais revisar los scripts bash y entenderlos antes de ejecutarlos imo 😉 pero también podríais confiar en mis ojos azules y simplemente ejecutarlos xD
Sistema de prioridades
La cantidad de peticiones que hacemos está limitada por nuestro sistema de requestslot, desafortunadamente ahora estamos limitados a hacer 1 ítem por petición(antes podíamos combinar hasta 250).
Así que creé un sistema de prioridades para procesar los ítems ‘importantes’ más a menudo, en esta hoja de cálculo calculé las prioridades:
https://docs.google.com/a/rubensayshi.com/spreadsheet/ccc?key=0Alq65aekWXJmdGotSmdBYXJPZ0NKbHBhdzVZMlh5Q1E#gid=0
Esto ha sido cambiado ligeramente, necesito actualizar la hoja de cálculo y debería escribir algunas cosas aquí pronto
Sesiones de GW2 (obsoletas)
Cuando hacíamos spidering solíamos acceder al tradingpost usando una sesión creada al entrar en las cuentas.¡guildwars2.com.
Después de iniciar sesión nos da una session_key que permite el acceso al tradingpost, sin embargo limitado a solo poder obtener las listas de items!¡
Cuando abres el tradingpost desde dentro del juego accedes usando una session_key generada a partir del login del juego, estas sesiones tienen acceso a más características del tradingpost!
¡Con esa sesión también puedes ver la lista de ofertas de los distintos precios, en lugar de sólo la venta más baja y la compra más alta!
Para el intercambio de gemas la session_key del juego te permite calcular las conversiones, mientras que la sesión de accounts.guildwars2.com sólo te da una media redondeada (que es un poco inútil).
Desde hace poco ArenaNet ha estropeado las listas de objetos (resultados de búsqueda y demás) para que sean muy poco precisas (debido a la caché), también puedes ver esto dentro del juego.
También quiero recopilar datos de intercambio de gemas ….
Así que necesitaba una manera de ser capaz de usar una session_key dentro del juego cuando se hace spidering!
Puedes interceptar la session_key ya sea usando Fiddle2r para interceptar el tráfico HTTPS o usando algunas herramientas personalizadas para agarrar las URLs de la memoria compartida …¡
He añadido una tabla a la base de datos llamada gw2session
y un formulario en /admin/session
para insertar la session_key dentro del juego, se requiere que también rellene un ‘secreto’ que es igual a lo que se configura en la configuración o no se requiere en envs
No sé exactamente lo que se puede hacer con la session_key de otra persona, por lo que confío en mí mismo para no holgazanear y actualizar la session_key regularmente y no aceptaré que otras personas me den su session_key!
Se que en combinación con un charid se pueden realizar órdenes de compra y demás desde fuera del juego, por lo que hay que tener cuidado con esta información 😉
Tengo una pequeña herramienta (proporcionada por otra persona) que coge rápidamente la session_key (buscándola en la memoria compartida) sin mucha complicación, no la compartiré públicamente pero podrías considerar unirte al canal de IRC y pedirla 😉
Copyright y licencia
Copyright (c) 2012, Ruben de Vries
Todos los derechos reservados.
Se permite la redistribución y el uso en forma de código fuente y binario, con o sin modificaciones, siempre que se cumplan las siguientes condiciones:
- Las redistribuciones del código fuente deben conservar el aviso de copyright anterior, esta lista de condiciones y el siguiente descargo de responsabilidad.
- Las redistribuciones en forma binaria deben reproducir el aviso de copyright anterior, esta lista de condiciones y el siguiente descargo de responsabilidad en la documentación y/u otros materiales proporcionados con la distribución.
ESTE SOFTWARE ES PROPORCIONADO POR LOS TITULARES DE LOS DERECHOS DE AUTOR Y LOS COLABORADORES «TAL CUAL» Y SE RECHAZA CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO SIN LIMITARSE A, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD E IDONEIDAD PARA UN PROPÓSITO PARTICULAR. EN NINGÚN CASO EL PROPIETARIO DE LOS DERECHOS DE AUTOR O LOS COLABORADORES SERÁN RESPONSABLES DE NINGÚN DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, EJEMPLAR O CONSECUENTE (INCLUYENDO, PERO SIN LIMITARSE A, LA ADQUISICIÓN DE BIENES O SERVICIOS SUSTITUTOS; LA PÉRDIDA DE USO, DATOS O BENEFICIOS; O LA INTERRUPCIÓN DE LA ACTIVIDAD COMERCIAL), SEA CUAL SEA LA CAUSA Y LA TEORÍA DE LA RESPONSABILIDAD, YA SEA POR CONTRATO, RESPONSABILIDAD ESTRICTA O AGRAVIO (INCLUYENDO LA NEGLIGENCIA O DE OTRO TIPO) QUE SURJA DE CUALQUIER MANERA DEL USO DE ESTE SOFTWARE, INCLUSO SI SE AVISA DE LA POSIBILIDAD DE TALES DAÑOS.
Las opiniones y conclusiones contenidas en el software y la documentación son las de los autores y no deben interpretarse como políticas oficiales, expresas o implícitas, del proyecto gw2spidy.
Leave a Reply