Scripts
RuneScape Levels (v2)
Een tijdje geleden poste ik een soortgelijk script dat ook levels van runescape-spelers van de site haalde. Die deed het best goed, totdat de site van runescape werd vernieuwd :(. het vorige script was overigens ook een zooitje wat betreft schrijfstijl, dit is veel meer in de richting van OOP. Mocht ik nog iets moeten verbeteren aan mn schrijfstijl, of kan ik bepaalde dingen beter anders doen? Meld het aub ff :). Edit: Ook dit script is nu outdated, maar typ "Runescape" in in de zoekfunctie hiernaast, en je vindt genoeg alternatieven.
runescape-levels-v2
<?php
/**
* RuneScapeStats class
*
* Haalt de rankings van een runescapespeler uit de
* hiscore-tabellen op www.runescape.com .
* let op: de array die deze class geeft ziet er iets
* anders uit dan die van de vorige versie. Onthoud
* jezelf er vooral niet van om dit script te tweaken
* naar je wensen.
*
* @author Rolf de Jong, [email protected]
* @copyright Doe ermee wat je wilt, zolang deze header intact blijft! En een verwijzinkje is ook altijd leuk ;)
*
* @example
$RS = new RuneScapeStats('Weed Tiger');
$RS->getSource();
$RS->parseArray();
$stats = $RS->getResult();
echo <<<HTML
<table>
<tr>
<td><b>Skill</b></td><td><b>Rank</b></td><td><b>Level</b></td><td><b>XP</b></td>
</tr>
HTML;
foreach($stats as $values){
echo "<tr>\n";
echo '<td>'.$values['skill'].'</td>';
echo '<td>'.$values['rank'].'</td>';
echo '<td>'.$values['level'].'</td>';
echo '<td>'.$values['xp']."</td>\n";
echo "</tr>\n";
}
echo '</table>';
*/
class RuneScapeStats {
/**
* Het domein van de runescape server
*
* @access public
* @var string
*/
var $server = 'hiscore-web.runescape.com';
/**
* De relatieve url om bij het juiste bestand
* op de server te komen
*
* @access public
* @var string
*/
var $relURL = 'lang/en/aff/runescape/hiscorepersonal.ws';
/**
* Gebruikersnaam van de speler waarvan de stats
* opgevraagt moeten worden
*
* @access public
* @var string
*/
var $user;
/**
* Dit is de variabele waar de verkregen data uiteindelijk
* in wordt gezet
*
* @access public
* @var array
*/
var $statsArray;
/**
* De skills waar een waarde bij gezocht moet worden
*
* @access public
* @var array
*/
var $disciplines = array(
'Overall',
'Attack',
'Defence',
'Strength',
'Hitpoints',
'Ranged',
'Prayer',
'Magic',
'Cooking',
'Woodcutting',
'Fletching',
'Fishing',
'Firemaking',
'Crafting',
'Smithing',
'Mining',
'Herblore',
'Agility',
'Thieving',
'Slayer',
'Farming',
'Runecraft',
'Hunter',
'Construction');
/**
* true als je debugmessages wilt weergeven, false zo niet
*e
* @var bool
*/
var $debug = false;
var $_httpBody = "";
var $_source;
/**
* Constructor method; url-codeert de spelers naam
* waarvan de stat opgezocht moeten worden
*
* @param string $user
* @return void
* @access public
*/
function RunescapeStats($user){
$this->user = urlencode($user);
}
/**
* Haal de benodigde data van de server in html formaat
*
* @return bool
* @static false
* @access public
*/
function getSource()
{
$this->addParam('user1', $this->user);
$this->addParam('submit', 'Search');
$fp = fsockopen($this->server, 80, $errno, $errstr, 10);
if(!$fp){
return false;
}
$contentLen = strlen($this->_httpBody);
$req = <<<REQUEST
POST /{$this->relURL} HTTP/1.1
Host: {$this->server}
Referer: http://{$this->server}/{$this->relURL}
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: {$contentLen}
{$this->_httpBody}
REQUEST;
fwrite($fp, $req);
$stop = false;
while (!$stop && !feof($fp)) {
$fetch = fgets($fp, 128);
$this->_source.= $fetch;
if(strstr($fetch, 'This webpage') !== false){
fwrite($fp, "Connection: close\r\n\r\n");
fclose($fp);
$stop = true;
}
}
return true;
}
/**
* Zet alle stats in een array
*
* @static false
* @access public
* @return void
*/
function parseArray()
{
if (strstr($this->_source, "does not feature in the hiscores")) {
$this->statsArray = false;
return;
}
$i = 1;
foreach ($this->disciplines as $type) {
//echo str_replace("\n", "", $this->_source);
if( eregi($type . '</a></td><td align="right">([0-9\,]+)</td><td align="right">([0-9]+)</td><td align="right">([0-9\,]+)</td>', str_replace("\n", "", $this->_source), $regs) ){
// De structuur van de array wordt hier gemaakt, en kun je hier dus ook aanpassen
$this->statsArray[$i]['skill'] = $type;
$this->statsArray[$i]['rank'] = $regs[1];
$this->statsArray[$i]['level'] = $regs[2];
$this->statsArray[$i]['xp'] = $regs[3];
} else {
$this->statsArray[$i]['skill'] = $type;
$this->statsArray[$i]['rank'] = 0;
$this->statsArray[$i]['level'] = 0;
$this->statsArray[$i]['xp'] = 0;
}
$i++;
}
}
/**
* Voeg een parameter toe aan de body
*
* @param string $name
* @param string $value
* @return void
* @static false
* @access public
*/
function addParam($name, $value)
{
strlen($this->_httpBody)<1 ? $this->_httpBody=$name.'='.$value : $this->_httpBody.='&'.$name.'='.$value ;
}
/**
* Spuug de gevormde array uit
*
* @return array
*/
function getResult()
{
return $this->statsArray;
}
function execute()
{
if ( $this->getSource() ) {
$this->parseArray();
} else {
$this->debug?trigger_error("Fout bij het ophalen van de source"):null;
$this->statsArray = false;
}
}
}
// Voorbeeldje, dit is de meest saaie toepassing van het script
echo '<form action="http://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . '" method="get">';
echo 'Naam: <input type="text" name="naam" value="'.@$_GET['naam'].'" />';
echo '<br /><input type="submit" value="Zoek hiscores" />';
echo '</form><br />';
if(isset($_GET['naam'])){
$RS = new RuneScapeStats($_GET['naam']);
$RS->execute();
$stats = $RS->getResult();
if ($stats != false) // Als de naam niet in de hiscores voorkomt zal $stats false zijn, ander is $stats een array
{
echo <<<HTML
<table>
<tr>
<td><b>Skill</b></td><td><b>Rank</b></td><td><b>Level</b></td><td><b>XP</b></td>
</tr>
HTML;
foreach($stats as $values){
echo "<tr>\n";
echo '<td>'.$values['skill'].'</td>';
echo '<td>'.$values['rank'].'</td>';
echo '<td>'.$values['level'].'</td>';
echo '<td>'.$values['xp']."</td>\n";
echo "</tr>\n";
}
echo '</table>';
}
else
{
echo "Naam niet gevonden in de hiscores";
}
// var_dump($stats); unescape om de structuur van de array te zien
}
?>
Reacties
0