Лучше всего использовать update_id
, который представляет собой конкретное число, которое увеличивается при каждом новом запросе (т. Е. Обновлении). Как это реализовать?
Во-первых, давайте начнем со следующего анонимного класса (используя PHP7):
$lastUpdateId = new class()
{
const FILE_PATH = "last-update-id.txt";
private $value = 1;
public function __construct()
{
$this->ensureFileExists();
$this->value = filesize(self::FILE_PATH) == 0
? 0 : (int)(file_get_contents(self::FILE_PATH));
}
public function set(int $lastUpdateId)
{
$this->ensureFileExists();
file_put_contents(self::FILE_PATH, $lastUpdateId);
$this->value = $lastUpdateId;
}
public function get(): int
{
return $this->value;
}
public function isNewRequest(int $updateId): bool
{
return $updateId > $this->value;
}
private function ensureFileExists()
{
if (!file_exists(self::FILE_PATH)) {
touch(self::FILE_PATH);
}
}
};
То, что делает класс, ясно: обработка последнего update_id
через простой файл.
Примечание: курс старается быть как можно короче. Он не обеспечивает проверку ошибок. Используйте вместо этого свою собственную реализацию (например, используйте SplFileObject
вместо file_{get|put}_contents()
функций).
Теперь есть два метода получения обновлений: длинный опрос x или веб-перехватчики (проверьте Telegram bot API для подробнее о каждом методе и всех свойствах JSON). Приведенный выше код (или аналогичный) следует использовать в обоих случаях.
Примечание. В настоящее время невозможно использовать оба метода одновременно.
Метод длительного опроса (по умолчанию)
Таким образом, вы отправляете HTTPS-запросы в API ботов Telegram и получаете обновления в качестве ответа в объекте в формате JSON. Итак, для получения новых обновлений можно выполнить следующую работу (API, зачем использовать смещение ):
$botToken = "<token>";
$updates = json_decode(file_get_contents("https://api.telegram.org/bot{$botToken}/getUpdates?offset={$lastUpdateId->get()}"), true);
// Split updates from each other in $updates
// It is considered that one sample update is stored in $update
// See the section below
parseUpdate($update);
Метод WebHook (предпочтительно)
Требование поддержки метода HTTPS POST с вашего сервера, лучший способ получать обновления на данный момент.
Первоначально вы должны включить WebHooks для своего бота, используя следующий запрос (подробнее) :
https://api.telegram.org/bot<token>/setWebhook?url=<file>
Замените <token>
на свой токен бота, а <file>
на адрес вашего файла, который будет принимать новые запросы. Опять же, это должен быть HTTPS.
Хорошо, последний шаг - создание вашего файла по указанному URL:
// The update is sent
$update = $_POST;
// See the section below
parseUpdate($update);
Отныне все запросы и обновления вашего бота будут напрямую отправляться в файл.
Реализация parseUpdate()
Его реализация полностью зависит от вас. Однако, чтобы показать, как использовать приведенный выше класс в реализации, это его образец и краткая реализация:
function parseUpdate($update)
{
// Validate $update, first
// Actually, you should have a validation class for it
// Here, we suppose that: $update["update_id"] !== null
if ($lastUpdateId->isNewRequest($update["update_id"])) {
$lastUpdateId->set($update["update_id"]);
// New request, go on
} else {
// Old request (or possible file error)
// You may throw exceptions here
}
}
Наслаждаться!
Изменить: спасибо @Amir за то, что он предложил версии, которые сделали этот ответ более полным и полезным.
person
MAChitgarha
schedule
16.06.2017