#!/usr/bin/env php
login = $login;
$this->sigkey = $sigkey;
$this->authkey = $authkey;
}
public function getLogin() {
return $this->login;
}
public function getSignatureKey() {
return $this->sigkey;
}
public function getAuthorizationKey() {
return $this->authkey;
}
}
class State {
protected $__file;
protected $__state = [];
public function __construct(string $file) {
$this->__file = $file;
$this->load();
}
public function __destruct() {
file_put_contents($this->__file, serialize($this->__state));
}
public function __get($key) {
return $this->__state[$key] ?? null;
}
public function __set($key, $value) {
$this->__state[$key] = $value;
}
protected function load() {
if (file_exists($this->__file))
$this->__state = unserialize(file_get_contents($this->__file));
}
}
class TelegramNotifier {
protected $token;
protected $chat_id;
public function __construct(string $token, int $chat_id) {
$this->token = $token;
$this->chat_id = $chat_id;
}
public function notify(string $html) {
$ch = curl_init();
$url = 'https://api.telegram.org/bot'.$this->token.'/sendMessage';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'chat_id' => $this->chat_id,
'text' => $html,
'parse_mode' => 'html',
'disable_web_page_preview' => 1
]);
curl_exec($ch);
curl_close($ch);
}
}
function getopts() {
$keys = [
'tracking-number',
'tracking-date',
'user-login',
'user-signature-key',
'user-authorization-key',
'telegram-chat-id',
'telegram-token',
];
$options = getopt('', array_map(function($s) { return "$s:"; }, $keys));
$err = false;
foreach ($keys as $key) {
if (!isset($options[$key])) {
echo "--$key is required\n";
$err = true;
}
}
if ($err)
exit(1);
return $options;
}
ini_set('display_errors', 1);
error_reporting(E_ALL);
$options = getopts();
$state = new State(getenv('HOME').'/.express-ru-tracker-'.$options['tracking-number']);
$telegram = new TelegramNotifier($options['telegram-token'], (int)$options['telegram-chat-id']);
$user_config = new UserConfig($options['user-login'], $options['user-signature-key'], $options['user-authorization-key']);
$sdk = new ExpressRuSDK\SDK($user_config);
$api = $sdk->getApiTransmitter();
$method = new ExpressRuSDK\Api\Methods\GetTrackingStatusesMethod($options['tracking-number'], $options['tracking-date']);
$response = $api->transmitMethod($method);
$result = $response->getResult();
if (empty($result))
exit(2);
$new_entries = [];
$prev_time = $state->time ?? 0;
$entries = reset($result);
foreach ($entries as $entry) {
$time = strtotime($entry['date']);
if ($time <= $prev_time)
continue;
$new_entries[] = $entry;
$prev_time = $time;
}
$state->time = $prev_time;
if (!empty($new_entries)) {
$new_entries = array_map(function(array $entry) {
$s = "".$entry['date']."\n";
$s .= htmlspecialchars($entry['status'])."\n";
$s .= htmlspecialchars($entry['note']);
return $s;
}, $new_entries);
$text = "Отслеживание заказа {$options['tracking-number']}\n\n".implode("\n\n", $new_entries);
$telegram->notify($text);
}