diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | README.md | 25 | ||||
-rw-r--r-- | composer.json | 16 | ||||
-rw-r--r-- | composer.lock | 62 | ||||
-rwxr-xr-x | track.php | 156 |
5 files changed, 261 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab27d1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/vendor
\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9c3fb5 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# express-ru-tracker + +Скрипт для проверки обновлений по отслеживанию посылок Express.Ru. + +Отправляет обновления в Telegram. + +## Usage + +1. Установить зависимости через composer. + +2. Запускать через cron как-то так: + ``` + php track.php \ + --tracking-number D123456 \ + --tracking-date 2021-05-20 \ + --user-login $USER_LOGIN \ + --user-signature-key $USER_SIGNATURE_KEY \ + --user-authorization-key $USER_AUTHORIZATION_KEY \ + --telegram-chat-id $CHAT_ID \ + --telegram-token $TOKEN + ``` + +## License + +MIT
\ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..ca26674 --- /dev/null +++ b/composer.json @@ -0,0 +1,16 @@ +{ + "name": "ch1p/express-ru-tracker", + "description": "", + "minimum-stability": "dev", + "license": "", + "authors": [ + { + "name": "Evgeny Zinoviev", + "email": "me@ch1p.io" + } + ], + "require": { + "express-ru/sdk": "dev-master", + "ext-curl": "*" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..0e6adee --- /dev/null +++ b/composer.lock @@ -0,0 +1,62 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1ba204e9bd2a169fead5556bc3dc7aaa", + "packages": [ + { + "name": "express-ru/sdk", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ExpressRu/SDK.git", + "reference": "b7e56844ce27dbbac2227b2030a23074ac9d6fa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ExpressRu/SDK/zipball/b7e56844ce27dbbac2227b2030a23074ac9d6fa6", + "reference": "b7e56844ce27dbbac2227b2030a23074ac9d6fa6", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "ExpressRuSDK\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "authors": [ + { + "name": "Artem Dudov", + "email": "artem.dudov@gmail.com" + } + ], + "support": { + "issues": "https://github.com/ExpressRu/SDK/issues", + "source": "https://github.com/ExpressRu/SDK/tree/master" + }, + "time": "2018-12-12T06:52:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "express-ru/sdk": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/track.php b/track.php new file mode 100755 index 0000000..23fdfec --- /dev/null +++ b/track.php @@ -0,0 +1,156 @@ +#!/usr/bin/env php +<?php + +require_once __DIR__.'/vendor/autoload.php'; + +class UserConfig implements ExpressRuSDK\Providers\UserConfigProviderInterface { + + protected $login; + protected $sigkey; + protected $authkey; + + public function __construct($login, $sigkey, $authkey) { + $this->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 = "<i>".$entry['date']."</i>\n"; + $s .= htmlspecialchars($entry['status'])."\n"; + $s .= htmlspecialchars($entry['note']); + return $s; + }, $new_entries); + $text = "Отслеживание заказа <b>{$options['tracking-number']}</b>\n\n".implode("\n\n", $new_entries); + $telegram->notify($text); +}
\ No newline at end of file |