Skip to content

Releases: ShiYi070415/Instamony

Instarmony 1.2.0

Choose a tag to compare

@ShiYi070415 ShiYi070415 released this 22 Oct 19:43

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 这个任务)
  • 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)解析成"某条会话多了条消息":
    当前打开的那条会话直接插入(不请求、不缓存),否则就地更新收件箱那一行并置顶。
  • 会话页仍保留 1225 秒随机轮询兜底(自己刚发完消息后 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

Choose a tag to compare

@ShiYi070415 ShiYi070415 released this 18 Oct 18:19

下载

文件 用途
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

Choose a tag to compare

@ShiYi070415 ShiYi070415 released this 17 Oct 19:27

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 无关。