因此,在构建带有Telegram的自定义虚拟web聊天服务的过程中,我试图获取Telegram发送到服务器的消息,并将其重定向到前端。SSE与HTML5 EventSource 似乎是实现这一目标的最佳且简单的解决方案。
问题是EventSource需要\'Content-Type: text/event-stream\'
和\'Cache-Control: no-cache\'
服务器响应中设置的标头。
如果aWP_REST_REQUEST
在设置响应的函数上返回(“set\\u telegram\\u response”,下文),EventSource将不会收到任何内容。但是,如果响应得到响应,EventSource将关闭连接,声称服务器正在发送JSON响应,而不是text/event-stream
一
以下是我为这篇文章所写的课程的基本内容。如果在该端点上拉取GET请求,它将返回“Some text”字符串。但是EventSource脚本什么也不打印,就好像响应是空的一样。
class Chat
{
private static $token, $telegram, $chat_id;
public $telegram_message;
public function __construct()
{
self::$chat_id = "<TELEGRAM-CHAT-ID>";
self::$token = "<TELEGRAM-TOKEN>";
self::$telegram = "https://api.telegram.org:443/bot" . self::$token;
add_action(\'rest_api_init\', array( $this, \'set_telegram_message_endpoint\' ));
add_action(\'admin_post_chat_form\', array( $this, \'chat_telegram\' ));
add_action(\'admin_post_nopriv_chat_form\', array( $this, \'chat_telegram\' ));
}
public function set_telegram_message_endpoint()
{
register_rest_route(\'mybot/v2\', \'bot\', array(
array(
\'methods\' => WP_REST_SERVER::CREATABLE,
\'callback\' => array( $this, \'get_telegram_message\' ),
),
array(
\'methods\' => WP_REST_SERVER::READABLE,
\'callback\' => array( $this, \'set_telegram_message\' ),
),
));
}
public function set_telegram_message( WP_REST_REQUEST $request )
{
$new_response = new WP_REST_Response( "Some text" . PHP_EOL . PHP_EOL, 200 );
$new_response->header( \'Content-Type\', \'text/event-stream\' );
$new_response->header( \'Cache-Control\', \'no-cache\' );
ob_flush();
return $new_response;
}
public function get_telegram_message( WP_REST_REQUEST $request )
{
$this->telegram_message = $request;
//return rest_ensure_response( $request[\'message\'][\'text\'] );
}
public function chat_telegram( $input = null )
{
$mensaje = $input === \'\' ? $_POST[\'texto\'] : $input;
echo $mensaje;
$query = http_build_query([
\'chat_id\' => self::$chat_id,
\'text\' => $mensaje,
\'parse_mode\' => "Markdown",
]);
$response = file_get_contents( self::$telegram . \'/sendMessage?\' . $query );
return $response;
}
}
我花了整个下午和今天上午的一部分时间阅读REST API上的文档,但找不到任何关于可能出现的错误或如何做到这一点的线索。
顺便说一句,我正在部署的服务器可以处理EventSource请求——我刚刚在测试PHP脚本上试用过,效果很好。所以我真的不知道这里发生了什么。任何帮助都将不胜感激。