User:General Earl/scripts/API - ranks
< User:General Earl | scripts
This is a very basic example. Can probably be converted to use MySQL or similar type database fairly easily.
#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);
use Compress::Zlib;
use HTTP::Message;
use LWP;
use DBI;
$| = 1;
print "\n".&logTime." Status : News collection started.\n";
sub logTime {
my $time = strftime "%Y-%m-%d %H:%M:%S", gmtime;
return $time;
}
# put things in an infinite loop
while (1) {
sub getContent {
# setup You need an API key
my $api = "";
# ServerIDs
# 8 = Express
# 9 = Alliance
# 10 = Team
# 11 = Primary
# 12 = FFA
# Multiple servers example: $server = "8,9,10,11,12"'
my $server = 9;
#ranks feed link
my $url = "http://www.earthempires.com/ranks_feed?apicode=${api}&serverid=${server}";
# time to wait if retrieval fails.
my $delaytime = 10;
# do content retieval
my $ua = LWP::UserAgent->new;
$ua->timeout(20);
my $can_accept = HTTP::Message::decodable;
my $response = $ua->get($url, 'Accept-Encoding' => $can_accept );
if ($response->is_error) {
printf "[%d] %s\n", $response->code, $response->message;
die;
}
my $content = $response->decoded_content;
# check our stuff
if ($content eq "You already received this update") {
#print &logTime()." Server says: $content\n";
print &logTime()." Warning: Waiting $delaytime seconds, requesting too fast.\n";
sleep $delaytime;
} elsif ($content eq "") {
print &logTime()." Warning: No content received, waiting $delaytime seconds.\n";
sleep $delaytime;
} else {
print &logTime()." Status : Retrieving content...\n";
my $contentclip = substr($content,0,127);
print &logTime()." Status : Server replied:\n$contentclip ...\n";
&getRanks($content);
}
}
sub getRanks {
my $dbfile = "alliance.db";
my $content = shift @_;
my @countries = split("\n",$content);
# time between updates
my $wait = 300;
# stamp all entries together for easier retrieval.
my $timestamp = strftime "%Y-%m-%d %H:%M:%S", gmtime;
# API csv values:
# server, resetid, rank, cnum, cname, land, nw, tag, gov, gdi prot, vac, alive, deleted
print &logTime()." Status : Opening database ($dbfile)...\n";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","") or die "couldn't connect to db".DBI->errstr;
$dbh->do("CREATE TABLE IF NOT EXISTS history (
id INTEGER PRIMARY KEY,
ts TEXT,
server INTEGER,
resetid INTEGER,
rank INTEGER,
cnum INTEGER,
cname TEXT,
land INTEGER,
nw INTEGER,
tag TEXT,
govt TEXT,
gdi INTEGER,
prot INTEGER,
vac INTEGER,
alive INTEGER,
deleted INTEGER
)"
);
print &logTime()." Status : Writing records...\n";
my $counter = 0;
$dbh->begin_work();
foreach my $country (@countries) {
my @data = split(",", $country);
my ($server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted) = @data;
$dbh->do("INSERT INTO history\(
ts,
server,
resetid,
rank,
cnum,
cname,
land,
nw,
tag,
govt,
gdi,
prot,
vac,
alive,
deleted
) VALUES (
'$timestamp',
'$server',
'$resetid',
'$rank',
'$cnum',
'$cname',
'$land',
'$nw',
'$tag',
'$govt',
'$gdi',
'$prot',
'$vac',
'$alive',
'$deleted'
)"
);
#print "$counter: $server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted\n";
#printf "%4s: %2s %4s %4s %4s %-34s %7s %12s %12s %1s %1s %1s %1s %1s %1s\n", $counter, $server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted;
$counter++;
}
$dbh->commit();
$dbh->disconnect;
print &logTime()." Status : $counter records added to history.\n";
print &logTime()." Status : Waiting $wait seconds for next update.\n";
sleep $wait;
}
&getContent;
}