ざ・わーるど@はてな

気が向いた時に更新する雑記です

GyaASEのAPIをPHPから利用する

GuwashiさんがAjaxベースのゲームサーバーブラウザ『GyaASE』のAPIを公開されていたので、PHPから利用できるようにコードを書いてみました。

最近利用した、Livedoorの天気情報APIを利用するためのServices_Livedoor_Weatherを参考にさせてもらいました。
書いたコードは、晒しておくと偉い人が添削してくれるらしいのでたまには貼ってみます。
といっても、ほとんど自分で何もしていないに等しいですが。

GyASEのAPIを利用するためのクラス

<?php
require_once 'PEAR.php';
require_once 'HTTP/Request.php';
require_once 'XML/Unserializer.php';

if (!defined('SERVICES_GYASE_BASEURL'))
{
	define('SERVICES_GYASE_BASEURL',
			  'http://d3.jpn.org/gyaase/gyastat.php?format=xml&');
}

class Services_Gyase
{
	var $_baseurl = SERVICES_GYASE_BASEURL;

	function Services_Gyase()
	{
	}

	function getApiVersion()
	{
		return 'Beta';
	}

	function getServers($game = null, $country_code = null, $start = 1, $max = 10 )
	{
		if (is_null($game))
		{
			return PEAR::raiseError('[getServers] game has not been set.');
		}

		$params = array();

		$params['game'] = $game;

		if (!empty($country_code))
		{
			$params['country_code'] = mb_strtoupper($country_code);
		}

		if (!empty($start))
		{
			$params['start'] = $start;
		}

		if (!empty($max))
		{
			$params['max'] = $max;
		}

		return $this->_sendRequest($params);
	}

	function _sendRequest($params)
	{
		$query = array();
		foreach ($params as $k => $v) {
			$query[] = $k . '=' . urlencode($v);
		}
		
		$url = $this->_baseurl . implode('&', $query);

		$http = &new HTTP_Request($url);
		$http->addHeader('User-Agent', 'PEAR::Services_Gyase/' .$this->getApiVersion());
		$http->sendRequest();

		if ($http->getResponseCode() != 200){
			return PEAR::raiseError('Gyase returned invalid HTTP response code
' . $http->getResponseCode());
		}
		
		$result = $http->getResponseBody();

		$xml = &new XML_Unserializer();
		$xml->setOption(XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE, true);
		$xml->unserialize($result, false);
		return $xml->getUnserializedData();
	}
}
?>

使ってみる

<?php
require_once 'Services/Gyase.php';

$gyase = new Services_Gyase();

// 日本のCounter-Strikeサーバーを1件目から5件取得
$result = $gyase->getServers("cs", "jp", 1, 5);

/*
// Quake3サーバーを国の指定ナシで取得
$result = $gyase->getServers("q3");

// 日本のCounter-Strike:Sourceサーバーを取得
$result = $gyase->getServers("css", "jp");
*/

foreach($result['server'] as $k => $v)
{
	$tmp = sprintf("サーバー名: %s\n国: %s\nマップ: %s\n人数: %d/%d\n\n"
			, $v['name'], $v['countryname'], $v['map']
			, $v['numplayers'], $v['maxplayers'] );
	echo $tmp;
}
?>

出力結果

サーバー名: CS 1.6 Private practice Server #xq
国: Japan
マップ: de_dust2
人数: 0/11


サーバー名: unimoe server 4th -Match-
国: Japan
マップ: de_dust2
人数: 11/14


サーバー名: FAVELADOS TOCHIGI SERVER
国: Japan
マップ: de_dust2
人数: 17/17


サーバー名: clan [SoD] 2nd match server
国: Japan
マップ: de_dust2
人数: 1/13


サーバー名: Primeiro Comando da Capital [Quebra Galho - X2]
国: Japan
マップ: de_nuke
人数: 20/21

とりあえず、動いてるっぽいですねえ。HTTP_Requestは便利だなあ。
これを使った方がよいスクリプトがたくさんあるな…。