Как исправить «неправильный ответ от webhook: 301 перемещен навсегда» в ответе Telegram Webhook? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать бота для телеграмм на Laravel с помощью php-telegram-bot .Я установил webhook и теперь получаю сообщение:

{"ok": true,
"result": {
"url": "https://.../api/telegram/hook/",
"has_custom_certificate": true,
"pending_update_count": 15,
"last_error_date": 1549043620,
"last_error_message": "Wrong response from the webhook: 301 Moved Permanently",
"max_connections": 40
}
}

Что это значит?Я знаю, что означает ошибка 301, но не могу понять, какие шаги необходимы для решения этой проблемы.

Мой контроллер:

public function hook()
    {
      $commands_paths = [
            app_path() . '/Services/Telegram/Bots/Bitbd_BOT/Commands',
      ];
      try {
          // Create Telegram API object
          $telegram = new Telegram($this->bot_api_key, $this->bot_username);
          TelegramLog::initErrorLog(storage_path() . "/{$this->bot_username}_error.log");
          TelegramLog::initDebugLog(storage_path() . "/{$this->bot_username}_debug.log");
          TelegramLog::initUpdateLog(storage_path() . "/{$this->bot_username}_update.log");
          // Add commands paths containing your custom commands
          $telegram->addCommandsPaths($commands_paths);
          $telegram->enableLimiter();
          // Handle telegram webhook request
          $handle = $telegram->handle();

      } catch (TelegramException $e) {
            echo $e->getMessage();
      }
    }

Маршруты API:

Route::group(['prefix' => 'telegram'], function () {
    Route::get('hook/set', 'TelegramController@setWebhook');
    Route::any('hook','TelegramController@hook');
});

Некоторые интересные: / api / telegram / hook корректно работает только с ЛЮБОЙ или GET опцией, метод POST возвращает пустую страницу с vue, и я не знаю почему.

1 Ответ

0 голосов
/ 01 февраля 2019

Создайте промежуточное ПО в app / Http / Middleware / PreflightResponse.php

и вставьте этот код:

<?php
namespace App\Http\Middleware;
use Closure;
class PreflightResponse
{
    public function handle($request, Closure $next )
    {
        if ($request->getMethod() === "OPTIONS") {
            return response('');
        }
return $next($request);
     }
 }

Затем в app / Http / Kernel.php добавьте в глобальныйпеременная $ middleware:

protected $middleware = [
    Middleware\PreflightResponse::class,
];

Это общее решение, но вы можете указать в качестве названного промежуточного ПО и использовать его в своих маршрутах.

Это происходит из-за CORS и его мер безопасности.Я надеюсь, что это может помочь: D

...