如何在Node.js中接收推送?模拟设备获取Airbnb新预订推送可行吗?
在Node.js中模拟Airbnb推送通知接收是否可行?
当然可行!你已经挖到了关键的接口信息,这就成功了一大半。下面我会一步步拆解怎么在Node.js里实现这个方案:
1. 核心思路说明
Airbnb的iOS客户端通过https://api.airbnb.com/v2/air_notification_devices注册推送设备,我们要做的就是在Node.js里模拟这个注册请求,拿到Airbnb返回的推送令牌,然后搭建一个可以接收推送的服务——因为你选的是iphone_gcm类型,本质是对接Firebase Cloud Messaging(FCM),所以后续要基于FCM来接收通知。
2. 注册模拟设备的Node.js实现
首先你需要构造符合要求的POST请求,注意携带正确的Cookie(SRVID)和请求体。这里用axios做示例,用node-fetch也完全可以:
const axios = require('axios'); const { v4: uuidv4 } = require('uuid'); // 用来生成唯一设备ID async function registerAirbnbPushDevice() { // 生成自定义设备ID,用UUID保证唯一性 const deviceId = uuidv4(); // 临时令牌可以随便填,Airbnb会返回新的有效令牌 const tempToken = 'temp-fake-token-123'; // 替换成你实际抓到的有效SRVID Cookie const srvidCookie = 'SRVID=mofi-production-12ab3c456-7defg_172.21.128.38:32350'; try { const response = await axios.post( 'https://api.airbnb.com/v2/air_notification_devices', { app_version: '19.08', device_type: 'iphone_gcm', device_id: deviceId, token: tempToken, enabled: true }, { headers: { 'Cookie': srvidCookie, 'Content-Type': 'application/json', // 模拟iOS客户端的User-Agent,避免被接口拦截 'User-Agent': 'Airbnb/19.08 (iPhone; iOS 13.3; Scale/2.00)', // 可以补充抓包得到的其他请求头,比如X-Airbnb-API-Key 'X-Airbnb-API-Key': 'your-captured-api-key' } } ); const { token: airbnbPushToken, user_id } = response.data.air_notification_device; console.log('设备注册成功!Airbnb推送令牌:', airbnbPushToken); console.log('关联的房东账号ID:', user_id); // 把令牌和设备ID存起来,后续用来接收推送 return { airbnbPushToken, deviceId }; } catch (error) { console.error('注册失败:', error.response?.data || error.message); throw error; } } // 启动注册流程 registerAirbnbPushDevice();
3. 搭建FCM接收服务
因为注册的是iphone_gcm类型,Airbnb会通过FCM给返回的令牌推送通知。你需要搭建一个FCM接收服务,这里用firebase-admin做示例:
前置准备:
- 去Firebase控制台创建项目,下载服务账号密钥文件
- 确保你的FCM项目可以接收设备推送
示例代码:
const admin = require('firebase-admin'); const express = require('express'); const app = express(); app.use(express.json()); // 初始化Firebase Admin SDK const serviceAccount = require('./path/to/your-service-account-key.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); const messaging = admin.messaging(); // 方式1:通过Webhook接收FCM推送(需要在Firebase控制台配置Webhook地址) app.post('/airbnb-push-webhook', (req, res) => { const pushPayload = req.body; console.log('收到Airbnb推送通知:', pushPayload); // 解析预订相关信息,比如标题包含"New booking"就是新预订 if (pushPayload.notification?.title.includes('New booking')) { console.log('新预订提醒:', pushPayload.notification.body); // 这里可以对接你的房东管理系统,比如发送内部通知、更新数据库等 } res.status(200).send('Notification received'); }); // 启动服务 app.listen(3000, () => { console.log('FCM接收服务已启动,监听端口3000'); });
4. 需要注意的几个坑
- Cookie有效期:SRVID Cookie可能会过期,你需要定期从活跃的Airbnb会话中获取新的Cookie,或者模拟登录流程自动更新Cookie
- 请求头完整性:Airbnb的API可能会验证更多请求头(比如
Accept-Language、X-Requested-With),建议通过抓包iOS客户端的完整请求来补充 - 令牌刷新:Airbnb可能会定期失效推送令牌,你需要写定时任务重新注册设备,或者监听令牌更新的回调
- 合规性:模拟Airbnb客户端行为要遵守Airbnb的服务条款,避免因违规使用导致账号被封禁
总结
只要你能正确模拟注册请求,并且搭建好FCM接收服务,在Node.js里实现这个方案完全没问题。你已经找到了最关键的注册接口,接下来就是完善请求细节和推送处理逻辑了。
内容的提问来源于stack exchange,提问作者Dev01
相关产品推荐
相关产品推荐

