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

将网页抓取功能集成到Google Home项目时数据为空的问题求助

解决Firebase Functions中Webhook数据抓取返回null的问题

看起来你遇到的是很典型的「本地调试正常,部署到云端就失效」的问题,结合你的描述,我整理了几个最可能的原因和对应的解决方案:

1. 目标网站拦截了云端请求

很多网站会校验请求的User-Agent标识,Firebase Functions默认的请求UA会被识别为非浏览器请求,导致返回空内容或错误页面。你可以在请求中添加模拟浏览器的UA头来绕过这个限制:

// 修改你的request请求部分,添加headers配置
request({
  url: "http://books.toscrape.com",
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
  }
}, function(error, response, body) {
  // 原有逻辑...
  // 新增日志,部署后查看返回的内容片段,排查是否拿到正确页面
  console.log("Response body snippet:", body?.slice(0, 500));
});

2. 替换已废弃的request库

request库已经被官方标记为废弃,Firebase Functions的Node.js运行环境可能存在兼容性问题。建议改用axios或node-fetch这类仍在维护的HTTP库:

先安装依赖

npm install axios

改写抓取逻辑(适配Firebase的异步处理)

const functions = require('firebase-functions');
const axios = require('axios');
const cheerio = require('cheerio');

// 你的Webhook函数示例
exports.scrapeAndRespond = functions.https.onRequest(async (req, res) => {
  try {
    // 发起请求并带上UA头
    const response = await axios.get("http://books.toscrape.com", {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
      }
    });

    console.log("请求状态码:", response.status);
    console.log("返回内容片段:", response.data.slice(0, 500));

    // 解析页面
    const $ = cheerio.load(response.data);
    const categoryList = [];
    // 注意:原选择器可能存在冗余,这里简化适配目标网站结构
    $('ul.nav.nav-list li ul li a').each(function() {
      const category = $(this).text().trim();
      categoryList.push(category);
    });

    // 返回给Google Assistant的纯文本响应
    res.json({
      fulfillmentText: `当前抓取到的分类有:${categoryList.join('、')}`
    });
  } catch (error) {
    console.error("抓取出错:", error.message);
    res.json({
      fulfillmentText: "抱歉,暂时无法获取数据,请稍后再试"
    });
  }
});

3. 确保Firebase函数正确处理异步操作

如果你的Webhook函数是用传统回调方式编写的,可能会出现「函数在请求完成前就提前结束」的情况,导致返回null。改用async/await语法可以确保函数等待抓取完成后再返回结果。

4. 查看Firebase Functions日志

部署后一定要去Firebase控制台的「函数」→「日志」板块查看详细输出:

  • 如果看到response.statusCode是403/404,说明请求被拦截或目标地址有误
  • 如果body是空白或错误页面,就对应上面的UA或HTTP库问题

按照这些步骤排查,应该能解决你遇到的数据返回null的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:40