You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js下获取Facebook用户资料FBID的问题:大小写URL兼容失效及服务器环境登录异常

解决Facebook页面FBID获取的两个问题

我来帮你逐一搞定遇到的这两个问题:

1. 大写路径URL无法获取FBID的问题

这个问题的核心原因是Facebook对页面路径的大小写不敏感,会自动把大写路径重定向到小写版本,但你的curl-request默认没开启跟随重定向的功能,导致你拿到的是301/302重定向响应的内容,而非目标页面的HTML,自然匹配不到FBID相关的正则表达式。

解决方法很直接:

  • 先把传入的name转为小写,从根源上避免大小写路径的差异
  • 在curl请求中开启跟随重定向,就算有重定向也能拿到目标页面内容

2. 服务器环境要求登录的问题

本地能正常跑,服务器却要登录,本质是Facebook的反爬机制在搞事情:服务器IP大多属于数据中心网段,容易被识别为非人工访问;再加上你的请求头不够完整,模拟真实浏览器的程度不够。

可以通过这两点优化:

  • 补充更多真实浏览器的请求头,让请求看起来更像人工操作
  • 如果允许的话,在服务器上手动登录Facebook一次,把有效的Cookie加入请求头(注意Cookie有有效期,需要定期更新)

修改后的完整函数代码

findFacebookId: (name, cb) => { 
  const curl = new (require('curl-request'))(); 
  return new Promise((resolve, reject) => { 
    // 先将页面名称转为小写,适配Facebook的路径规则
    const normalizedName = name.toLowerCase();
    let url = `https://www.facebook.com/${normalizedName}`; 
    curl.setHeaders([ 
      'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
      'Accept-Language: en-US,en;q=0.5',
      'Referer: https://www.facebook.com/',
      'Connection: keep-alive',
      'Upgrade-Insecure-Requests: 1'
    ])
    // 开启跟随重定向,处理Facebook的大小写路径跳转
    .setOptions({ followRedirects: true })
    .get(url) 
    .then(({ statusCode, body, headers }) => { 
      var regularExpresionMatch = /fb:\/\/(group|page|profile)\/(\d{1,})/gi; 
      const matches = body.match(regularExpresionMatch);
      // 保留旧匹配规则作为 fallback
      const oldmatches = body.match(/entity_id":"\d*/i); 
      if (matches && matches.length > 0) { 
        const id = matches[0]; 
        cb(null, id); 
        resolve(id); // 同时resolve Promise,避免未处理的Promise状态
        return; 
      } else { 
        cb(true);
        reject(new Error('No FBID found in page content'));
      } 
    }) 
    .catch((e) => { 
      cb(e); 
      reject(e);
    }); 
  }); 
}

额外小提示

如果服务器还是触发登录验证,可以试试用无头浏览器(比如Puppeteer)来模拟真实浏览器的操作流程,绕过反爬验证的效果会更好;另外要注意遵守Facebook的服务条款,不要频繁发送请求,避免IP被封禁。

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

火山引擎 最新活动