Created
February 2, 2013 22:07
-
-
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).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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