Skip to content

Instantly share code, notes, and snippets.

@outadoc
Created February 2, 2013 22:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save outadoc/4699484 to your computer and use it in GitHub Desktop.
Save outadoc/4699484 to your computer and use it in GitHub Desktop.
minecon.php, a script that I used to be notified when the clock on minecon.mojang.com started ticking (which meant the tickets were going to be sold).
<?php
require 'nmaApi.class.php';
function get_web_page($url)
{
//echo "curl:url<pre>".$url."</pre><BR>";
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "concumber", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 15, // timeout on connect
CURLOPT_TIMEOUT => 15, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init($url);
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch,CURLINFO_EFFECTIVE_URL );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
//change errmsg here to errno
if ($errmsg)
{
echo "CURL:".$errmsg."<BR>";
return false;
}
return $content;
}
function sendNotif($apikey) {
$nma = new nmaApi(array('apikey' => $apikey));
if($nma->verify()){
if($nma->notify('MineCon', 'ALO UI CER MINECON', 'Looks like the counter is not static anymore!')){
echo "sent_to_" . $apikey;
}
}
}
try {
$minecon_page = get_web_page("http://minecon.mojang.com");
} catch(Exception $e) {
echo "#";
}
if($minecon_page == false) {
die("#");
}
if(preg_match("#Why isn't the clock ticking#", $minecon_page)) {
echo ".";
} else {
echo "*";
$file = fopen('count.txt', 'r+');
$content = fread($file, 126);
if(!strpos($content, 'sent')) {
sendNotif('YOURFIRSTUSERTOKENHERE');
sendNotif('YOURSECONDUSERTOKENHERE');
}
fwrite($file, 'sent');
fclose($file);
}
?>
<?php
class nmaApi
{
/**
* @const LIB_ERROR_TYPE can be exception or error
*/
const LIB_ERROR_TYPE = 'error';
/**
* @const holds the api key verify url
*/
const LIB_NMA_VERIFY = 'https://www.notifymyandroid.com/publicapi/verify';
/**
* @const holds the notify url
*/
const LIB_NMA_NOTIFY = 'https://www.notifymyandroid.com/publicapi/notify';
/**
* toggles on debugging
*
* @var bool
*/
public $debug = false;
public $apiCallsRemaining = false;
public $apiLimitReset = false;
public $lastStatus = false;
/**
* @var bool|string
*/
protected $apiKey = false;
/**
* @var bool|string
*/
protected $devKey = false;
protected $error_codes
= array(
200 => 'Notification submitted.',
400 => 'The data supplied is in the wrong format, invalid length or null.',
401 => 'None of the API keys provided were valid.',
402 => 'Maximum number of API calls per hour exceeded.',
500 => 'Internal server error. Please contact our support if the problem persists.'
);
/**
* @param array $options
*/
function __construct($options = array())
{
if (!isset($options['apikey'])) {
return $this->error('You must supply a API Key');
} else {
$this->apiKey = $options['apikey'];
}
if (isset($options['developerkey'])) {
$this->devKey = $options['developerkey'];
}
if (isset($options['debug'])) {
$this->debug = true;
}
return true; // this shuts my ide up
}
/**
* @param bool $key [optional] if not set the one used on construct is used
*
* @return bool|mixed|SimpleXMLElement|string
*/
public function verify($key = false)
{
$options = array();
if ($key !== false) {
$options['apikey'] = $key;
} else {
$options['apikey'] = $this->apiKey;
}
if ($this->devKey) {
$options['developerkey'] = $this->devKey;
}
return $this->makeApiCall(self::LIB_NMA_VERIFY, $options);
}
/**
* @param string $application
* @param string $event
* @param string $description
* @param int $priority
* @param bool $apiKeys
*
* @return bool|mixed|SimpleXMLElement|string
*/
public function notify($application = '', $event = '', $description = '', $priority = 0, $apiKeys = false)
{
if (empty($application) || empty($event) || empty($description)) {
return $this->error('you must supply a application name, event and long desc');
}
$post = array('application' => substr($application, 0, 256),
'event' => substr($event, 0, 1000),
'description' => substr($description, 0, 10000),
'priority' => $priority
);
if ($this->devKey) {
$post['developerkey'] = $this->devKey;
}
if ($apiKeys !== false) {
$post['apikey'] = $apiKeys;
} else {
$post['apikey'] = $this->apiKey;
}
return $this->makeApiCall(self::LIB_NMA_NOTIFY, $post, 'POST');
}
/**
* @param $url
* @param null $params
* @param string $verb
* @param string $format
*
* @return bool|mixed|SimpleXMLElement|string
* @throws Exception
*/
protected function makeApiCall($url, $params = null, $verb = 'GET', $format = 'xml')
{
$cparams = array(
'http' => array(
'method' => $verb,
'ignore_errors' => true
)
);
if ($params !== null && !empty($params)) {
$params = http_build_query($params);
if ($verb == 'POST') {
$cparams["http"]['header'] = 'Content-Type: application/x-www-form-urlencoded';
$cparams['http']['content'] = $params;
} else {
$url .= '?' . $params;
}
} else {
return $this->error(
'this api requires all calls to have params' . $this->debug ? ', you provided: ' . var_dump($params)
: ''
);
}
$context = stream_context_create($cparams);
$fp = fopen($url, 'rb', false, $context);
if (!$fp) {
$res = false;
} else {
if ($this->debug) {
$meta = stream_get_meta_data($fp);
$this->error('var dump of http headers' . var_dump($meta['wrapper_data']));
}
$res = stream_get_contents($fp);
}
if ($res === false) {
return $this->error("$verb $url failed: $php_errormsg");
}
switch ($format) {
case 'json':
return $this->error('this api does not support json');
/*
* uncomment the below if json is added later
* $r = json_decode($res);
if ($r === null) {
return $this->error("failed to decode $res as json");
}
return $r;*/
case 'xml':
$r = simplexml_load_string($res);
if ($r === null) {
return $this->error("failed to decode $res as xml");
}
return $this->process_xml_return($r);
}
return $res;
}
/**
* @param $message
* @param int $type
*
* @return bool
* @throws Exception
*/
private function error($message, $type = E_USER_NOTICE)
{
if (self::LIB_ERROR_TYPE == 'error') {
trigger_error($message, $type);
return false;
} else {
throw new Exception($message, $type);
}
}
/**
* @param SimpleXMLElement $obj
*
* @return bool
*/
private function process_xml_return(SimpleXMLElement $obj)
{
if (isset($obj->success)) {
$this->lastStatus = $obj->success["@attributes"]['code'];
$this->apiCallsRemaining = $obj->success["@attributes"]['remaining'];
$this->apiLimitReset = $obj->success["@attributes"]['resettimer'];
return true;
} elseif (isset($obj->error)) {
if (isset($obj->error["@attributes"])) {
$this->lastStatus = $obj->error["@attributes"]['code'];
if (isset($obj->error["@attributes"]['resettimer'])) {
$this->apiLimitReset = $obj->error["@attributes"]['resettimer'];
}
}
return $this->error($obj->error);
} else {
return $this->error("unkown error");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment