发送Telegram机器人消息到Wordpress REST端点?

时间:2018-10-10 20:35:33

标签: wordpress telegram telegram-bot wordpress-rest-api

我正在尝试与Wordpress网站上的电报机器人建立伪在线聊天。我对Wordpress的REST API和Telegram API不满意,但是我认为这很容易。

为了显示从管理员发送给用户的消息,我认为它可以使用Wordpress REST端点。所以我将webhook设置为Telegram:

curl -F "url=https://www.example.com/wp-json/mybot/bot" -F "certificate=@/path/to/my/certificate.crt" https://api.telegram.org/bot<my-bot-token>/setWebhook

并在wordpress中创建自定义端点:

add_action('rest_api_init', array( $this, 'set_telegram_message_endpoint' ));

function set_telegram_message_endpoint()
{
    register_rest_route('mybot', 'bot', array(
        'methods' => 'POST',
        'callback' => 'get_telegram_message' ),
    ));
}

所以我想我可以在此端点捕获发送到我的机器人的消息:

function get_telegram_message( WP_REST_REQUEST $request )
{
    print_r( $request->get_body() );
}

但是相反,我收到的是'code:rest_no_route'...'status:404'json消息。

这甚至可行吗,如果是的话,我在做什么错了?


编辑1

按照@Nikita Durarev的要求,下面是我为此编写的完整课程:

class Chat
{
    private static $token, $telegram;

    public function __construct()
    {
        self::$token = <TELEGRAM-BOT-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', 'bot', array(
            'methods' => 'GET',
            'callback' => array( $this, 'get_telegram_message' ),
        ));
    }

    public function get_telegram_message( WP_REST_REQUEST $request )
    {
        print_r( $request->get_body() );
    }

    public function chat_telegram( $input = null )
    {
        $mensaje = $input === '' ? $_POST['texto'] : $input;
        echo $mensaje;

        $query = http_build_query([
            'chat_id' => <TELEGRAM-CHAT-ID>,
            'text' => $mensaje,
            'parse_mode' => "Markdown",
        ]);

        $response = file_get_contents( self::$telegram . '/sendMessage?' . $query );
        return $response;
    }
}

1 个答案:

答案 0 :(得分:0)

最终设法解决了这个问题(我想)。似乎我将methods变量误解到了register_rest_route函数中。

所以我改变了这个:

'methods' => 'GET',

为此:

'methods' => WP_REST_SERVER::CREATABLE,

这样,我可以通过cURL或邮递员as stated in the Telegram wiki将POST请求发送到端点,并获取发送到端点的JSON对象。

非常感谢@NikitaDudarev愿意提供帮助。