From 99ae04dad620b2b30ea66d0a36a4faad544bccbe Mon Sep 17 00:00:00 2001 From: huojl Date: Fri, 29 May 2026 18:29:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B31.1.6=EF=BC=8C=E6=94=AF=E6=8C=81=E4=BD=BF=E7=94=A8API?= =?UTF-8?q?=20Key=E7=99=BB=E5=BD=95=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 2 +- package.json | 2 +- release/obsidian-plugin.html | 12 ++++++---- release/sonicnote-sync-1.1.6.zip | Bin 0 -> 6382 bytes src/api.ts | 6 ++--- src/main.ts | 2 +- src/settings.ts | 39 +++++++++++++++---------------- src/types.ts | 4 ++-- 8 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 release/sonicnote-sync-1.1.6.zip diff --git a/manifest.json b/manifest.json index e199b80..0964ffa 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "sonicnote-sync", "name": "SonicNote Sync", - "version": "1.1.5", + "version": "1.1.6", "minAppVersion": "0.15.0", "description": "Sync recordings from SonicNote to Obsidian as Markdown files", "author": "EasyLinkIn", diff --git a/package.json b/package.json index daaa4d5..5b14aa1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sonicnote-sync", - "version": "1.1.5", + "version": "1.1.6", "description": "Sync recordings from SonicNote to Obsidian as Markdown files", "main": "main.js", "scripts": { diff --git a/release/obsidian-plugin.html b/release/obsidian-plugin.html index 5189cfe..2187820 100644 --- a/release/obsidian-plugin.html +++ b/release/obsidian-plugin.html @@ -343,7 +343,7 @@
- v1.1.5 + v1.1.6 Obsidian 插件 2 个 Skills 视频教程 @@ -351,7 +351,7 @@

SonicNote for Obsidian

录音同步、待办提取、工作总结 — 让 Obsidian 成为你的智能笔记中心

- + SonicNote Sync 插件 @@ -407,6 +407,10 @@

更新记录

+

v1.1.6

+
    +
  • 登录方式从手机号+验证码切换为 API Key(在妙记 App → 我的 → API Key 管理中创建)
  • +

v1.1.5

  • 新增学习总结同步:自动同步知识全景图、核心收获和课后巩固内容
  • @@ -447,7 +451,7 @@

    安装

      -
    1. 点击上方按钮下载 sonicnote-sync-v1.1.5.zip
    2. +
    3. 点击上方按钮下载 sonicnote-sync-v1.1.6.zip
    4. 解压 zip 文件,得到以下文件:
      • main.js
      • @@ -476,7 +480,7 @@
        1. 进入 设置 → SonicNote Sync
        2. 点击"登录"按钮
        3. -
        4. 输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或申领长期密码)
        5. +
        6. 输入 API Key(在妙记 App → 我的 → API Key 管理中创建,格式:sk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

        同步录音

        diff --git a/release/sonicnote-sync-1.1.6.zip b/release/sonicnote-sync-1.1.6.zip new file mode 100644 index 0000000000000000000000000000000000000000..ecb818cdbd42bfeacb13943f3d885ba7ad0a897d GIT binary patch literal 6382 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 LzbEJ0f8YKE%Uvpu literal 0 HcmV?d00001 diff --git a/src/api.ts b/src/api.ts index 33d8185..3cc78a7 100644 --- a/src/api.ts +++ b/src/api.ts @@ -52,9 +52,9 @@ export class SonicNoteApiClient { } } - async login(phone: string, code: string): Promise<{ token: string; userId: string }> { - const res = await this.request('POST', '/app/user/loginByPhone', { - body: { phonenumber: phone, code: code }, + async login(apiKey: string): Promise<{ token: string; userId: string }> { + const res = await this.request('POST', '/app/mcp/login', { + body: { apiKey }, }); if (res.code !== 200) { throw new Error(res.msg || '登录失败'); diff --git a/src/main.ts b/src/main.ts index a36088b..ecbb096 100644 --- a/src/main.ts +++ b/src/main.ts @@ -56,7 +56,7 @@ export default class SonicNoteSyncPlugin extends Plugin { name: '登出', callback: async () => { this.settings.token = ''; - this.settings.phoneNumber = ''; + this.settings.apiKey = ''; await this.saveSettings(); new Notice('已登出 SonicNote'); this.updateStatusBar(); diff --git a/src/settings.ts b/src/settings.ts index 247b5a8..774c79d 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -177,15 +177,18 @@ export class SonicNoteSettingTab extends PluginSettingTab { loginSection.createEl('h3', { text: '账号' }); if (this.api.isAuthenticated()) { + const maskedKey = settings.apiKey.length > 10 + ? settings.apiKey.slice(0, 10) + '...' + : settings.apiKey; new Setting(loginSection) .setName('登录状态') - .setDesc(`已登录: ${settings.phoneNumber}`) + .setDesc(`已登录: ${maskedKey}`) .addButton(btn => btn .setButtonText('登出') .setWarning() .onClick(async () => { settings.token = ''; - settings.phoneNumber = ''; + settings.apiKey = ''; await this.saveSettings(); new Notice('已登出'); this.display(); @@ -193,7 +196,7 @@ export class SonicNoteSettingTab extends PluginSettingTab { } else { new Setting(loginSection) .setName('登录') - .setDesc('使用手机号和验证码登录智音笔记') + .setDesc('使用 API Key 登录 SonicNote') .addButton(btn => btn .setButtonText('登录') .onClick(() => { @@ -229,38 +232,34 @@ class LoginModal extends Modal { contentEl.createEl('h2', { text: '登录 SonicNote' }); - let phone = ''; - let code = ''; + let apiKey = ''; new Setting(contentEl) - .setName('手机号') - .addText(text => text - .setPlaceholder('请输入手机号') - .onChange((value) => { phone = value; })); - - new Setting(contentEl) - .setName('密码') - .setDesc('使用 APP 验证码或者申领长期密码') - .addText(text => text - .setPlaceholder('请输入密码') - .onChange((value) => { code = value; })); + .setName('API Key') + .setDesc('在妙记 App → 我的 → API Key 管理中创建') + .addText(text => { + text + .setPlaceholder('sk-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx') + .onChange((value) => { apiKey = value; }); + text.inputEl.type = 'password'; + }); new Setting(contentEl) .addButton(btn => btn .setButtonText('登录') .setCta() .onClick(async () => { - if (!phone || !code) { - new Notice('请输入手机号和密码'); + if (!apiKey) { + new Notice('请输入 API Key'); return; } try { btn.setButtonText('登录中...'); btn.setDisabled(true); - const result = await this.api.login(phone, code); + const result = await this.api.login(apiKey); const settings = this.getSettings(); settings.token = result.token; - settings.phoneNumber = phone; + settings.apiKey = apiKey; await this.saveSettings(); new Notice('登录成功'); this.close(); diff --git a/src/types.ts b/src/types.ts index 39575fb..f468abd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -15,7 +15,7 @@ export interface SonicNotePluginSettings { frontmatterFields: Record; customFrontmatter: CustomFrontmatterField[]; token: string; - phoneNumber: string; + apiKey: string; lastSyncTime: string; } @@ -53,7 +53,7 @@ export const DEFAULT_SETTINGS: SonicNotePluginSettings = { }, customFrontmatter: [], token: '', - phoneNumber: '', + apiKey: '', lastSyncTime: '', };