Estoy haciendo un apartado de mi web para seguir las partidas que se están jugando del WoW a tiempo real a partir de la API que me manda las clasificaciones de los jugadores.
Lo que hago es grabar como partidas de jugadores nuevos las entradas que no tienen un jugador conocido en mi base de datos y grabar como partidas nuevas las entradas de jugadores en mi base de datos que tengan un índice diferente a la última partida de ese jugador.
Tengo básicamente 3 problemas:
- El rendimiento de mi nube no baja del 70 % mientras estoy siguiendo EU y US (son dos scripts distintos).
- Los no-éxitos de la petición de la clasificación vía HTTPS, muchas veces el servidor de la API no me responde y no sé por qué.
- Caracteres mal formados en el json que recibo. De vez en cuando recibo errores tipo: "expected while parsing object/hash, at character offset 87785 (before ",")" al decodificar el json.
Using perl Syntax Highlighting
- use JSON;
- use DBD::mysql;
- use LWP::UserAgent;
- use Daemon::Easy sleep=>1, stopfile=>'stopeu', pidfile=>'pideu', callback=>'worker';
- sub worker {
- partidas('2v2');
- partidas('3v3');
- partidas('rbg');
- }
- sub partidas {
- my $bracket = shift;
- my ($dbname,$dbhost,$dbuser,$dbpass) = ('blizzardrankings', 'localhost', 'miuser', 'mipass');
- my $season = 's23';
- my $ua = LWP::UserAgent->new;
- my $response = $ua->get("https://eu.api.battle.net/wow/leaderboard/$bracket?locale=en_GB&apikey=5gdrgfafqdnkryj8tqafqxsdr4qamdcq");
- #muchos unsuccess
- if ($response->is_success) {
- my $contenido = $response->decoded_content;
- $contenido =~ s/\n//g;
- $contenido =~ s/ //g;
- #a veces falla el decode json
- my $json = JSON->new->utf8->decode($contenido);
- my $db = DBI->connect("DBI:mysql:$dbname:$dbhost", "$dbuser", "$dbpass") or die "Imposible conectar con la DB";
- $db->{'mysql_enable_utf8'} = 1;
- my $sth = $db->prepare("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
- $sth->execute() or die "imposible insertar en la tabla";
- $sth->finish;
- $sth = $db->prepare("CREATE TABLE IF NOT EXISTS `blizzardrankings`.`wow_eu_partidas_$bracket\_$season`(
- `ranking` INT(4) NOT NULL,
- `rating` INT(4) NOT NULL,
- `name` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `realm_id` INT(4) NOT NULL,
- `realm_slug` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- `race_id` INT(2) NOT NULL,
- `class_id` INT(2) NOT NULL,
- `spec_id` INT(3) NOT NULL,
- `faction_id` INT(2) NOT NULL,
- `gender_id` INT(2) NOT NULL,
- `rating_change` INT(2) NOT NULL,
- `ranking_change` INT(2) NOT NULL,
- `date` TIMESTAMP
- ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci"
- );
- $sth->execute() or die "imposible crear la tabla";
- $sth->finish;
- foreach my $entradas (@{$json->{'rows'}}) {
- #hacer un select con todos los jugadores de golpe seria mas rapido? eso incluiria otro bucle para formar el query sql
- $sth = $db->prepare("SELECT * FROM `wow_eu_partidas_$bracket\_$season` WHERE name = '$entradas->{name}' AND realm_id = $entradas->{realmId} ORDER BY date DESC LIMIT 1");
- $sth->execute() or die "imposible consultar la tabla";
- my $data = $sth->fetchrow_hashref();
- $sth->finish;
- if ($data->{name}) {
- if ($entradas->{rating} != $data->{rating}) {
- my $rating_change = $entradas->{rating} - $data->{rating};
- my $ranking_change = $entradas->{ranking} - $data->{ranking};
- $entradas->{'realmName'} =~ s/'//;
- $sth = $db->prepare("INSERT INTO wow_eu_partidas_$bracket\_$season VALUES ('$entradas->{ranking}', '$entradas->{rating}', '$entradas->{name}', '$entradas->{realmId}', '$entradas->{realmSlug}', '$entradas->{raceId}', '$entradas->{classId}', '$entradas->{specId}', '$entradas->{factionId}', '$entradas->{genderId}', '$rating_change', '$ranking_change', CURRENT_TIMESTAMP)");
- $sth->execute() or die "imposible inserta en la tabla";
- $sth->finish;
- }
- }
- else {
- $entradas->{'realmName'} =~ s/'//;
- $sth = $db->prepare("INSERT INTO wow_eu_partidas_$bracket\_$season VALUES ('$entradas->{ranking}', '$entradas->{rating}', '$entradas->{name}', '$entradas->{realmId}', '$entradas->{realmSlug}', '$entradas->{raceId}', '$entradas->{classId}', '$entradas->{specId}', '$entradas->{factionId}', '$entradas->{genderId}', '0', '0', CURRENT_TIMESTAMP)");
- $sth->execute() or die "imposible inserta en la tabla";
- $sth->finish;
- }
- }
- $db->disconnect;
- print "Succes updated eu $bracket\n";
- }
- }
- run();
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
Gracias.