You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pubsubhubbub订阅报错“Challenge mismatch”,求排查方案

问题:YouTube频道推送订阅验证失败(Challenge mismatch)

我正尝试获取YouTube频道的推送内容,参考了YouTube官方推送通知文档及PubSubHubbub核心规范文档,编写了如下Node.js程序:

const express     = require('express');
const bodyParser  = require('body-parser');
const axios       = require('axios')
const cp          = require('child_process');
const shell       = require('shelljs');
require('body-parser-xml')(bodyParser);

const app         = express();

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({extended: true})); // for parsing application/x-www-form-urlencoded
app.use(bodyParser.xml({
    limit:'25MB'
}));


app.get('/', function(req, res) {
        console.log('GET')
        console.log(req.protocol)     // "https"
        console.log(req.hostname)     // "example.com"
        console.log(req.path)         // "/creatures"
        console.log(req.originalUrl)  // "/creatures?filter=sharks"
        console.log(req.subdomains)   // "['ocean']"

        hub_challenge = req.query['hub.challenge']
        console.log('---------------------------------------')
        console.log(req.query)
        console.log(req.body)
        console.log('---------------------------------------')

        if (hub_challenge) {
                res.status(204).end(hub_challenge)
        }
});


app.post('/', function(req, res) {
        console.log('POST')
        console.log(req.protocol)     // "https"
        console.log(req.hostname)     // "example.com"
        console.log(req.path)         // "/creatures"
        console.log(req.originalUrl)  // "/creatures?filter=sharks"
        console.log(req.subdomains)   // "['ocean']"

        const body    = req.body
        var message = undefined

        if (body.hasOwnProperty('message')) {
                message = req.body.message
        } else if (body.hasOwnProperty('edited_message')) {
                message = req.body.edited_message
        }

        console.log('---------------------------------------')
        console.log(req.body)
        console.log('---------------------------------------')

        res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
        res.header('Expires', '-1');
        res.header('Pragma', 'no-cache');

        if (hub_challenge) {
                res.status(204).end()
        }
});


// Finally, start our server
app.listen(1111, function() {
        console.log('App listening on port 1111!')
});

我通过Pubsubhubbub的订阅页面发起订阅,选择了Verify Type = sync,服务器已收到验证请求,日志如下:

GET
http
ec2-xxx-xxx-xxx-xxx.eu-west-1.compute.amazonaws.com
/
/?hub.topic=https://www.youtube.com/xml/feeds/videos.xml%3Fchannel_id%3DUCLzgGM7q2bXebJUs7cymdhg&hub.challenge=2167537649875952601&hub.mode=subscribe&hub.lease_seconds=432000
[ 'compute', 'eu-west-1', 'ec2-xxx-xxx-xxx-xxx' ]
---------------------------------------
{}
{
  'hub.topic': 'https://www.youtube.com/xml/feeds/videos.xml?channel_id=UCLzgGM7q2bXebJUs7cymdhg',
  'hub.challenge': '2167537649875952601',
  'hub.mode': 'subscribe',
  'hub.lease_seconds': '432000'
}
#2167537649875952601#
---------------------------------------

但Pubsubhubbub立即返回验证结果:"Challenge mismatch.",使用Subscriber Diagnostics调试后,订阅仍处于"unverified"状态。请问哪里操作出错了?

内容的提问来源于stack exchange,提问作者icalvete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:45:39