Skip to content

Instantly share code, notes, and snippets.

@gregbird gregbird/Scheduler
Last active Jan 20, 2020

Embed
What would you like to do?
Use this Scheduler to get the Tax rates every hour from the following API https://api.taxrates.io/index.html#method_getrates
<?php
function help() {
echo <<<TEXT
Taxrates scheduler v1.0
Usage:
php scheduler.php clientSecret command arg1 arg2 ...
php scheduler.php clientSecret rates [zip] [filter]
php scheduler.php clientSecret countrycode code product_code [zip] [filter]
php scheduler.php clientSecret ip ipaddr product_code [zip] [filter]
Examples:
php scheduler.php W0ARtUS52Dfwx3LnSy8 rates
php scheduler.php W0ARtUS52Dfwx3LnSy8 rates 10006
php scheduler.php W0ARtUS52Dfwx3LnSy8 rates 10006 standard
php scheduler.php W0ARtUS52Dfwx3LnSy8 countrycode DE C010
php scheduler.php W0ARtUS52Dfwx3LnSy8 countrycode US C010 10006
php scheduler.php W0ARtUS52Dfwx3LnSy8 countrycode US C010 10006 standard
php scheduler.php W0ARtUS52Dfwx3LnSy8 ip 8.8.8.8 C010
php scheduler.php W0ARtUS52Dfwx3LnSy8 ip 4.4.4.4 C010 10006
php scheduler.php W0ARtUS52Dfwx3LnSy8 ip 8.8.8.8 C010 10006 standard
TEXT;
}
if ($argc < ($argv[2] === 'rates' ? 3 : 4)) {
help();
return 1;
}
$curl = new class($argv[1])
{
private $ch;
public function __construct($clientSecret)
{
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_HEADER, 0);
curl_setopt($this->ch, CURLOPT_FAILONERROR, false);
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($this->ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'Authorization: Apikey ' . $clientSecret,
]);
}
public function __destruct()
{
curl_close($this->ch);
}
public function rates($zip = null, $filter = null)
{
$query = http_build_query(
[
'domain' => 'api.taxrates.io',
'zip' => $zip,
'filter' => $filter,
]
);
return $this->request('/api/v1/tax/rates?'.$query);
}
public function rates3($cursor = 0, $filter = false)
{
$query = http_build_query([
'domain' => 'api.taxrates.io',
'cursor' => $cursor,
'filter' => $filter,
]);
return $this->request('/api/v3/tax/rates?'.$query);
}
public function countryCode($countryCode, $productCode, $zip = null, $filter = null)
{
$query = http_build_query(
[
'domain' => 'api.taxrates.io',
'country_code' => $countryCode,
'zip' => $zip,
'product_code' => $productCode,
'filter' => $filter,
]
);
return $this->request('/api/v1/tax/countrycode?'.$query);
}
public function ip($ip, $productCode, $zip = null, $filter = null)
{
$query = http_build_query(
[
'domain' => 'api.taxrates.io',
'ip' => $ip,
'zip' => $zip,
'product_code' => $productCode,
'filter' => $filter,
]
);
return $this->request('/api/v1/tax/ip?'.$query);
}
private function request($url)
{
$headers = [];
// $domain = 'http://api.stage.taxrates.io';
// $domain = 'http://api.taxrates.local';
$domain = 'https://api.taxrates.io';
curl_setopt($this->ch, CURLOPT_URL, $domain.$url);
curl_setopt($this->ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use(&$headers) {
$len = strlen($header);
$header = explode(':', $header, 2);
if (count($header) < 2) { // Invalid header
return $len;
}
$name = strtolower(trim($header[0]));
if (!array_key_exists($name, $headers)) {
$headers[$name] = [trim($header[1])];
} else {
$headers[$name][] = trim($header[1]);
}
return $len;
});
$result = curl_exec($this->ch);
if ($result === false) {
throw new RuntimeException(sprintf(
'Curl: (%d) %s',
curl_errno($this->ch),
curl_error($this->ch)
));
}
if (curl_getinfo($this->ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($result);
}
$result = json_decode($result, true);
if (!empty($result['ErrorCode'])) {
throw new RuntimeException($result['ErrorMessage']);
}
return [
'result' => $result,
'headers' => $headers,
];
}
};
try {
$args = array_pad(array_slice($argv, 2, 5), 5, null);
switch ($args[0]) {
case 'rates':
$response = $curl->rates($args[1], $args[2]);
break;
case 'countrycode':
$response = $curl->countryCode($args[1], $args[2], $args[3], $args[4]);
break;
case 'ip':
$response = $curl->ip($args[1], $args[2], $args[3], $args[4]);
break;
case 'rates3':
$cursor = 0;
while ($cursor !== null) {
$response = $curl->rates3($cursor);
$output = substr(json_encode($response['result']), 0, -1);
if ($cursor !== 0) {
$output = ','.substr($output, 1);
}
fwrite(STDOUT, $output);
sleep(5);
$cursor = isset($response['headers']['x-cursor-next'][0]) ? $response['headers']['x-cursor-next'][0] : null;
}
fwrite(STDOUT, ']');
return;
default:
help();
return 1;
}
$output = json_encode($response['result'], JSON_PRETTY_PRINT);
if ($args[0] === 'rates3') {
fwrite(STDOUT, substr(substr($output, 0, -1).',', 1));
} else {
fwrite(STDOUT, $output);
}
} catch (Exception $e) {
fwrite(STDERR, $e->getMessage());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.