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




