@ eryxenx/ insta-chat
用于节点.js的非官方Instagram DM Chat API
发送消息、媒体、语音注释和反应 ^ 编辑、未发送、听 ^ 在个人账户上构建 Instagram bots ^ 运行时零浏览器
这是什么?
@eryxenx/insta-chat 是一个独立的Instagram 直接信件 API——美国
(原始内容存档于2017-10-21). Instagram sbling of a FCA package. 它和同一个网点说话
www.instagram.com (中继图QL +) rupload),这样你就可以在
个人账户:
- ✅ 发送 文本、相片、视频、语音注释
- ✅ 反应,编辑和撤消信件
- ✅ 听着 为即将收到的模式草案——实时MQTT推倒或投票——发送到自己的命令
- ✅ 键入 指标、标记、哑音/哑音、隐藏
- ✅ 用户 ——由 id/ 用户名查找, 搜索
- ✅ 运行时纯 HTTP ——没有Puppeteer,没有浏览器,没有本土建筑
- 非正式的。 不隶属于Instagram或Meta. 只用在帐上 自己冒着风险 这个软件包可以自动化一个个人账户,而不是 官方Instagram Business API (英语).
* 安装
npm install @eryxenx/insta-chat
要求数 节点.js 18。 。 。 .
快速启动
const login = require("@eryxenx/insta-chat");
// `cookie` is your browser cookie string (needs at least `sessionid`).
login(cookie, (err, api) => {
if (err) return console.error("Login error:", err.message);
console.log("Logged in as", api.username || api.userID);
// send a DM
api.sendMessage("Hello from my bot 👋", "340282366841710300949128138275732109616");
});
承诺风格也起作用:
const api = await login(cookie);
await api.sendMessage("hi", threadID);
去拿饼干
登录到 https://www.instagram.com (中文(简体) ) 在浏览器中,打开 DevTools = Network =
复制 Cookie 请求头( 它包含 sessionid, (中文(简体) ), ds_user_id, (中文(简体) ),
csrftoken, (中文(简体) ), ig_did) (中文(简体) ). 粘贴整个字符串; 只 sessionid 强制的.
++会议段落(重要)
Instagram 的 Web API 拒绝不携带浏览器的请求 第二届会议
段落 (单位:千美元)__dyn, (中文(简体) ), __csr, (中文(简体) ), __hs, (中文(简体) ), __hsi, (中文(简体) ), __s, (中文(简体) ), fb_dtsg, (中文(简体) ), jazoest(中文(简体) ).
是由Instagram自己的JS捆绑制作的,但有会议范围,所以有一个
真正的浏览器页面负载足够了——抓取一次,再使用直到到期.
const { harvestSessionParams, findChromium } = require("@eryxenx/insta-chat");
const params = await harvestSessionParams({ /* cookie jar */ });
// -> { __dyn, __csr, __hs, fb_dtsg, lsd, ... }
harvestSessionParams 驱动系统 Chrome/铬通过 puppeteer-core
(可选的依赖性,没有浏览器下载). 将结果传递给 login数字 :
const api = await login(cookie, { sessionParams: params });
如果你跳过这个,包裹仍然试图 拖住最小的标志
(单位:千美元)fb_dtsg, (中文(简体) ), lsd)来自Instagram主页自动. 当抛出
暂停使用 api.refreshSession()。 。 。 .
• API
登录
| 打电话 | 说明 |
|---|---|
login(cookie, [options], [cb]) | 返回/削减准备就绪 InstaClient (FCA表面). |
login(cookie, { native: true }) | 返回赤线 InstaAPI 换句话说. |
createClient(cookie, [options]) | 别名 login。 。 。 . |
options数字 : { native, sessionParams, sessionParamsFile, deviceFile, pollInterval, minPollIntervalMs, realtime }。 。 。 .
来做 listen() 而非民调, 选择实时 MQTT :
const api = await login(cookie, { realtime: { enabled: true } });
realtime 实值 { enabled, fallback, host, keepAliveMs }与 fallback !== false
(默认)一个不会连接到收件箱的经纪人会降解为收件箱的传票人,所以
机器人还是会出事的. keepAliveMs 是 PINGREQ 间隔; 必须在下方
cONNECT 保持活性(60 s)并默认为 25 s. 见 监听。 。 。 .
两层
| 层 | 这是什么 | 如何获得它 |
|---|---|---|
InstaClient | FCA / 山羊瓶- Pro 外形地表 (sendMessage, (中文(简体) ), setMessageReaction, (中文(简体) ), getThreadInfo, (...) (中文(简体) ) | login(...) |
InstaAPI | 原生 Instagram 客户端 (sendReaction, (中文(简体) ), sendPhotoBuffer, (中文(简体) ), getInbox, (...) (中文(简体) ) | login(..., { native: true }) 或者说 client.api |
FCA 法则 : src/api/<group>/<method>.js; 添加一个
方法是添加一个文件. createFcaClient(client) 给定命名空格视图
(单位:千美元)messages.send(), (中文(简体) ), threads.getInfo()(三); new InstaContext(client, threadID)
束缚一线. EventNormalizer 将原始收件箱事件映射到 FCA 事件形状.
通讯( FCA 表面)
| 方法 | 说明 |
|---|---|
sendMessage(form, threadID, [cb], [replyToMessage]) | 发送文本/后附;通过传递目标消息id来引用-重写. |
editMessage(text, messageID) | 编辑发出的消息( 15分钟之内) . |
unsendMessage(messageID) | 解开一通消息. |
setMessageReaction(emoji, messageID, [cb], [threadID]) | 对消息的反应. |
sendTypingIndicator(threadID) | 打字指标. |
getThreadInfo 编号 : getThreadList 编号 : getThreadHistory | 线条读取. |
getUserInfo 编号 : getUID | 用户查询. |
getUserInfoV2(idOrIds) | 完整配置(所有细节),用于一个代号或一系列代号. |
getUserProfile(idOrHandle) | 完整的合并配置对象 . |
getProfilePictureV2(idOrHandle, opts) | 任意大小的配置图片(平方 + HD). |
getProfileBio(idOrHandle) 编号 : getUserID(idOrHandle) 编号 : getUserFriendship(id) | Bio, id, 友谊状态. |
getSelfInfo() | 登录账户的自身简介. |
getAppState 编号 : getCookies | 饼干罐. |
通讯( 本地 InstaAPI(中文(简体) )
| 方法 | 说明 |
|---|---|
sendMessage(text, threadID, replyToItemId?) | 发送文本 DM( 可选引用- reply) . |
replyToMessage(threadID, text, replyToItemId?) | 发送答复(引用目标项目). |
sendLink(threadID, link, text) | 发送可选文本的链接 . |
sendReaction(threadID, itemID, emoji) | 对消息的反应. |
removeReaction(threadID, itemID) | 删除反应. |
unsendMessage(threadID, itemID) | 解开一通消息. |
editMessage(threadID, itemID, text) | 编辑发出的消息( 15分钟之内) . |
startTyping(threadID) 编号 : stopTyping(threadID) | 打字指标. |
媒体
| 方法 | 说明 |
|---|---|
sendPhoto(threadID, filePath, [opts]) | 照片来自磁盘. |
sendPhotoBuffer(threadID, buffer, [opts]) | 照片来自一辆缓冲车. |
sendPhotoFromUrl(threadID, url, [opts]) | 照片来自URL. |
sendVideo 编号 : sendVideoBuffer 编号 : sendVideoFromUrl | 视频变体. |
sendVoice 编号 : sendVoiceBuffer 编号 : sendVoiceFromUrl | 语音注释变种. |
opts数字 : { filename, text }。 。 。 .
线索用户( U)
| 方法 | 说明 |
|---|---|
getThreadInfo(threadID) | 线索元数据. |
getThreadHistory(threadID, limit) | 近期消息. |
markThreadSeen(threadID, itemID) | 标为已读. |
muteThread 编号 : unmuteThread 编号 : hideThread | 线条州. |
getUserInfo(userID) 编号 : getUserInfoByUsername(username) | 用户查询. |
searchUsers(query, limit) | 搜索用户. |
getUserProfile(idOrUsername, [opts]) | 完整剖面图从每个来源合并(见下文). |
getProfilePicture(idOrUsername, [opts]) | 最佳图片 URL; opts.size 通过CDN调整大小. |
完整简介getUserInfoV2 编号 : getUserProfile(中文(简体) )
五一号 getUserInfo 返回一个小的 fca 形状子集。 V2 返回 每个细节a
网络会话可以读取,这是 登录安全: profile 查看通过 a
解析器,该解析器会尝试多个源,而永远不会转速限制(429)或a
登录重定向( 302) 到一个死片段错误 - 用于登录的错误
当命令查看一个侧写时 就会自动退出.
来源,按顺序合并(一个来源不能提供的领域) null:
- 收件箱/线索记录 - 客户端已经在管理部见过的用户
视图。 自由,不需要任何请求,也是唯一仍然回答一次的源
配置 REST 路径 429.
getInbox()自动填充. web_profile_info资源 - 警棍计数(随行/随行/媒体), 传记,核实/私人/商业旗帜,外部url,类.- 配置图QL (单位:千美元)
PolarisProfilePageContentQuery- 最丰富的有效载荷,当 Instagram回应. - 账户自己的页面 - 母壳Instagram服务器嵌入 登录账户的完整配置, 所以自我总是解决.
const info = await api.getUserInfoV2("32715034217");
// info["32715034217"] => { id, username, name, biography, followerCount,
// followingCount, mediaCount, isVerified, isPrivate, isBusinessAccount,
// externalUrl, category, profilePicUrl, profilePicUrlHd, fbid, ... }
const profile = await api.getUserProfile("@someuser"); // the raw merged object
const pic = await api.getProfilePictureV2("someuser", { size: 640 });
// pic => { url, hd, thumb, sizes: { "150": ..., "320": ..., "640": ..., "1080": ... } }
监听
const stop = api.listen((err, event) => {
if (err) return console.error(err.message);
console.log(event.senderID, "->", event.body);
// event = { type, threadID, senderID, messageID, body, attachments, timestamp }
});
// later
stop();
listen 通过时使用实时 MQTT 流
{ realtime: { enabled: true } } 改为 login ——Instagram将每个新的管理部推倒
经纪人,所以答复 接近即时。 没有它, listen 民意调查
(默认每15s, 覆盖到 options.pollInterval) (中文(简体) ). 不管怎样,回电
和事件形状完全相同,失败的实时连接返回到
投票,除非你设定 realtime: { enabled: true, fallback: false }。 。 。 .
实时 (MQTT)
Instagram 的实时经纪人 (edge-mqtt.facebook.com)是一个 MQTToT 连接
由同一人认证 sessionid 饼干——没有应用登录. listen() 开车
当实时启用时; 您也可以直接使用:
const api = await login(cookie, { native: true });
api.realtimeOn("message", (e) => console.log(e.message));
api.realtimeOn("typing", (e) => console.log(e.threadID, "is typing"));
api.realtimeOn("seen", (e) => console.log(e.threadID, "read"));
api.realtimeOn("presence", (e) => console.log(e.value));
await api.realtimeConnect();
await api.realtimeSubscribe(); // reads seq_id/snapshot_at_ms from the inbox query
// ...later
api.realtimeDisconnect();
realtimeConnect() 仅在客户端连接时重新使用; 丢弃后
盖个新的,所以 将您的处理器附加到它返回的客户端 财务报告和审定财务报表
当它与你最后一次看到的不同时, 重新加入:
let client = await api.realtimeConnect();
if (client !== previous) {
client.on("direct", onRealtimeDirect);
client.on("disconnected", () => reconnectLater());
previous = client;
}
RealtimeClient (原始客户端)和 RealtimeListener (听 () 包装)
也输出给想要自己驱动套接字的呼叫者.
实例——一个小的DM机器人
const login = require("@eryxenx/insta-chat");
(async () => {
const api = await login(process.env.IG_COOKIE);
api.listen(async (err, event) => {
if (err || !event || !event.body) return;
if (event.body === "/ping") await api.sendMessage("pong 🏓", event.threadID);
await api.sendReaction(event.threadID, event.messageID, "✅");
});
})();
项目结构
| 路径 | 说明 |
|---|---|
index.js | 入境点;出口 login +帮助者. |
index.d.ts | TypeScript定义. |
module/login.js | 经典 login(credentials, [options], [callback])。 。 。 . |
src/api.js | InstaAPI 表面布线每个本土方法组. |
src/api/ | FCA方法,每个文件一个: messaging/, (中文(简体) ), threads/, (中文(简体) ), users/, (中文(简体) ), action/, (中文(简体) ), realtime/。 。 。 . |
src/app/InstaClient.js | FCA形客户端. |
src/app/InstaContext.js | 每端浏览一个客户端. |
src/app/createFcaClient.js | 命名间距视图( N)messages.*, (中文(简体) ), threads.*) (中文(简体) ). |
src/app/loadApiMethods.js | 随附 src/api/*/*.js 在客户端. |
src/events/normalizeEvent.js | 原始收件箱事件 FCA事件. |
src/utils/messageStyle.js | *bold* 编号 : _italic_ ^ Unicode. (中文(简体) ). |
src/http.js | HTTP 客户端:网络头,会话参数,GraphQL, rupload. |
src/constants.js | 终点+中继 doc_id 页:1. |
src/cookies.js | Cookie 解析/ 正常化 . |
src/session.js | 浏览器会话- param 收割( R)puppeteer-core) (中文(简体) ). |
src/deviceIdentity.js | 沉闷的设备身份. |
src/methods/ | 原生 : message, (中文(简体) ), media, (中文(简体) ), reactions, (中文(简体) ), thread, (中文(简体) ), user, (中文(简体) ), inbox, (中文(简体) ), typing。 。 。 . |
src/realtime/mqttot.js | 无依赖的 MQTToT 编码器(Thrift Contract + MQTT 包 + TLS transport). |
src/realtime/client.js | 实时MQTT客户端:连接,发送,直接事件. |
src/realtime/bridge.js | 信件同步补丁 → 原始收件箱事件 . |
src/realtime/listener.js | 电线实时输入 listen() 与粉丝倒回. |
见 DOCS. md (英语) 用于完整的协议注释(GraphQL doc ids,发送 /) 上传/反应流).
QQ 更改日志
见 变动情况。 。 。 .
许可证
阿帕奇 - 2.0 EryXenX (英语)
所需资信: 您可以使用和修改此库,但您必须保留原始版权标题、
NOTICE文档和作者的信用(EryXenX),并明确说明您的更改。 取消或更换信贷违反许可证.