Repository navigation
Releases: ShiYi070415/Instamony
Release list
Instarmony 1.2.0
Instarmony 1.2.0 —— 本版变化 / 已知问题
版本:
versionName 1.2.0(versionCode 1002000,见AppScope/app.json5)
包名:com.oneleaf.instamony(1.1.0 起从com.fanha.instarmony改名,属于另一个应用)
设备类型:phone / tablet 最低 API:6.0.0(20) 目标 API:26
1.2.0 是一次**"去网页化 + 真·实时"**的版本:把最后一个只在网页里才有的能力(模板回放)整段拆掉,
所有读接口改走移动端私有 API(与 instagrapi 同源);同时把私信做到"推过来"——
MQTToT 长连接、实时落列表、实时插会话、系统通知、点通知直达会话。
下载
| 文件 | 位置 / 用途 |
|---|---|
Instarmony-1.2.0.hap |
GitHub Release Asset + 仓库 release/v1.2.0/:单模块 HAP(已签名),hdc install 直接装机 |
Instarmony-1.2.0.app.zip |
GitHub Release Asset + 仓库:App Pack 的压缩形态(Release 只允许这个后缀;解开即是 Instarmony-1.2.0.app) |
Instarmony-1.2.0.app |
只在仓库 release/v1.2.0/ 下:App Pack 原始文件(AppGallery / 正式分发)—— GitHub Release 不允许 .app 后缀上传 |
- 构建命令:
- HAP:
hvigorw --mode module -p product=default assembleHap→entry/build/default/outputs/default/entry-default-signed.hap - App Pack:
hvigorw --mode project -p product=default assembleApp→build/outputs/default/*.app
(--mode module下没有assembleApp这个任务)
- HAP:
- App Pack 内含
entry-default.hap,pack.info里version.code=1002000 / version.name=1.2.0,
apiVersion.compatible=20 / target=26。
1. 架构:模板机制退役,全面改走移动端私有 API
这是本版工作量最大的一块(也是"为什么以前某些页面总是慢半拍"的根因)。
- 删掉模板表与模板回放链路:
ApiRegistry、RestSession、WebRepost、DirectPrefetch、
DirectCache、EngageSkeleton、WebTokens、resources/rawfile/api_templates.json全部移除。 - 首页信息流 / Reels / 评论 / 关注 / 收藏 / 搜索 / 通知页 / 私信 / 快拍 / 个人主页
逐个改走i.instagram.com/api/v1/…(core/mobileapi/*,字段照 instagrapi 逐条对齐)。 - 隐藏网页改为按需挂载:只在真的要开网页兜底时才建宿主。
前台 CPU 63~78% → 10.6%,后台 69% → 3.2%,内存 409MB → 262MB。 - 冷启动不再串行等满 8 秒;快拍托盘改为交互优先级、提前到首屏之前发。
2. 实时通道(本版最大的新能力)
MQTToT(MQQT over TLS)真的通了(1.1.0 曾判定"本机不可用",本版找到根因并修好):
- 根因:
on('message')必须在connect()之后注册,之前注册的监听全被丢掉;
以及载荷是 zlib 压缩,而 ArkTS 没有内存版 zlib —— 自己写了一份纯 TS inflate
(core/mobileapi/Inflate,puff 风格)。 - 冷启动 约 1.3 秒就连上并订阅(
seq_id/snapshot_at_ms会落盘,先订阅再补差)。 - 收包后的解压 + 派发挪到下一拍执行,并记录
inflate+dispatch ms=(实测 1~7ms),不占主线程。 - 通道只读:所有写操作(发消息 / 点赞 / 关注…)仍然走 REST,节奏由
ApiThrottle人速间隔把关。
3. 私信
3.1 零延迟
- 推送补丁(topic 146
message_sync)解析成"某条会话多了条消息":
当前打开的那条会话直接插入(不请求、不缓存),否则就地更新收件箱那一行并置顶。 - 会话页仍保留 12
25 秒随机轮询兜底(自己刚发完消息后 30 秒内 46 秒突发),
90 秒无操作自动停 —— 节奏拟人,不做"秒级轮询"。
3.2 发消息
- 发送队列:连点几下就排几条,一条条发(写接口有人速间隔);不再"上一发还在飞就直接丢掉"
(那是"一两条发不出去"的真凶)。 - 队列项自带
threadId:发送途中切会话也不会串到别人那里;切会话时未发完的不再被丢弃。 - 失败的那条留在屏上标红「未发送 · 点这里重试」,点击原样重发;状态行给出原因
(throttled-Nmin/challenge_required/send-…)。 - 乐观气泡立刻可见(列表变长就贴底),气泡下方显示「发送中…」。
- 服务端副本回来时同帧撤掉本地那条,并跳过入场动画 —— 不再"弹两条再收回一条"。
3.3 会话页视觉
- 列表铺到屏幕顶部(消息从标题栏下穿过),禁用组件自带下拉刷新,只保留触顶刷新 + 动画。
- 气泡入场:从下往上、由小至大、渐显,
curves.springMotion(0.65, 0.56)带过冲;
进会话时从最新一条往上逐条弹(22ms 一档,封顶 16 档)。 - 刷新不再整屏重弹:
ForEach的键只认消息 id(不带序号),发送后的刷新改"增量合并"。 - 触顶刷新保留锚位(撤掉 LazyForEach —— 那会重置滚动位置,造成"一直回到底部"的死循环)。
3.4 通知
- 本地系统通知:标题 = 发信人的显示名(
XingLi,没有才退回xingli_415),正文 = 消息内容
(图片/视频/语音/闪照有中文占位);「私信」分类注册为SOCIAL_COMMUNICATION(社交),
动态走SERVICE_INFORMATION。 - 判据是"这条会话真的来了新消息"(按消息时间戳),不是未读总数 ——
未读条数封顶 4,按总数判会漏掉"同一条会话继续来消息"。 - 全程异步:整条流程挪到下一拍;取 WantAgent 只等 400ms,超时也先发通知。
- 点通知直达那条会话:会话 id 同时放进
want.parameters与uri
(instarmony://open?route=direct&id=…&from=notify),两条通道任一生效即可;
冷启动会被启动期的session changed → nav stack cleared清栈,所以做了 500ms × 15 次重试,
并且判"是否已在会话里"用 Nav 栈真实栈顶 + 底栏 + 会话 id 三者一起看。
4. Reels
- 关注流 / 探索流分成两页,分段按钮在标题栏那一行居中(沉浸光感,套用「我的」页那款);
文本「探索 / 好友」。 - 首屏改用 instagrapi 的三条
clips通道;翻页"作者页优先 + 探索流补货",
修掉"到底不加载 / 全是固定重复"(busy没收 +clips/user游标读错)。 - 滑动切换动画不再被自己掐断(删掉受控
.index()),同作者不再连着出现。
5. 信息流与"我的"
- 聚焦播放换判据:媒体矩形 + 三把尺子 + 单一滞回(删掉四条互相打架的旧特例)。
- 探索流:第一页落盘(冷启动 20 秒 → <1 秒)、触底零等待(预取 + 队列)、多图/图文视频适配。
- 点赞 / 转发连点不再"没反应"(合并意图,最后一次点击说了算);转发改走移动端私有接口。
- 骨架屏按真实组件尺寸逐块占位;冷启动一律占位动画,不再"铺上次缓存再覆盖"。
- 设置页改「圆角实线卡片 + 分类标题在卡片外」,新增「图片和视频」清晰度(图片质量 / 视频质量)。
6. 稳定性 / 性能
- 修掉偶发 appfreeze(
waitPageReady的等待循环退化成微任务自旋)+ 新增主线程看门狗。 - 修掉会话页 jscrash:气泡分组取"上一条消息"时索引越界
(ForEach的序号与之后重算的列表不一致 →Cannot read property mine of undefined→ 进程被杀)。 - 私信进会话取数从 2.5s → 0.38s(去掉文本快照缓存 + 那一发插队)。
- 请求节奏全局闸门(
ApiThrottle):起发间隔分档(urgent / interactive / warm / idle),
写操作 3~6 秒人速间隔;私信家族可被单独冷却。
7. 已知问题 / 本版没做到
- 远程推送(Push Kit 云端下发):本地通知已完备,
pushService.getToken()与tokenUpdate已接;
但云端下发仍差代码之外的东西 —— AGC 里的client_id(当前getToken报
1000900010 客户端身份非法)、一台转发服务、证书链配置。所以App 被系统杀掉后收不到通知。 .app装机渠道:App Pack 需要 AppGallery / 正式证书配置才能真正分发;本仓产物是调试签名。- 点通知进会话依赖 Nav 栈时序,冷启动偶发需要 1~3 秒才落到会话页(已做重试,期间会先停在首页)。
- 网页兜底仍保留(登录、验证、个别写操作失败时的出口),但不再是主链路。
8. 升级提示
- 版本号:
1.1.0→1.2.0(versionCode 1001000→1002000)。 - 包名在 1.1.0 已改为
com.oneleaf.instamony:它与旧的com.fanha.instarmony
是两个应用,覆盖安装不会生效,需要先卸载旧包;本地数据(设置、缓存)不迁移。 - 覆盖安装不需要重新登录(会话来自 Cookie 罐);账号分区缓存沿用。
- 若私信列表为空:下拉刷新一次,或等实时通道连上后自动补差(会重建收件箱快照)。
Instarmony 1.1.0
下载
| 文件 | 用途 |
|---|---|
Instarmony-1.1.0.app.zip |
App Pack(.app,用于 AppGallery / 正式分发;GitHub 不允许 .app 扩展名,故带 .zip。解开或改名回 .app 即可) |
Instarmony-1.1.0.hap |
单模块 HAP,用于 hdc install 直接装到设备 |
- App Pack 内含
entry-default.hap,版本1.1.0(versionCode 1001000),pack.info里apiVersion.compatible=20 / target=26。
Instarmony 1.1.0 —— 本版变化 / 已知问题
版本:
versionName 1.1.0(versionCode 1001000,见AppScope/app.json5)
形态:HarmonyOS NEXT 原生 ArkUI + 一个常驻隐藏 Web 组件(components/InstagramWebHost)
包名:com.fanha.instarmony设备类型:phone / tablet 最低 API:6.0.0(20)
1.1.0 只做四件事:把私信修到能用、把两张 主页 做完整、把 快拍/精选 打磨到能用、
以及修掉偶发 appfreeze。没有引入新的账号体系、没有改数据来源(仍然是"网页登录 + 原生取数")。
1. 私信(本版改动最大)
1.1 发送:从"发不出去"到可用
1.0.0 里点「发送」只会画出一个本地气泡,服务端一条都收不到。真机定位到两处,都已修:
- 移动端私有 API 的报文不对:照 instagrapi 的
direct_send逐字段对齐 ——- 这条写接口不认
signed_body,必须发普通表单体; client_context/mutation_token/offline_threading_id必须是同一个 token;send_attribution用message_button,还要带
is_x_transport_forward/send_silently/btt_dual_send/is_ae_dual_send/nav_chain。
修好后服务端回HTTP 200+{"action":"item_ack","status_code":"200",…}。
- 这条写接口不认
- 别再被网页兜底那条误报误导:网页那条失败体会长成
{"message":"challenge_required","challenge":{"url":"…/web/unsupported_version/"}}——
那是"客户端版本不受支持",不是人机验证。现在只有真的lock:true才计入「去验证」台账。
1.2 发送后的视觉
- 气泡不再"消失再出现":改为"等服务端那条回到视图里才撤本地气泡"(匹配同文本 + 都是我发的 +
时间窗口;一个服务端副本只用一次,连发两条同样文本也不会互相误确认)。 - 发完不再跳一下:键盘收起动画结束后再补一次贴底。
1.3 列表与已读
- 列表第二行 =
内容 · 相对时间(现在 / n 分钟 / n 小时 / n 天 / n 周)。 - 未读:加粗 + 右侧深蓝色圆点;未读超过一条时内容位换成 「n 条新消息」(n 封顶 4)。
- "全部已读却显示未读"修好:以
last_seen_at[我]与消息时间比较得出未读数(IG 这版
read_state的语义与旧实现相反),并按 instagrapi 补上…/items/{id}/seen/(mark_seen,不签名)。
1.4 实时性(这是本版最"工程"的部分)
- 列表自动刷新、会话页2.5 秒、列表6 秒;进后台立刻停、回前台立刻补一发。
- 系统通知带发信人 + 消息内容(同一类通知共用一个 id,不会堆一屏);只在未读变多时才响。
- 真正的长连接(MQTT)本版没有做出来,原因见第 4 节 —— 这是实测结论,不是没做。
2. 主页(我的 / 其他用户)
2.1 头部
- 用户名字移到帖子/粉丝/关注计数上方并加粗,左边缘与「帖子」对齐。
- 切账号后头部秒开:先用落盘快照画,网络回来再覆盖(以前要等 2~4 秒白屏)。
- 修掉两个"头部数据不加载"的根因,以及"换账号后仍是上一个人的内容"(全量
reset+ 代次守卫)。
2.2 横幅区(沉浸光感胶囊)
- 三颗胶囊:meta 旗下软件(应用图标 + 用户名)、音乐(播放 / 暂停,有曲目才显示)、
添加(按需求先不接功能;并且只在自己的主页显示)。 - 排版细节:整行可横向滚动、左边缘与简介对齐、容器紧贴简介、按钮由
padding-top下推
(解决"拖到顶时按钮被裁掉")。 - 其他用户主页同样有横幅区(但没有「添加」)。
2.3 功能区
- 自己的主页:编辑主页 / 分享主页 两颗胶囊 + 推荐关注圆钮。
- 其他用户主页:关注 / 发消息 + 推荐关注;关注状态改用
show_many校正
(此前会显示成"未关注")。
2.4 精选快拍
- 改成托盘样式(圆头像 + 名字),可打开播放:复用快拍播放页的转场与卡片,
但没有动作区,信息区 = 封面(头像)+ 名称 + 发布日期 + 「更多」。 - 组与组之间连续播放:一组播完自动接下一组,也可以左右切换。
2.5 简介里的 @
@账号变成可点的超链接(强调色、无下划线),点开进该用户主页。
3. 快拍
- 托盘首位固定 「你的快拍」(居中头像 + 右下「+」,沉浸光感);点它 = 发快拍。
- 推荐快拍:圆圈内嵌 「+关注」胶囊,关注后该条消失;首尾留白按"头像可见边 16vp"计算。
- 修掉"推荐快拍被第二发请求抹成空"(托盘缓存 + 单飞);托盘没数据时用首页推荐位自拼兜底。
- 修掉"「你的快拍」头像不跟随名字居中";头像改用落盘快照,启动即有图(此前要等网络)。
- 播放页:资讯行右侧加关注按钮(与胶囊等高);进度条从第一帧就占满固定高度,
数据没回来时头像也不再错位。
4. 已知问题 / 本版没做到
4.1 私信的"真·实时"(MQTT)—— 本机 + 本网络不可用
IG 的实时通道是 MQTToT(MQTT over TLS)。本版把三条独立路径都验了:
| 路径 | 实测结果 |
|---|---|
ArkTS TLSSocket(443/TLS,MQTToT 常规路) |
TLS 握手成功,但 收不到任何字节(同代码走明文 TCP 能收到 889 字节) |
| ArkTS 明文 TCP + 我们拼的 MQTT CONNECT | 报文正确:公共 broker 回 CONNACK 0 |
| FB 明文 5222 | 连接超时 |
| 隐藏 WebView 的 WebSocket(Chromium 栈,6 种端点/子协议组合) | 全部 close 1006(握手被拒) |
结论:当前设备 + 当前网络拿不到 IG 的长连接。代码留在 core/mobileapi/MobileMqtt*.ets
(WS_ENABLED = false),换设备/换网络后打开开关即可复测;NetProbe 里那三组对照也可直接复跑。
4.2 远程推送(Push Kit 云端下发)
- 本地系统通知已接通(权限、去重、带内容),
pushService.getToken()与tokenUpdate已接; - 但云端下发还差三样代码之外的东西:AGC 里配置的
client_id(当前getToken报
1000900010 客户端身份非法)、一台转发服务、以及证书链配置。
4.3 其他
- 音乐胶囊只在 IG 网页给出曲目时出现:
profile_music不在 profile HTML 里,
部分账号就拿不到(要拿全得拦截网页的 GraphQL 响应)。 - 评论草稿跨面板携带(评论区草稿带进帖子评论框)仍未接线 —— 老问题,未在本版处理。
- 快拍/精选的失败现场仍会落盘
Instarmony_diag.txt;诊断代码保留,未清理。
5. 稳定性
- 偶发 appfreeze 修好:根因是
FeedViewModel.waitPageReady()的等待循环在
awaitPageReady()走"刚确认不就绪"快速通道时退化成微任务自旋(主线程被占死;
真机抓到 10 秒内写了 36 万行日志、系统BlockMonitor记 10004ms)。
两侧都改:循环侧主动让出 250ms,快速通道侧强制让出一个宏任务并给日志限流。 - 新增主线程看门狗(
core/MainThreadWatchdog):100ms 心跳,迟到超过 800ms 就打一行
main blocked <N>ms;只在前台判断,忽略跨前后台的挂起。以后再卡,日志会直接指出时长。 - 顺带削掉两处持续开销:叠字亮度采样从固定 700ms 整屏快照改为自适应(静止 2.2s、变化 700ms、
后台暂停、只在结论变化时写状态);Cookie 罐读取改为单飞 + 1.5s 缓存(引擎里那是同步 IPC)。
6. 升级提示
- 版本号:
1.0.0→1.1.0(versionCode 1000000→1001000)。 - 覆盖安装不需要重新登录(会话仍来自 Cookie 罐);账号分区缓存与请求模板沿用。
- 若从 1.0.0 直接覆盖后私信列表为空,下拉刷新一次即可(会重建收件箱快照)。
Instarmony 1.0.0
Instarmony 1.0.0(versionCode 1000000),发布于 2026-10-18。
首个公开版本:原生 HarmonyOS(ArkTS / ArkUI)的 Instagram 客户端,界面全部原生实现,
数据来自隐藏 WebView 持有的会话 + instagrapi 那套私有移动 API(core/mobileapi/)。
本版为未签名包,安装前请用自己的 HarmonyOS 证书与 Profile 重新签名。
功能
- 信息流:首页时间线(下拉刷新 / 触底翻页 / 骨架屏)、快拍托盘与播放器、Reels 全屏竖滑、帖子页与评论浮层。
- 私信:收件箱、会话页(文本 / 媒体 / 分享帖 / Reel / 贴纸 / 语音等 XMA 类型)、发送文本、预取与快照缓存。
- 搜索:关键词搜账号、空关键词的三列推荐瀑布流、点开进 Reels。
- 个人主页:帖子 / 视频 / 收藏 / 被标注四个分页;别人主页复用同一套页面,视频分页可进 Reels。
- 通知:按 今天 / 昨天 / 过去 7 天 / 过去 30 天 / 更早 / 为你推荐 分段,旧的两段折叠在「显示更多」后。
- 互动:点赞、收藏、转发、关注、评论、评论点赞全部 HTTP 直发;状态有会话级覆盖表,跨页面一致。
- 原生设计:ArkUI 组件、系统符号、HDS 沉浸光感材质与降级路径、明暗主题、两档材质厚度。
说明
- 使用的是非公开接口,IG 随时可能改动;失败路径都有降级与提示(移动端 → 模板回放 → 网页驱动)。
- 高频请求会触发
feedback_required/ 限流,代码里有请求闸门与冷却,但仍有可能。 - 翻译功能会把待翻译正文发到第三方在线翻译接口(见
core/Translator.ets文件头)。 - 各页面已在 HarmonyOS 模拟器与真机上逐项操作验证;平板分栏、部分机型(不同 HDS 能力档位)的表现仍需补充实机验证。
- 本版未在真机做长时间稳定性压测;不要拿主账号做压测。
下载与安装
instamony_1.0.0_unsigned.app.zip:未签名 App Pack(.app是单个文件,内含
entry-default.hap与pack.info,不是目录)。GitHub 的 Release 附件不接受.app扩展名
(name has a file extension that is not allowed),所以外面套了一层.zip—— 解压出来就是
原始的instamony_1.0.0_unsigned.app,内容未做任何改动。instamony_1.0.0_unsigned.hap:从该 App Pack 中原样提取的未签名模块包。
两者同源。安装前请用 DevEco Studio 或 hap-sign-tool 以自己的证书与 Profile 重新签名。
.app 适合整体归档或走 AppGallery Connect 上架流程,.hap 适合直接侧载调试。
版本与构建
- 版本:1.0.0(versionCode 1000000)
- 包名:
com.fanha.instarmony - 兼容 API 20(HarmonyOS 6.0.0),目标 API 26
- 支持设备:phone / tablet
- 产物由
hvigorw assembleApp(release 模式、无 signingConfigs)生成:
.app输出在build/outputs/default/<App>-<product>-unsigned.app,
pack.info内的 version 已核验为1.0.0 / 1000000 - 源码:本次仅上传构建产物;压缩包由 GitHub 按 tag 自动生成(Source code (zip) / Source code (tar.gz))
SHA-256
2a7dea34ef9a2a748bf7faecfc7e88128797b0aef4e8e891b6d58e2ca2736259 instamony_1.0.0_unsigned.app.zip
e3631cf53afd7f7fa47d3c983e4f1f984c07fea0f8093da9a34be3803ab15fed instamony_1.0.0_unsigned.hap
(解压 .app.zip 得到的 instamony_1.0.0_unsigned.app 本身:
cd11e99864107dc238a436b3172b2eba69b921f10815fbbce9abc1bdabd9fd55)
许可证
Apache License 2.0(见仓库 LICENSE)。与 Instagram / Meta 无关。