pi-feishu-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/src/bot.d.ts +29 -0
- package/dist/src/bot.js +75 -0
- package/dist/src/cards.d.ts +6 -0
- package/dist/src/cards.js +87 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.js +28 -0
- package/dist/src/daemon.d.ts +2 -0
- package/dist/src/daemon.js +151 -0
- package/dist/src/extension.d.ts +2 -0
- package/dist/src/extension.js +124 -0
- package/dist/src/poller.d.ts +33 -0
- package/dist/src/poller.js +94 -0
- package/dist/src/renderer.d.ts +8 -0
- package/dist/src/renderer.js +31 -0
- package/dist/src/session-registry.d.ts +15 -0
- package/dist/src/session-registry.js +82 -0
- package/dist/src/types.d.ts +25 -0
- package/dist/src/types.js +1 -0
- package/dist/tests/bot.test.d.ts +1 -0
- package/dist/tests/bot.test.js +89 -0
- package/dist/tests/cards.test.d.ts +1 -0
- package/dist/tests/cards.test.js +39 -0
- package/dist/tests/config.test.d.ts +1 -0
- package/dist/tests/config.test.js +59 -0
- package/dist/tests/renderer.test.d.ts +1 -0
- package/dist/tests/renderer.test.js +61 -0
- package/dist/tests/session-registry.test.d.ts +1 -0
- package/dist/tests/session-registry.test.js +92 -0
- package/dist/tests/types.test.d.ts +1 -0
- package/dist/tests/types.test.js +30 -0
- package/package.json +35 -0
- package/skills/lark-approval/SKILL.md +56 -0
- package/skills/lark-apps/SKILL.md +92 -0
- package/skills/lark-apps/references/lark-apps-access-scope-get.md +104 -0
- package/skills/lark-apps/references/lark-apps-access-scope-set.md +126 -0
- package/skills/lark-apps/references/lark-apps-create.md +112 -0
- package/skills/lark-apps/references/lark-apps-html-publish.md +151 -0
- package/skills/lark-apps/references/lark-apps-list.md +95 -0
- package/skills/lark-apps/references/lark-apps-update.md +86 -0
- package/skills/lark-attendance/SKILL.md +57 -0
- package/skills/lark-base/SKILL.md +359 -0
- package/skills/lark-base/references/dashboard-block-data-config.md +350 -0
- package/skills/lark-base/references/examples.md +140 -0
- package/skills/lark-base/references/formula-field-guide.md +737 -0
- package/skills/lark-base/references/lark-base-advperm-disable.md +83 -0
- package/skills/lark-base/references/lark-base-advperm-enable.md +80 -0
- package/skills/lark-base/references/lark-base-base-copy.md +74 -0
- package/skills/lark-base/references/lark-base-base-create.md +68 -0
- package/skills/lark-base/references/lark-base-base-get.md +39 -0
- package/skills/lark-base/references/lark-base-cell-value.md +151 -0
- package/skills/lark-base/references/lark-base-dashboard-arrange.md +83 -0
- package/skills/lark-base/references/lark-base-dashboard-block-create.md +108 -0
- package/skills/lark-base/references/lark-base-dashboard-block-delete.md +46 -0
- package/skills/lark-base/references/lark-base-dashboard-block-get.md +57 -0
- package/skills/lark-base/references/lark-base-dashboard-block-list.md +53 -0
- package/skills/lark-base/references/lark-base-dashboard-block-update.md +84 -0
- package/skills/lark-base/references/lark-base-dashboard-create.md +73 -0
- package/skills/lark-base/references/lark-base-dashboard-delete.md +44 -0
- package/skills/lark-base/references/lark-base-dashboard-get.md +59 -0
- package/skills/lark-base/references/lark-base-dashboard-list.md +52 -0
- package/skills/lark-base/references/lark-base-dashboard-update.md +69 -0
- package/skills/lark-base/references/lark-base-dashboard.md +240 -0
- package/skills/lark-base/references/lark-base-data-analysis-sop.md +88 -0
- package/skills/lark-base/references/lark-base-data-query.md +375 -0
- package/skills/lark-base/references/lark-base-field-create.md +104 -0
- package/skills/lark-base/references/lark-base-field-delete.md +51 -0
- package/skills/lark-base/references/lark-base-field-get.md +42 -0
- package/skills/lark-base/references/lark-base-field-list.md +44 -0
- package/skills/lark-base/references/lark-base-field-search-options.md +48 -0
- package/skills/lark-base/references/lark-base-field-update.md +97 -0
- package/skills/lark-base/references/lark-base-field.md +22 -0
- package/skills/lark-base/references/lark-base-form-create.md +87 -0
- package/skills/lark-base/references/lark-base-form-delete.md +64 -0
- package/skills/lark-base/references/lark-base-form-detail.md +198 -0
- package/skills/lark-base/references/lark-base-form-get.md +68 -0
- package/skills/lark-base/references/lark-base-form-list.md +73 -0
- package/skills/lark-base/references/lark-base-form-questions-create.md +118 -0
- package/skills/lark-base/references/lark-base-form-questions-delete.md +68 -0
- package/skills/lark-base/references/lark-base-form-questions-list.md +84 -0
- package/skills/lark-base/references/lark-base-form-questions-update.md +92 -0
- package/skills/lark-base/references/lark-base-form-questions.md +23 -0
- package/skills/lark-base/references/lark-base-form-submit.md +171 -0
- package/skills/lark-base/references/lark-base-form-update.md +82 -0
- package/skills/lark-base/references/lark-base-form.md +25 -0
- package/skills/lark-base/references/lark-base-history.md +16 -0
- package/skills/lark-base/references/lark-base-record-batch-create.md +58 -0
- package/skills/lark-base/references/lark-base-record-batch-update.md +53 -0
- package/skills/lark-base/references/lark-base-record-delete.md +62 -0
- package/skills/lark-base/references/lark-base-record-history-list.md +86 -0
- package/skills/lark-base/references/lark-base-record-share-link-create.md +72 -0
- package/skills/lark-base/references/lark-base-record-upsert.md +64 -0
- package/skills/lark-base/references/lark-base-record.md +31 -0
- package/skills/lark-base/references/lark-base-role-create.md +89 -0
- package/skills/lark-base/references/lark-base-role-delete.md +83 -0
- package/skills/lark-base/references/lark-base-role-get.md +87 -0
- package/skills/lark-base/references/lark-base-role-list.md +81 -0
- package/skills/lark-base/references/lark-base-role-update.md +94 -0
- package/skills/lark-base/references/lark-base-shortcut-field-properties.md +481 -0
- package/skills/lark-base/references/lark-base-table-create.md +62 -0
- package/skills/lark-base/references/lark-base-table-delete.md +51 -0
- package/skills/lark-base/references/lark-base-table-get.md +46 -0
- package/skills/lark-base/references/lark-base-table-list.md +43 -0
- package/skills/lark-base/references/lark-base-table-update.md +49 -0
- package/skills/lark-base/references/lark-base-table.md +20 -0
- package/skills/lark-base/references/lark-base-view-create.md +50 -0
- package/skills/lark-base/references/lark-base-view-delete.md +48 -0
- package/skills/lark-base/references/lark-base-view-get-card.md +38 -0
- package/skills/lark-base/references/lark-base-view-get-filter.md +38 -0
- package/skills/lark-base/references/lark-base-view-get-group.md +38 -0
- package/skills/lark-base/references/lark-base-view-get-sort.md +38 -0
- package/skills/lark-base/references/lark-base-view-get-timebar.md +38 -0
- package/skills/lark-base/references/lark-base-view-get-visible-fields.md +28 -0
- package/skills/lark-base/references/lark-base-view-get.md +38 -0
- package/skills/lark-base/references/lark-base-view-list.md +44 -0
- package/skills/lark-base/references/lark-base-view-rename.md +44 -0
- package/skills/lark-base/references/lark-base-view-set-card.md +55 -0
- package/skills/lark-base/references/lark-base-view-set-filter.md +181 -0
- package/skills/lark-base/references/lark-base-view-set-group.md +65 -0
- package/skills/lark-base/references/lark-base-view-set-sort.md +63 -0
- package/skills/lark-base/references/lark-base-view-set-timebar.md +51 -0
- package/skills/lark-base/references/lark-base-view-set-visible-fields.md +46 -0
- package/skills/lark-base/references/lark-base-view.md +44 -0
- package/skills/lark-base/references/lark-base-workflow-create.md +180 -0
- package/skills/lark-base/references/lark-base-workflow-disable.md +94 -0
- package/skills/lark-base/references/lark-base-workflow-enable.md +94 -0
- package/skills/lark-base/references/lark-base-workflow-get.md +147 -0
- package/skills/lark-base/references/lark-base-workflow-guide.md +718 -0
- package/skills/lark-base/references/lark-base-workflow-list.md +124 -0
- package/skills/lark-base/references/lark-base-workflow-schema.md +935 -0
- package/skills/lark-base/references/lark-base-workflow-update.md +167 -0
- package/skills/lark-base/references/lark-base-workflow.md +23 -0
- package/skills/lark-base/references/lark-base-workspace.md +18 -0
- package/skills/lark-base/references/lookup-field-guide.md +512 -0
- package/skills/lark-base/references/role-config.md +539 -0
- package/skills/lark-calendar/SKILL.md +154 -0
- package/skills/lark-calendar/references/lark-calendar-agenda.md +78 -0
- package/skills/lark-calendar/references/lark-calendar-create.md +109 -0
- package/skills/lark-calendar/references/lark-calendar-freebusy.md +124 -0
- package/skills/lark-calendar/references/lark-calendar-room-find.md +113 -0
- package/skills/lark-calendar/references/lark-calendar-rsvp.md +42 -0
- package/skills/lark-calendar/references/lark-calendar-schedule-meeting.md +265 -0
- package/skills/lark-calendar/references/lark-calendar-suggestion.md +125 -0
- package/skills/lark-calendar/references/lark-calendar-update.md +105 -0
- package/skills/lark-contact/SKILL.md +45 -0
- package/skills/lark-contact/references/lark-contact-get-user.md +19 -0
- package/skills/lark-contact/references/lark-contact-search-user.md +124 -0
- package/skills/lark-doc/SKILL.md +65 -0
- package/skills/lark-doc/references/lark-doc-create.md +89 -0
- package/skills/lark-doc/references/lark-doc-fetch.md +141 -0
- package/skills/lark-doc/references/lark-doc-md.md +71 -0
- package/skills/lark-doc/references/lark-doc-media-download.md +50 -0
- package/skills/lark-doc/references/lark-doc-media-insert.md +114 -0
- package/skills/lark-doc/references/lark-doc-media-preview.md +41 -0
- package/skills/lark-doc/references/lark-doc-update.md +252 -0
- package/skills/lark-doc/references/lark-doc-whiteboard.md +100 -0
- package/skills/lark-doc/references/lark-doc-xml.md +169 -0
- package/skills/lark-doc/references/style/lark-doc-create-workflow.md +56 -0
- package/skills/lark-doc/references/style/lark-doc-style.md +106 -0
- package/skills/lark-doc/references/style/lark-doc-update-workflow.md +54 -0
- package/skills/lark-drive/SKILL.md +369 -0
- package/skills/lark-drive/references/lark-drive-add-comment.md +182 -0
- package/skills/lark-drive/references/lark-drive-apply-permission.md +77 -0
- package/skills/lark-drive/references/lark-drive-create-folder.md +73 -0
- package/skills/lark-drive/references/lark-drive-create-shortcut.md +103 -0
- package/skills/lark-drive/references/lark-drive-delete.md +79 -0
- package/skills/lark-drive/references/lark-drive-download.md +31 -0
- package/skills/lark-drive/references/lark-drive-export-download.md +50 -0
- package/skills/lark-drive/references/lark-drive-export.md +119 -0
- package/skills/lark-drive/references/lark-drive-import.md +159 -0
- package/skills/lark-drive/references/lark-drive-inspect.md +50 -0
- package/skills/lark-drive/references/lark-drive-move.md +120 -0
- package/skills/lark-drive/references/lark-drive-pull.md +137 -0
- package/skills/lark-drive/references/lark-drive-push.md +162 -0
- package/skills/lark-drive/references/lark-drive-reactions.md +113 -0
- package/skills/lark-drive/references/lark-drive-search.md +266 -0
- package/skills/lark-drive/references/lark-drive-status.md +198 -0
- package/skills/lark-drive/references/lark-drive-task-result.md +302 -0
- package/skills/lark-drive/references/lark-drive-upload.md +67 -0
- package/skills/lark-drive/references/lark-drive-version-delete.md +38 -0
- package/skills/lark-drive/references/lark-drive-version-get.md +71 -0
- package/skills/lark-drive/references/lark-drive-version-history.md +73 -0
- package/skills/lark-drive/references/lark-drive-version-revert.md +198 -0
- package/skills/lark-event/SKILL.md +145 -0
- package/skills/lark-event/references/lark-event-im.md +86 -0
- package/skills/lark-im/SKILL.md +162 -0
- package/skills/lark-im/references/lark-im-chat-create.md +162 -0
- package/skills/lark-im/references/lark-im-chat-identity.md +55 -0
- package/skills/lark-im/references/lark-im-chat-list.md +198 -0
- package/skills/lark-im/references/lark-im-chat-messages-list.md +148 -0
- package/skills/lark-im/references/lark-im-chat-search.md +136 -0
- package/skills/lark-im/references/lark-im-chat-update.md +84 -0
- package/skills/lark-im/references/lark-im-flag-cancel.md +198 -0
- package/skills/lark-im/references/lark-im-flag-create.md +67 -0
- package/skills/lark-im/references/lark-im-flag-list.md +100 -0
- package/skills/lark-im/references/lark-im-messages-mget.md +95 -0
- package/skills/lark-im/references/lark-im-messages-reply.md +228 -0
- package/skills/lark-im/references/lark-im-messages-resources-download.md +94 -0
- package/skills/lark-im/references/lark-im-messages-search.md +232 -0
- package/skills/lark-im/references/lark-im-messages-send.md +229 -0
- package/skills/lark-im/references/lark-im-reactions.md +297 -0
- package/skills/lark-im/references/lark-im-threads-messages-list.md +111 -0
- package/skills/lark-mail/SKILL.md +648 -0
- package/skills/lark-mail/references/lark-mail-decline-receipt.md +115 -0
- package/skills/lark-mail/references/lark-mail-draft-create.md +123 -0
- package/skills/lark-mail/references/lark-mail-draft-edit.md +400 -0
- package/skills/lark-mail/references/lark-mail-forward.md +173 -0
- package/skills/lark-mail/references/lark-mail-message.md +230 -0
- package/skills/lark-mail/references/lark-mail-messages.md +108 -0
- package/skills/lark-mail/references/lark-mail-reply-all.md +206 -0
- package/skills/lark-mail/references/lark-mail-reply.md +242 -0
- package/skills/lark-mail/references/lark-mail-send-receipt.md +198 -0
- package/skills/lark-mail/references/lark-mail-send.md +216 -0
- package/skills/lark-mail/references/lark-mail-share-to-chat.md +198 -0
- package/skills/lark-mail/references/lark-mail-signature.md +98 -0
- package/skills/lark-mail/references/lark-mail-template-create.md +129 -0
- package/skills/lark-mail/references/lark-mail-template-update.md +198 -0
- package/skills/lark-mail/references/lark-mail-thread.md +111 -0
- package/skills/lark-mail/references/lark-mail-triage.md +122 -0
- package/skills/lark-mail/references/lark-mail-watch.md +94 -0
- package/skills/lark-minutes/SKILL.md +139 -0
- package/skills/lark-minutes/references/lark-minutes-download.md +137 -0
- package/skills/lark-minutes/references/lark-minutes-search.md +206 -0
- package/skills/lark-minutes/references/lark-minutes-upload.md +104 -0
- package/skills/lark-okr/SKILL.md +133 -0
- package/skills/lark-okr/references/lark-okr-contentblock.md +359 -0
- package/skills/lark-okr/references/lark-okr-cycle-detail.md +84 -0
- package/skills/lark-okr/references/lark-okr-cycle-list.md +90 -0
- package/skills/lark-okr/references/lark-okr-entities.md +329 -0
- package/skills/lark-okr/references/lark-okr-image-upload.md +116 -0
- package/skills/lark-okr/references/lark-okr-progress-create.md +81 -0
- package/skills/lark-okr/references/lark-okr-progress-delete.md +47 -0
- package/skills/lark-okr/references/lark-okr-progress-get.md +62 -0
- package/skills/lark-okr/references/lark-okr-progress-list.md +80 -0
- package/skills/lark-okr/references/lark-okr-progress-update.md +81 -0
- package/skills/lark-openapi-explorer/SKILL.md +153 -0
- package/skills/lark-shared/SKILL.md +144 -0
- package/skills/lark-sheets/SKILL.md +343 -0
- package/skills/lark-sheets/references/lark-sheets-cell-data.md +197 -0
- package/skills/lark-sheets/references/lark-sheets-cell-images.md +59 -0
- package/skills/lark-sheets/references/lark-sheets-cell-style-and-merge.md +141 -0
- package/skills/lark-sheets/references/lark-sheets-dropdown.md +133 -0
- package/skills/lark-sheets/references/lark-sheets-filter-views.md +193 -0
- package/skills/lark-sheets/references/lark-sheets-float-images.md +125 -0
- package/skills/lark-sheets/references/lark-sheets-formula.md +88 -0
- package/skills/lark-sheets/references/lark-sheets-row-column-management.md +151 -0
- package/skills/lark-sheets/references/lark-sheets-sheet-management.md +164 -0
- package/skills/lark-sheets/references/lark-sheets-spreadsheet-management.md +140 -0
- package/skills/lark-skill-maker/SKILL.md +85 -0
- package/skills/lark-slides/SKILL.md +296 -0
- package/skills/lark-slides/assets/templates/administration--all_hands_meeting.xml +1999 -0
- package/skills/lark-slides/assets/templates/administration--annual_gala.xml +1160 -0
- package/skills/lark-slides/assets/templates/administration--company_intro.xml +1376 -0
- package/skills/lark-slides/assets/templates/administration--corporate_culture.xml +1765 -0
- package/skills/lark-slides/assets/templates/hr--employee_training.xml +912 -0
- package/skills/lark-slides/assets/templates/hr--employee_training_workshop.xml +1504 -0
- package/skills/lark-slides/assets/templates/hr--onboarding.xml +933 -0
- package/skills/lark-slides/assets/templates/marketing--brand_communication.xml +1367 -0
- package/skills/lark-slides/assets/templates/marketing--brand_logo_design.xml +1347 -0
- package/skills/lark-slides/assets/templates/marketing--brand_operations_plan.xml +1309 -0
- package/skills/lark-slides/assets/templates/marketing--business_plan.xml +1646 -0
- package/skills/lark-slides/assets/templates/marketing--marketing_plan.xml +198 -0
- package/skills/lark-slides/assets/templates/marketing--marketing_strategy.xml +1484 -0
- package/skills/lark-slides/assets/templates/marketing--product_whitepaper.xml +198 -0
- package/skills/lark-slides/assets/templates/marketing--roadshow_business_plan.xml +1506 -0
- package/skills/lark-slides/assets/templates/misc--book_sharing.xml +198 -0
- package/skills/lark-slides/assets/templates/misc--club_event_plan.xml +4885 -0
- package/skills/lark-slides/assets/templates/misc--student_career_plan.xml +1854 -0
- package/skills/lark-slides/assets/templates/office--dark_general.xml +3763 -0
- package/skills/lark-slides/assets/templates/office--dept_annual_report.xml +1192 -0
- package/skills/lark-slides/assets/templates/office--light_general.xml +3378 -0
- package/skills/lark-slides/assets/templates/office--project_kickoff.xml +3152 -0
- package/skills/lark-slides/assets/templates/office--quarterly_review.xml +1253 -0
- package/skills/lark-slides/assets/templates/office--work_report.xml +1099 -0
- package/skills/lark-slides/assets/templates/office--work_summary.xml +4420 -0
- package/skills/lark-slides/assets/templates/office--work_summary_report.xml +1523 -0
- package/skills/lark-slides/assets/templates/operations--brand_logo_design.xml +1347 -0
- package/skills/lark-slides/assets/templates/operations--brand_operations_plan.xml +1309 -0
- package/skills/lark-slides/assets/templates/operations--marketing_plan.xml +1469 -0
- package/skills/lark-slides/assets/templates/operations--product_promotion.xml +687 -0
- package/skills/lark-slides/assets/templates/personal--experience_sharing.xml +2242 -0
- package/skills/lark-slides/assets/templates/personal--personal_resume.xml +2047 -0
- package/skills/lark-slides/assets/templates/personal--promotion_defense.xml +1099 -0
- package/skills/lark-slides/assets/templates/personal--promotion_report.xml +1039 -0
- package/skills/lark-slides/assets/templates/personal--self_intro.xml +696 -0
- package/skills/lark-slides/assets/templates/personal--teaching_sharing.xml +3013 -0
- package/skills/lark-slides/assets/templates/product--business_case_analysis.xml +1341 -0
- package/skills/lark-slides/assets/templates/product--market_analysis.xml +898 -0
- package/skills/lark-slides/assets/templates/product--product_analysis.xml +1537 -0
- package/skills/lark-slides/assets/templates/product--product_intro.xml +2838 -0
- package/skills/lark-slides/assets/templates/product--product_promotion.xml +687 -0
- package/skills/lark-slides/assets/templates/product--product_promotion_2.xml +198 -0
- package/skills/lark-slides/references/asset-planning.md +124 -0
- package/skills/lark-slides/references/examples.md +261 -0
- package/skills/lark-slides/references/lark-slides-create.md +137 -0
- package/skills/lark-slides/references/lark-slides-edit-workflows.md +142 -0
- package/skills/lark-slides/references/lark-slides-media-upload.md +128 -0
- package/skills/lark-slides/references/lark-slides-replace-slide.md +239 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +220 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +123 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +110 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +186 -0
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +98 -0
- package/skills/lark-slides/references/planning-layer.md +219 -0
- package/skills/lark-slides/references/slide-templates.md +201 -0
- package/skills/lark-slides/references/slides_demo.xml +226 -0
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +3004 -0
- package/skills/lark-slides/references/template-catalog.md +463 -0
- package/skills/lark-slides/references/template-index.json +198 -0
- package/skills/lark-slides/references/troubleshooting.md +198 -0
- package/skills/lark-slides/references/validation-checklist.md +102 -0
- package/skills/lark-slides/references/visual-planning.md +250 -0
- package/skills/lark-slides/references/xml-format-guide.md +369 -0
- package/skills/lark-slides/references/xml-schema-quick-ref.md +215 -0
- package/skills/lark-slides/scripts/template_tool.py +970 -0
- package/skills/lark-slides/scripts/template_tool_test.py +177 -0
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +367 -0
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +263 -0
- package/skills/lark-task/SKILL.md +165 -0
- package/skills/lark-task/references/lark-task-assign.md +38 -0
- package/skills/lark-task/references/lark-task-comment.md +28 -0
- package/skills/lark-task/references/lark-task-complete.md +27 -0
- package/skills/lark-task/references/lark-task-create.md +57 -0
- package/skills/lark-task/references/lark-task-followers.md +35 -0
- package/skills/lark-task/references/lark-task-get-my-tasks.md +55 -0
- package/skills/lark-task/references/lark-task-get-related-tasks.md +53 -0
- package/skills/lark-task/references/lark-task-reminder.md +36 -0
- package/skills/lark-task/references/lark-task-reopen.md +27 -0
- package/skills/lark-task/references/lark-task-search.md +41 -0
- package/skills/lark-task/references/lark-task-set-ancestor.md +32 -0
- package/skills/lark-task/references/lark-task-subscribe-event.md +86 -0
- package/skills/lark-task/references/lark-task-tasklist-create.md +35 -0
- package/skills/lark-task/references/lark-task-tasklist-members.md +36 -0
- package/skills/lark-task/references/lark-task-tasklist-search.md +38 -0
- package/skills/lark-task/references/lark-task-tasklist-task-add.md +38 -0
- package/skills/lark-task/references/lark-task-update.md +37 -0
- package/skills/lark-task/references/lark-task-upload-attachment.md +59 -0
- package/skills/lark-vc/SKILL.md +168 -0
- package/skills/lark-vc/references/lark-vc-notes.md +126 -0
- package/skills/lark-vc/references/lark-vc-recording.md +153 -0
- package/skills/lark-vc/references/lark-vc-search.md +193 -0
- package/skills/lark-vc-agent/SKILL.md +121 -0
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +247 -0
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +133 -0
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +111 -0
- package/skills/lark-whiteboard/SKILL.md +144 -0
- package/skills/lark-whiteboard/references/connectors.md +102 -0
- package/skills/lark-whiteboard/references/content.md +40 -0
- package/skills/lark-whiteboard/references/image.md +80 -0
- package/skills/lark-whiteboard/references/lark-whiteboard-query.md +49 -0
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +100 -0
- package/skills/lark-whiteboard/references/layout.md +374 -0
- package/skills/lark-whiteboard/references/schema.md +357 -0
- package/skills/lark-whiteboard/references/style.md +318 -0
- package/skills/lark-whiteboard/references/typography.md +73 -0
- package/skills/lark-whiteboard/routes/dsl.md +107 -0
- package/skills/lark-whiteboard/routes/mermaid.md +27 -0
- package/skills/lark-whiteboard/routes/svg.md +54 -0
- package/skills/lark-whiteboard/scenes/architecture.md +433 -0
- package/skills/lark-whiteboard/scenes/bar-chart.md +187 -0
- package/skills/lark-whiteboard/scenes/comparison.md +135 -0
- package/skills/lark-whiteboard/scenes/fishbone.md +238 -0
- package/skills/lark-whiteboard/scenes/flowchart.md +198 -0
- package/skills/lark-whiteboard/scenes/flywheel.md +195 -0
- package/skills/lark-whiteboard/scenes/funnel.md +198 -0
- package/skills/lark-whiteboard/scenes/line-chart.md +214 -0
- package/skills/lark-whiteboard/scenes/mermaid.md +130 -0
- package/skills/lark-whiteboard/scenes/milestone.md +139 -0
- package/skills/lark-whiteboard/scenes/organization.md +173 -0
- package/skills/lark-whiteboard/scenes/photo-showcase.md +198 -0
- package/skills/lark-whiteboard/scenes/pyramid.md +99 -0
- package/skills/lark-whiteboard/scenes/swimlane.md +371 -0
- package/skills/lark-whiteboard/scenes/treemap.md +198 -0
- package/skills/lark-wiki/SKILL.md +119 -0
- package/skills/lark-wiki/references/lark-wiki-delete-space.md +205 -0
- package/skills/lark-wiki/references/lark-wiki-member-add.md +66 -0
- package/skills/lark-wiki/references/lark-wiki-member-list.md +76 -0
- package/skills/lark-wiki/references/lark-wiki-member-remove.md +61 -0
- package/skills/lark-wiki/references/lark-wiki-move.md +183 -0
- package/skills/lark-wiki/references/lark-wiki-node-copy.md +72 -0
- package/skills/lark-wiki/references/lark-wiki-node-create.md +127 -0
- package/skills/lark-wiki/references/lark-wiki-node-delete.md +62 -0
- package/skills/lark-wiki/references/lark-wiki-node-get.md +56 -0
- package/skills/lark-wiki/references/lark-wiki-node-list.md +198 -0
- package/skills/lark-wiki/references/lark-wiki-space-create.md +46 -0
- package/skills/lark-wiki/references/lark-wiki-space-list.md +198 -0
- package/skills/lark-workflow-meeting-summary/SKILL.md +104 -0
- package/skills/lark-workflow-standup-report/SKILL.md +120 -0
- package/skills/mmx-cli/SKILL.md +440 -0
- package/src/bot.ts +109 -0
- package/src/cards.ts +105 -0
- package/src/config.ts +33 -0
- package/src/daemon.ts +217 -0
- package/src/extension.ts +132 -0
- package/src/poller.ts +135 -0
- package/src/renderer.ts +47 -0
- package/src/session-registry.ts +90 -0
- package/src/types.ts +29 -0
- package/tests/bot.test.ts +104 -0
- package/tests/cards.test.ts +48 -0
- package/tests/config.test.ts +59 -0
- package/tests/renderer.test.ts +74 -0
- package/tests/session-registry.test.ts +94 -0
- package/tests/types.test.ts +35 -0
- package/tsconfig.json +16 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# mail +reply-all
|
|
2
|
+
|
|
3
|
+
> **前置条件:** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
|
|
4
|
+
|
|
5
|
+
回复全部会自动处理:
|
|
6
|
+
- 自动聚合原邮件发件人、原 To、原 Cc
|
|
7
|
+
- 自动排除当前用户地址,避免回给自己
|
|
8
|
+
- 自动维护会话头(`In-Reply-To` / `References`)
|
|
9
|
+
|
|
10
|
+
> **默认草稿**:`+reply-all` 默认保存为草稿,不会立即发送。如需立即发送,添加 `--confirm-send` 参数(仅在用户明确确认后使用)。
|
|
11
|
+
|
|
12
|
+
本 skill 对应 shortcut:`lark-cli mail +reply-all`。
|
|
13
|
+
|
|
14
|
+
## CRITICAL — 发送工作流(必须遵循)
|
|
15
|
+
|
|
16
|
+
此命令默认**只保存草稿**,不会发送邮件。回复全部会发送给**所有**原始收件人,需要发送时有两种合规方式:
|
|
17
|
+
|
|
18
|
+
**方式 A(推荐)** — 创建回复全部草稿(不带 `--confirm-send`):
|
|
19
|
+
```bash
|
|
20
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<回复正文>'
|
|
21
|
+
```
|
|
22
|
+
→ 返回 `draft_id`
|
|
23
|
+
|
|
24
|
+
向用户展示回复摘要(目标邮件、回复内容、完整收件人列表 To/Cc);如果用户想先看效果,可引导其去飞书邮件里查看草稿。
|
|
25
|
+
|
|
26
|
+
用户明确同意后,发送该草稿:
|
|
27
|
+
```bash
|
|
28
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<Step 1 返回的 draft_id>"}'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**方式 B(允许)** — 用户已经明确确认完整收件人列表和内容时,可直接使用 `--confirm-send` 立即发送。
|
|
32
|
+
|
|
33
|
+
**禁止在用户未明确同意的情况下执行发送,无论是发送草稿还是直接使用 `--confirm-send`。**
|
|
34
|
+
|
|
35
|
+
## 命令
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 回复全部(默认保存为草稿)— HTML 推荐
|
|
39
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p><b>已完成</b>,详见下方说明。</p>'
|
|
40
|
+
|
|
41
|
+
# 回复全部并追加收件人/抄送(草稿)
|
|
42
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>同步更新</p>' --to lead@example.com --cc pm@example.com
|
|
43
|
+
|
|
44
|
+
# 从回复名单中排除某些地址(草稿)
|
|
45
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>见上</p>' --remove bot@example.com,noreply@example.com
|
|
46
|
+
|
|
47
|
+
# 回复全部时插入内嵌图片(推荐:直接用相对路径,自动解析)
|
|
48
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>详见图示:<img src="./logo.png" /></p>'
|
|
49
|
+
|
|
50
|
+
# 纯文本回复全部(仅在内容极简时使用)
|
|
51
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '收到,已处理。'
|
|
52
|
+
|
|
53
|
+
# 确认发送(用户明确确认后才可使用)
|
|
54
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>收到,已处理。</p>' --confirm-send
|
|
55
|
+
|
|
56
|
+
# Dry Run(仅打印请求,不发送)
|
|
57
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '测试' --dry-run
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 参数
|
|
61
|
+
|
|
62
|
+
| 参数 | 必填 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| `--message-id <id>` | 是 | 被回复的邮件 ID |
|
|
65
|
+
| `--body <text>` | 是 | 回复正文。推荐使用 HTML 获得富文本排版;也支持纯文本。根据回复正文和原邮件正文自动检测 HTML。使用 `--plain-text` 可强制纯文本模式。支持 `<img src="./local.png" />` 相对路径自动解析为内嵌图片(仅支持相对路径,不支持绝对路径) |
|
|
66
|
+
| `--from <email>` | 否 | 发件人邮箱地址(EML From 头)。使用别名(send_as)发信时,设为别名地址并配合 `--mailbox` 指定所属邮箱。默认读取邮箱主地址 |
|
|
67
|
+
| `--mailbox <email>` | 否 | 邮箱地址,指定草稿所属的邮箱(默认回退到 `--from`,再回退到 `me`)。当发件人(`--from`)与邮箱不同时使用。可通过 `accessible_mailboxes` 查询可用邮箱 |
|
|
68
|
+
| `--to <emails>` | 否 | 额外收件人,多个用逗号分隔(追加到自动聚合结果) |
|
|
69
|
+
| `--cc <emails>` | 否 | 额外抄送,多个用逗号分隔 |
|
|
70
|
+
| `--bcc <emails>` | 否 | 密送邮箱,多个用逗号分隔。与 `--event-*` 不兼容(见 `+send` 日程邀请约束) |
|
|
71
|
+
| `--remove <emails>` | 否 | 从自动聚合结果中排除的邮箱,多个用逗号分隔 |
|
|
72
|
+
| `--plain-text` | 否 | 强制纯文本模式,忽略所有 HTML 自动检测。不可与 `--inline` 同时使用 |
|
|
73
|
+
| `--attach <paths>` | 否 | 附件文件路径,多个用逗号分隔。相对路径。当附件导致 EML 总大小超过 25 MB 时,超出部分自动上传为超大附件(HTML 邮件插入下载卡片,纯文本邮件追加下载链接),单个文件上限 3 GB |
|
|
74
|
+
| `--inline <json>` | 否 | 高级用法:手动指定内嵌图片 CID 映射。推荐直接在 `--body` 中使用 `<img src="./path" />`(自动解析)。仅在需要精确控制 CID 命名时使用此参数。格式:`'[{"cid":"mycid","file_path":"./logo.png"}]'`,在 body 中用 `<img src="cid:mycid">` 引用。不可与 `--plain-text` 同时使用 |
|
|
75
|
+
| `--signature-id <id>` | 否 | 签名 ID。附加邮箱签名到回复正文与引用块之间。运行 `mail +signature` 查看可用签名。不可与 `--plain-text` 同时使用 |
|
|
76
|
+
| `--priority <level>` | 否 | 邮件优先级:`high`、`normal`、`low`。省略或 `normal` 时不设置优先级 |
|
|
77
|
+
| `--event-summary <text>` | 否 | 日程标题。设置此参数即在邮件中嵌入日程邀请。需同时设置 `--event-start` 和 `--event-end` |
|
|
78
|
+
| `--event-start <time>` | 条件必填 | 日程开始时间(ISO 8601) |
|
|
79
|
+
| `--event-end <time>` | 条件必填 | 日程结束时间(ISO 8601) |
|
|
80
|
+
| `--event-location <text>` | 否 | 日程地点 |
|
|
81
|
+
| `--confirm-send` | 否 | 确认发送回复(默认只保存草稿)。仅在用户明确确认后使用 |
|
|
82
|
+
| `--send-time <timestamp>` | 否 | 定时发送时间,Unix 时间戳(秒)。需至少为当前时间 + 5 分钟。配合 `--confirm-send` 使用可定时发送邮件 |
|
|
83
|
+
| `--request-receipt` | 否 | 请求已读回执(RFC 3798 Message Disposition Notification)。在出站 EML 里写 `Disposition-Notification-To: <sender>` 头。收件人的邮件客户端可能弹出提示、自动发送或忽略——送达不保证 |
|
|
84
|
+
| `--dry-run` | 否 | 仅打印请求,不执行 |
|
|
85
|
+
|
|
86
|
+
## 返回值
|
|
87
|
+
|
|
88
|
+
默认(草稿模式):
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"ok": true,
|
|
92
|
+
"data": {
|
|
93
|
+
"draft_id": "草稿ID",
|
|
94
|
+
"tip": "draft saved. To send: lark-cli mail user_mailbox.drafts send --params '{...}'"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`--confirm-send` 模式:
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"ok": true,
|
|
103
|
+
"data": {
|
|
104
|
+
"message_id": "邮件ID",
|
|
105
|
+
"thread_id": "会话ID"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
可选字段:
|
|
111
|
+
|
|
112
|
+
- `automation_send_disable_reason`:发送被邮箱自动化设置拦截时返回的原因
|
|
113
|
+
- `automation_send_disable_reference`:发送被拦截时的草稿打开链接
|
|
114
|
+
|
|
115
|
+
字段语义:
|
|
116
|
+
|
|
117
|
+
- 若返回中包含 `automation_send_disable_reason` / `automation_send_disable_reference`,说明回复全部未真正发出,而是被邮箱设置拦截。此时应直接向用户展示原因和草稿打开链接,不要继续假设已经发送成功
|
|
118
|
+
|
|
119
|
+
## 典型场景
|
|
120
|
+
|
|
121
|
+
### 场景 1:用户说"帮我回复全部说同意"(只创建草稿)
|
|
122
|
+
```bash
|
|
123
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>同意,没有问题。</p>'
|
|
124
|
+
```
|
|
125
|
+
→ 返回 `draft_id`,告诉用户回复全部草稿已创建。
|
|
126
|
+
|
|
127
|
+
### 场景 2:用户说"回复全部说已确认"(需要发送)
|
|
128
|
+
```bash
|
|
129
|
+
# 方式 A: 创建回复全部草稿
|
|
130
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>已确认。</p>'
|
|
131
|
+
# → 返回 draft_id
|
|
132
|
+
|
|
133
|
+
# 向用户确认 "收件人 alice@, bob@, carol@,内容「已确认。」如果你想先看效果,也可以先去飞书邮件里查看草稿。确认发送吗?"
|
|
134
|
+
|
|
135
|
+
# 用户确认后发送
|
|
136
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
137
|
+
|
|
138
|
+
# 方式 B: 用户已明确确认时,直接发送
|
|
139
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>已确认。</p>' --confirm-send
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 场景 3:用户说"下午 3 点回复全部说已确认"(定时发送)
|
|
143
|
+
```bash
|
|
144
|
+
# Step 1: 创建回复全部草稿
|
|
145
|
+
lark-cli mail +reply-all --message-id <邮件ID> --body '<p>已确认。</p>'
|
|
146
|
+
# → 返回 draft_id
|
|
147
|
+
|
|
148
|
+
# Step 2: 向用户确认 "回复全部草稿已创建:收件人 alice@, bob@, carol@,内容「已确认。」定时 <目标时间> 发送。确认吗?"
|
|
149
|
+
|
|
150
|
+
# Step 3: 用户确认后定时发送(send_time 为 Unix 时间戳,需至少当前时间 + 5 分钟)
|
|
151
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}' --data '{"send_time":"<unix_timestamp>"}'
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 场景 4:用户说"等等,先不回复了"(取消定时发送)
|
|
155
|
+
```bash
|
|
156
|
+
# 取消定时发送(取消后邮件变回草稿)
|
|
157
|
+
lark-cli mail user_mailbox.drafts cancel_scheduled_send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
158
|
+
```
|
|
159
|
+
→ 取消成功后邮件恢复为草稿状态,用户可重新编辑或在之后重新发送。
|
|
160
|
+
|
|
161
|
+
## 实现说明
|
|
162
|
+
|
|
163
|
+
- 自动收件人规则:原发件人优先进入 To,原 To/Cc 进入 Cc。
|
|
164
|
+
- 地址会去重(大小写不敏感)。
|
|
165
|
+
- 自动排除当前用户地址(enterprise email),并叠加 `--remove` 规则。
|
|
166
|
+
- 通过 raw EML 维护会话头并尽量复用原 `thread_id`。
|
|
167
|
+
|
|
168
|
+
## 发送后跟进
|
|
169
|
+
|
|
170
|
+
回复发送后,分两种情况处理:
|
|
171
|
+
|
|
172
|
+
- 若返回中有 `automation_send_disable_reason` / `automation_send_disable_reference`:说明发送被邮箱设置拦截,应直接告诉用户原因并提供草稿打开链接,**不要**调用 `send_status`
|
|
173
|
+
|
|
174
|
+
**1. 确认投递状态**(仅立即发送且返回非空 `message_id` 时必须)
|
|
175
|
+
|
|
176
|
+
用返回的 `message_id` 查询投递状态:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
lark-cli mail user_mailbox.messages send_status --params '{"user_mailbox_id":"me","message_id":"<发送返回的 message_id>"}'
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
状态码:1=正在投递, 2=投递失败重试, 3=退信, 4=投递成功, 5=待审批, 6=审批拒绝。向用户简要报告投递结果,异常状态需重点提示。
|
|
183
|
+
|
|
184
|
+
**1b. 定时发送(指定了 `--send-time`)**
|
|
185
|
+
|
|
186
|
+
定时发送不会立即产生 `message_id`,因此 `send_status` 在定时发送成功后会返回"待发送"状态,**不建议在定时发送后立即查询**。可在预定发送时间后再查询。
|
|
187
|
+
|
|
188
|
+
如需取消定时发送:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
lark-cli mail user_mailbox.drafts cancel_scheduled_send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**取消后邮件会变回草稿**,可继续编辑或在之后重新发送。
|
|
195
|
+
|
|
196
|
+
**2. 标记已读**(可选)— 询问用户是否需要将原邮件标记为已读。如果用户同意:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
lark-cli mail user_mailbox.messages batch_modify_message --params '{"user_mailbox_id":"me"}' --data '{"message_ids":["<原邮件ID>"],"remove_label_ids":["UNREAD"]}'
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## 相关命令
|
|
203
|
+
|
|
204
|
+
- `lark-cli mail +reply` — 仅回复发件人
|
|
205
|
+
- `lark-cli mail +forward` — 转发邮件
|
|
206
|
+
- `lark-cli mail user_mailbox.messages get` — 查看邮件详情
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# mail +reply
|
|
2
|
+
|
|
3
|
+
> **前置条件:** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
|
|
4
|
+
|
|
5
|
+
回复指定邮件,自动处理:
|
|
6
|
+
- 主题前缀 `Re: `(已含常见回复前缀时不重复叠加)
|
|
7
|
+
- 默认收件人为原邮件发件人
|
|
8
|
+
- RFC 2822 会话头(`In-Reply-To` / `References`)维护邮件会话
|
|
9
|
+
|
|
10
|
+
> **默认草稿模式**:`+reply` 默认保存为草稿,不会立即发送。如需立即发送,使用 `--confirm-send` 参数(须经用户明确确认)。**优先使用 `+reply` 而不是 `+draft-create` 来创建回复草稿**,因为 `+reply` 会自动处理主题、收件人和会话头。
|
|
11
|
+
|
|
12
|
+
本 skill 对应 shortcut:`lark-cli mail +reply`,内部步骤:
|
|
13
|
+
1. `GET /open-apis/mail/v1/user_mailboxes/me/messages/{message_id}` — 获取原邮件元数据
|
|
14
|
+
2. `GET /open-apis/mail/v1/user_mailboxes/me/profile` — 获取邮箱主地址(`primary_email_address`,填入默认 From 头)
|
|
15
|
+
3. `POST /open-apis/mail/v1/user_mailboxes/me/drafts` — 创建草稿
|
|
16
|
+
4. `POST /open-apis/mail/v1/user_mailboxes/me/drafts/{draft_id}/send` — 发送草稿(仅在指定 `--confirm-send` 时执行)
|
|
17
|
+
|
|
18
|
+
## CRITICAL — 发送工作流(必须遵循)
|
|
19
|
+
|
|
20
|
+
此命令默认**只保存草稿**,不会发送邮件。需要发送时,有两种合规方式:
|
|
21
|
+
|
|
22
|
+
**方式 A(推荐)** — 创建回复草稿(不带 `--confirm-send`):
|
|
23
|
+
```bash
|
|
24
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<回复正文>'
|
|
25
|
+
```
|
|
26
|
+
→ 返回 `draft_id`
|
|
27
|
+
|
|
28
|
+
向用户展示回复摘要(目标邮件、回复内容、收件人);如果用户想先看效果,可引导其去飞书邮件里查看草稿。
|
|
29
|
+
|
|
30
|
+
用户明确同意后,发送该草稿:
|
|
31
|
+
```bash
|
|
32
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<Step 1 返回的 draft_id>"}'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**方式 B(允许)** — 用户已经明确确认回复对象和内容时,可直接使用 `--confirm-send` 立即发送。
|
|
36
|
+
|
|
37
|
+
**禁止在用户未明确同意的情况下执行发送,无论是发送草稿还是直接使用 `--confirm-send`。**
|
|
38
|
+
|
|
39
|
+
## 命令
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 回复一封邮件(默认保存为草稿,返回 draft_id)— HTML 推荐
|
|
43
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p><b>已收到</b>,稍后跟进。</p>'
|
|
44
|
+
|
|
45
|
+
# 回复并追加收件人/抄送(保存为草稿)
|
|
46
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>已处理</p>' --to lead@example.com --cc colleague@example.com
|
|
47
|
+
|
|
48
|
+
# 回复时插入内嵌图片(推荐:直接用相对路径,自动解析)
|
|
49
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>详见图示:<img src="./logo.png" /></p>'
|
|
50
|
+
|
|
51
|
+
# 纯文本回复(仅在内容极简时使用)
|
|
52
|
+
lark-cli mail +reply --message-id <邮件ID> --body '收到,谢谢!'
|
|
53
|
+
|
|
54
|
+
# 指定发件人地址
|
|
55
|
+
lark-cli mail +reply --message-id <邮件ID> --body '收到' --from me@example.com
|
|
56
|
+
|
|
57
|
+
# 确认发送回复(用户明确确认后使用)
|
|
58
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>收到,谢谢!</p>' --confirm-send
|
|
59
|
+
|
|
60
|
+
# Dry Run(仅打印请求,不执行)
|
|
61
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>测试</p>' --dry-run
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 参数
|
|
65
|
+
|
|
66
|
+
| 参数 | 必填 | 说明 |
|
|
67
|
+
|------|------|------|
|
|
68
|
+
| `--message-id <id>` | 是 | 被回复的邮件 ID |
|
|
69
|
+
| `--body <text>` | 是 | 回复正文。推荐使用 HTML 获得富文本排版;也支持纯文本。根据回复正文和原邮件正文自动检测 HTML。使用 `--plain-text` 可强制纯文本模式。支持 `<img src="./local.png" />` 相对路径自动解析为内嵌图片(仅支持相对路径,不支持绝对路径) |
|
|
70
|
+
| `--from <email>` | 否 | 发件人邮箱地址(EML From 头)。使用别名(send_as)发信时,设为别名地址并配合 `--mailbox` 指定所属邮箱。默认读取邮箱主地址 |
|
|
71
|
+
| `--mailbox <email>` | 否 | 邮箱地址,指定草稿所属的邮箱(默认回退到 `--from`,再回退到 `me`)。当发件人(`--from`)与邮箱不同时使用。可通过 `accessible_mailboxes` 查询可用邮箱 |
|
|
72
|
+
| `--to <emails>` | 否 | 额外收件人,多个用逗号分隔(追加到原发件人) |
|
|
73
|
+
| `--cc <emails>` | 否 | 抄送邮箱,多个用逗号分隔 |
|
|
74
|
+
| `--bcc <emails>` | 否 | 密送邮箱,多个用逗号分隔。与 `--event-*` 不兼容(见 `+send` 日程邀请约束) |
|
|
75
|
+
| `--plain-text` | 否 | 强制纯文本模式,忽略所有 HTML 自动检测。不可与 `--inline` 同时使用 |
|
|
76
|
+
| `--attach <paths>` | 否 | 附件文件路径,多个用逗号分隔。相对路径。当附件导致 EML 总大小超过 25 MB 时,超出部分自动上传为超大附件(HTML 邮件插入下载卡片,纯文本邮件追加下载链接),单个文件上限 3 GB |
|
|
77
|
+
| `--inline <json>` | 否 | 高级用法:手动指定内嵌图片 CID 映射。推荐直接在 `--body` 中使用 `<img src="./path" />`(自动解析)。仅在需要精确控制 CID 命名时使用此参数。格式:`'[{"cid":"mycid","file_path":"./logo.png"}]'`,在 body 中用 `<img src="cid:mycid">` 引用。不可与 `--plain-text` 同时使用 |
|
|
78
|
+
| `--signature-id <id>` | 否 | 签名 ID。附加邮箱签名到回复正文与引用块之间。运行 `mail +signature` 查看可用签名。不可与 `--plain-text` 同时使用 |
|
|
79
|
+
| `--priority <level>` | 否 | 邮件优先级:`high`、`normal`、`low`。省略或 `normal` 时不设置优先级 |
|
|
80
|
+
| `--event-summary <text>` | 否 | 日程标题。设置此参数即在邮件中嵌入日程邀请。需同时设置 `--event-start` 和 `--event-end` |
|
|
81
|
+
| `--event-start <time>` | 条件必填 | 日程开始时间(ISO 8601) |
|
|
82
|
+
| `--event-end <time>` | 条件必填 | 日程结束时间(ISO 8601) |
|
|
83
|
+
| `--event-location <text>` | 否 | 日程地点 |
|
|
84
|
+
| `--confirm-send` | 否 | 确认发送回复(默认只保存草稿)。仅在用户明确确认后使用 |
|
|
85
|
+
| `--send-time <timestamp>` | 否 | 定时发送时间,Unix 时间戳(秒)。需至少为当前时间 + 5 分钟。配合 `--confirm-send` 使用可定时发送邮件 |
|
|
86
|
+
| `--request-receipt` | 否 | 请求已读回执(RFC 3798 Message Disposition Notification)。在出站 EML 里写 `Disposition-Notification-To: <sender>` 头。收件人的邮件客户端可能弹出提示、自动发送或忽略——送达不保证 |
|
|
87
|
+
| `--dry-run` | 否 | 仅打印请求,不执行 |
|
|
88
|
+
|
|
89
|
+
## 返回值
|
|
90
|
+
|
|
91
|
+
默认(草稿模式):
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"ok": true,
|
|
95
|
+
"data": {
|
|
96
|
+
"draft_id": "草稿ID",
|
|
97
|
+
"tip": "draft saved. To send: lark-cli mail user_mailbox.drafts send --params '{...}'"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`--confirm-send` 模式(发送成功):
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"ok": true,
|
|
106
|
+
"data": {
|
|
107
|
+
"message_id": "邮件ID",
|
|
108
|
+
"thread_id": "会话ID"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
可选字段:
|
|
114
|
+
|
|
115
|
+
- `automation_send_disable_reason`:发送被邮箱自动化设置拦截时返回的原因
|
|
116
|
+
- `automation_send_disable_reference`:发送被拦截时的草稿打开链接
|
|
117
|
+
|
|
118
|
+
字段语义:
|
|
119
|
+
|
|
120
|
+
- 若返回中包含 `automation_send_disable_reason` / `automation_send_disable_reference`,说明回复未真正发出,而是被邮箱设置拦截。此时应直接向用户展示原因和草稿打开链接,不要继续假设已经发送成功
|
|
121
|
+
|
|
122
|
+
## 典型场景
|
|
123
|
+
|
|
124
|
+
### 场景 1:用户说"帮我写个回复草稿"(只创建草稿)
|
|
125
|
+
```bash
|
|
126
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>收到,谢谢!</p>'
|
|
127
|
+
```
|
|
128
|
+
→ 返回 `draft_id`,告诉用户回复草稿已创建。**注意:用 `+reply` 而不是 `+draft-create`**,这样草稿会自动关联原邮件的主题、收件人和会话头。
|
|
129
|
+
|
|
130
|
+
### 场景 2:用户说"回复这封邮件说已处理"(需要发送)
|
|
131
|
+
```bash
|
|
132
|
+
# 方式 A: 创建回复草稿
|
|
133
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>已处理,谢谢。</p>'
|
|
134
|
+
# → 返回 draft_id
|
|
135
|
+
|
|
136
|
+
# 向用户确认 "回复给 alice@example.com,内容「已处理,谢谢。」如果你想先看效果,也可以先去飞书邮件里查看草稿。确认发送吗?"
|
|
137
|
+
|
|
138
|
+
# 用户确认后发送
|
|
139
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
140
|
+
|
|
141
|
+
# 方式 B: 用户已明确确认时,直接发送
|
|
142
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>已处理,谢谢。</p>' --confirm-send
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 场景 3:用户说"下午 3 点回复这封邮件说已处理"(定时发送)
|
|
146
|
+
```bash
|
|
147
|
+
# Step 1: 创建回复草稿
|
|
148
|
+
lark-cli mail +reply --message-id <邮件ID> --body '<p>已处理,谢谢。</p>'
|
|
149
|
+
# → 返回 draft_id
|
|
150
|
+
|
|
151
|
+
# Step 2: 向用户确认 "回复草稿已创建:回复给 alice@example.com,内容「已处理,谢谢。」定时 <目标时间> 发送。确认吗?"
|
|
152
|
+
|
|
153
|
+
# Step 3: 用户确认后定时发送(send_time 为 Unix 时间戳,需至少当前时间 + 5 分钟)
|
|
154
|
+
lark-cli mail user_mailbox.drafts send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}' --data '{"send_time":"<unix_timestamp>"}'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 场景 4:用户说"等等,先不回复了"(取消定时发送)
|
|
158
|
+
```bash
|
|
159
|
+
# 取消定时发送(取消后邮件变回草稿)
|
|
160
|
+
lark-cli mail user_mailbox.drafts cancel_scheduled_send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
161
|
+
```
|
|
162
|
+
→ 取消成功后邮件恢复为草稿状态,用户可重新编辑或在之后重新发送。
|
|
163
|
+
|
|
164
|
+
## 实现说明
|
|
165
|
+
|
|
166
|
+
### 会话维护
|
|
167
|
+
|
|
168
|
+
本 shortcut 通过 raw EML 方式发送,包含标准 RFC 2822 会话头:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
In-Reply-To: <原邮件smtp_message_id>
|
|
172
|
+
References: <原邮件references + smtp_message_id>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
若原邮件有 `thread_id`,发送时会一并传入,确保回复归入同一会话。
|
|
176
|
+
|
|
177
|
+
### 收件人与引用
|
|
178
|
+
|
|
179
|
+
- 默认回复给原邮件发件人(`head_from`)
|
|
180
|
+
- `--to` 会在默认收件人基础上追加
|
|
181
|
+
- 自动拼接引用块(纯文本或 HTML)
|
|
182
|
+
|
|
183
|
+
## 发送后跟进
|
|
184
|
+
|
|
185
|
+
回复发送后,分两种情况处理:
|
|
186
|
+
|
|
187
|
+
- 若返回中有 `automation_send_disable_reason` / `automation_send_disable_reference`:说明发送被邮箱设置拦截,应直接告诉用户原因并提供草稿打开链接,**不要**调用 `send_status`
|
|
188
|
+
|
|
189
|
+
**1. 确认投递状态**(仅立即发送且返回非空 `message_id` 时必须)
|
|
190
|
+
|
|
191
|
+
用返回的 `message_id` 查询投递状态:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
lark-cli mail user_mailbox.messages send_status --params '{"user_mailbox_id":"me","message_id":"<发送返回的 message_id>"}'
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
状态码:1=正在投递, 2=投递失败重试, 3=退信, 4=投递成功, 5=待审批, 6=审批拒绝。向用户简要报告投递结果,异常状态需重点提示。
|
|
198
|
+
|
|
199
|
+
**1b. 定时发送(指定了 `--send-time`)**
|
|
200
|
+
|
|
201
|
+
定时发送不会立即产生 `message_id`,因此 `send_status` 在定时发送成功后会返回"待发送"状态,**不建议在定时发送后立即查询**。可在预定发送时间后再查询。
|
|
202
|
+
|
|
203
|
+
如需取消定时发送:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
lark-cli mail user_mailbox.drafts cancel_scheduled_send --params '{"user_mailbox_id":"me","draft_id":"<draft_id>"}'
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**取消后邮件会变回草稿**,可继续编辑或在之后重新发送。
|
|
210
|
+
|
|
211
|
+
**2. 标记已读**(可选)— 询问用户是否需要将原邮件标记为已读。如果用户同意:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
lark-cli mail user_mailbox.messages batch_modify_message --params '{"user_mailbox_id":"me"}' --data '{"message_ids":["<原邮件ID>"],"remove_label_ids":["UNREAD"]}'
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 编辑回复草稿
|
|
218
|
+
|
|
219
|
+
`+reply` 创建的草稿正文包含引用区(原邮件的引用块)。如果需要编辑回复草稿的正文,**必须通过 `--patch-file` 使用 `set_reply_body` op**,它仅替换用户撰写部分,自动保留引用区。value 只传新的用户撰写内容,不要包含引用区。
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# 编辑回复草稿正文(自动保留引用区)
|
|
223
|
+
cat > ./patch.json << 'EOF'
|
|
224
|
+
{ "ops": [{ "op": "set_reply_body", "value": "<p>修改后的回复内容</p>" }] }
|
|
225
|
+
EOF
|
|
226
|
+
lark-cli mail +draft-edit --draft-id <draft_id> --patch-file ./patch.json
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
如果用户要修改引用区内容或去掉引用区,则使用 `set_body` 全量替换。
|
|
230
|
+
|
|
231
|
+
## 注意事项
|
|
232
|
+
|
|
233
|
+
- 需要已登录(`lark-cli auth login --scope "mail:user_mailbox.message:modify mail:user_mailbox.message:readonly mail:user_mailbox:readonly"`)且具备写/读邮件权限
|
|
234
|
+
- 邮件 ID 可从 `lark-cli mail user_mailbox.messages list` 获取
|
|
235
|
+
- `--bcc` 仅在发送链路中生效,通常不会在收件方看到
|
|
236
|
+
|
|
237
|
+
## 相关命令
|
|
238
|
+
|
|
239
|
+
- `lark-cli mail user_mailbox.messages list` — 列出邮件
|
|
240
|
+
- `lark-cli mail user_mailbox.messages get` — 读取邮件详情
|
|
241
|
+
- `lark-cli mail +reply-all` — 回复全部
|
|
242
|
+
- `lark-cli mail +forward` — 转发邮件
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<link rel="icon" href="favicon.ico" />
|
|
7
|
+
<title></title>
|
|
8
|
+
<style>
|
|
9
|
+
* {
|
|
10
|
+
box-sizing: border-box;
|
|
11
|
+
padding: 0;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.open-platform-wrapper {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
height: 100vh;
|
|
21
|
+
background-color: #ffffff;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.open-platform-icon {
|
|
25
|
+
width: 120px;
|
|
26
|
+
height: 120px;
|
|
27
|
+
display: block;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.open-platform-desc {
|
|
31
|
+
margin-top: 16px;
|
|
32
|
+
line-height: 22px;
|
|
33
|
+
font-size: 14px;
|
|
34
|
+
color: #646a73;
|
|
35
|
+
text-align: center
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.open-platform-back {
|
|
39
|
+
border-radius: 6px;
|
|
40
|
+
font-size: 14px;
|
|
41
|
+
height: 32px;
|
|
42
|
+
line-height: 22px;
|
|
43
|
+
min-width: 80px;
|
|
44
|
+
padding: 4px 11px;
|
|
45
|
+
text-align: center;
|
|
46
|
+
text-decoration: none;
|
|
47
|
+
touch-action: manipulation;
|
|
48
|
+
transition: color .1s ease-in, background-color .1s ease-in, border-color .1s ease-in, width .2s ease-in;
|
|
49
|
+
user-select: none;
|
|
50
|
+
white-space: nowrap;
|
|
51
|
+
background: #1456f0;
|
|
52
|
+
border: 1px solid #1456f0;
|
|
53
|
+
color: #ffffff;
|
|
54
|
+
margin-top: 16px;
|
|
55
|
+
}
|
|
56
|
+
</style>
|
|
57
|
+
</head>
|
|
58
|
+
<body>
|
|
59
|
+
<div class="open-platform-wrapper">
|
|
60
|
+
<img class="open-platform-icon"
|
|
61
|
+
src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgdmlld0JveD0iMCAwIDEyMCAxMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyLjkxMyA1NS4yNDRjLTUuNjMyIDIuOTUtOC4yNDYgNi4yODQtOC4yNDYgOS40NHY5LjcyYzAtMy4xNTYgMi42MTQtNi40OSA4LjI0Ni05LjQ0di05LjcyWm05NC4xNjMtMTIuMDg0di05LjcyNmM1LjkzNC0zLjE5IDguOTgxLTYuODkxIDguOTgxLTEwLjcyNXY5LjcyYzAgMy44NC0zLjA0NyA3LjU0My04Ljk4MSAxMC43MzJaIiBmaWxsPSIjMEMyOTZFIi8+PHBhdGggZD0iTTYwLjIyOSAxOS4wNTkgNDguNzMgNDkuOTIyIDYwLjM2NSA3Mi45MmwtOC40NzQgMjMuODczSDE2LjkyM2E0IDQgMCAwIDEtNC00VjIzLjA2YTQgNCAwIDAgMSA0LTRINjAuMjNaIiBmaWxsPSIjQkJCRkM0IiBmaWxsLW9wYWNpdHk9Ii40NSIvPjxwYXRoIGQ9Ik03MS40MDggMTkuMDU5IDYwLjAxMyA0OS45MjIgNzEuNDYgNzIuOTJsLTguMzI1IDIzLjg3M2gzOS45NDNhNCA0IDAgMCAwIDQtNFYyMy4wNmE0IDQgMCAwIDAtNC00aC0zMS42N1oiIGZpbGw9IiNCQkJGQzQiIGZpbGwtb3BhY2l0eT0iLjQ1Ii8+PHBhdGggZD0iTTIxLjkyMyAyNi4xYTIgMiAwIDEgMSAwIDQgMiAyIDAgMCAxIDAtNFptMyAyYTMgMyAwIDEgMC02IDAgMyAzIDAgMCAwIDYgMFptNi45MTUtMmEyIDIgMCAxIDEgMCA0IDIgMiAwIDAgMSAwLTRabTMgMmEzIDMgMCAxIDAtNiAwIDMgMyAwIDAgMCA2IDBabS0xNS43NjMgNy4zOTRhLjUuNSAwIDAgMSAuNS0uNWgzMS41ODFhLjUuNSAwIDAgMSAwIDFIMTkuNTc1YS41LjUgMCAwIDEtLjUtLjVabTQ4LjQ3NyAwYS41LjUgMCAwIDEgLjUtLjVoMzIuNDY1YS41LjUgMCAwIDEgMCAxSDY4LjA1MmEuNS41IDAgMCAxLS41LS41WiIgZmlsbD0iIzhGOTU5RSIvPjxwYXRoIGQ9Ik05OCAxMTFjOS45NDEgMCAxOC04LjA1OSAxOC0xOHMtOC4wNTktMTgtMTgtMThjLTkuOTQyIDAtMTggOC4wNTktMTggMThzOC4wNTggMTggMTggMThaIiBmaWxsPSIjRjgwIi8+PHBhdGggZD0iTTk3LjE4MSA4NC44MThhLjgxOC44MTggMCAwIDAtLjgxOC44MTl2OS44MThjMCAuNDUyLjM2Ni44MTguODE4LjgxOGgxLjYzN2EuODE4LjgxOCAwIDAgMCAuODE4LS44MTh2LTkuODE5YS44MTguODE4IDAgMCAwLS44MTgtLjgxOEg5Ny4xOFptMCAxMy4wOTJhLjgxOC44MTggMCAwIDAtLjgxOC44MTh2MS42MzZjMCAuNDUyLjM2Ni44MTguODE4LjgxOGgxLjYzN2EuODE4LjgxOCAwIDAgMCAuODE4LS44MTh2LTEuNjM2YS44MTguODE4IDAgMCAwLS44MTgtLjgxOUg5Ny4xOFoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNC4wMjcgODUuMzFjMi40OSA1LjUxIDE0Ljc3IDkuOTQgNDEuNDUgOS45M3Y5LjcyMWMtMjYuNjguMDEtMzguOTYtNC40Mi00MS40NS05Ljkzdi05LjcyWm04NC44MS0yNy4yN2MxNy41Mi0yLjY5IDI1LjgwNy03LjAyNiAyNy4yLTExLjcxdjkuNzJjLS4zMyA0LjY3LTkuNjggOS4wMi0yNy4yIDExLjcxdi05LjcyWiIgZmlsbD0iIzMzNzBGRiIvPjxwYXRoIGQ9Ik04OS4yMzcgMTMuMDFjMTguMDU4IDAgMjYuOCAzLjI1IDI2LjggOS43MnY5LjcyYzAtNi40Ny04Ljc0Mi05LjcyLTI2LjgtOS43MnYtOS43MlptLTg0LjU3IDUxLjdjMCA2LjYgMTEuMzcgMTIuNDUgMzAuNDcgMTIuNDR2OS43MmMtMTkuMSAwLTMwLjQ3LTUuODQtMzAuNDctMTIuNDR2LTkuNzJaIiBmaWxsPSIjMDBENkI5Ii8+PC9zdmc+"
|
|
62
|
+
alt="">
|
|
63
|
+
<div class="open-platform-desc">The page does not exist.</div>
|
|
64
|
+
<a class="open-platform-back" href="/">Go to homepage</a>
|
|
65
|
+
</div>
|
|
66
|
+
<script>window.gfdatav1={"env":"prod","ver":"1.0.0.13","canary":0,"garrModules":null,"envName":"prod","region":"CN","idc":"lf","webServerCodeType":"DeployServerlessWebServer","runtime":"node","extra":{"canaryType":null}}</script><script>
|
|
67
|
+
|
|
68
|
+
function parseQueryString(queryString) {
|
|
69
|
+
// 移除开头的 "?"
|
|
70
|
+
if (queryString.charAt(0) === '?') {
|
|
71
|
+
queryString = queryString.substring(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
var params = {};
|
|
75
|
+
if (!queryString) return params;
|
|
76
|
+
|
|
77
|
+
// 分割参数对
|
|
78
|
+
var paramPairs = queryString.split('&');
|
|
79
|
+
|
|
80
|
+
for (var i = 0; i < paramPairs.length; i++) {
|
|
81
|
+
var paramPair = paramPairs[i].split('=');
|
|
82
|
+
var key = decodeURIComponent(paramPair[0]);
|
|
83
|
+
var value = paramPair.length > 1 ? decodeURIComponent(paramPair[1]) : '';
|
|
84
|
+
|
|
85
|
+
// 处理重复参数(转为数组)
|
|
86
|
+
if (params[key] === undefined) {
|
|
87
|
+
params[key] = value;
|
|
88
|
+
} else if (!Array.isArray(params[key])) {
|
|
89
|
+
params[key] = [params[key], value];
|
|
90
|
+
} else {
|
|
91
|
+
params[key].push(value);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return params;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function getLocale() {
|
|
99
|
+
var zhLang = 'zh-CN';
|
|
100
|
+
var enLang = 'en-US';
|
|
101
|
+
|
|
102
|
+
var queryLang = parseQueryString(window.location.search).lang;
|
|
103
|
+
var cookieLang = getCookieLocale();
|
|
104
|
+
var lang = enLang;
|
|
105
|
+
|
|
106
|
+
<!--从cookie中取值-->
|
|
107
|
+
function getCookieLocale() {
|
|
108
|
+
var locale = '';
|
|
109
|
+
var cookies = document.cookie.split('; ');
|
|
110
|
+
var loclaeKey = 'open_locale';
|
|
111
|
+
|
|
112
|
+
for (var i = 0; i < cookies.length; i++) {
|
|
113
|
+
var cookie = cookies[i].trim();
|
|
114
|
+
var cookieArr = cookie.split('=');
|
|
115
|
+
if (cookieArr[0] === loclaeKey) {
|
|
116
|
+
locale = cookieArr[1];
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return locale;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function setLocaleCookie(lang) {
|
|
124
|
+
var date = new Date();
|
|
125
|
+
// 300天到期
|
|
126
|
+
date.setTime(date.getTime() + (300 * 24 * 60 * 60 * 1000));
|
|
127
|
+
var expires = 'expires=' + date.toUTCString();
|
|
128
|
+
document.cookie = 'open_locale=' + lang + '; ' + expires + '; path=/;';
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 获取浏览器默认语言
|
|
132
|
+
if (navigator.language.indexOf('en') !== -1) {
|
|
133
|
+
lang = enLang;
|
|
134
|
+
} else if (navigator.language.indexOf('zh') !== -1) {
|
|
135
|
+
lang = zhLang;
|
|
136
|
+
}
|
|
137
|
+
if (cookieLang === enLang) {
|
|
138
|
+
lang = enLang;
|
|
139
|
+
} else if (cookieLang === zhLang) {
|
|
140
|
+
lang = zhLang;
|
|
141
|
+
}
|
|
142
|
+
if (queryLang === enLang) {
|
|
143
|
+
lang = enLang;
|
|
144
|
+
} else if (queryLang === zhLang) {
|
|
145
|
+
lang = zhLang;
|
|
146
|
+
}
|
|
147
|
+
// 设置cookie
|
|
148
|
+
setLocaleCookie(lang);
|
|
149
|
+
return lang;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 根据域名获取当前brand
|
|
153
|
+
function isLarkDomain() {
|
|
154
|
+
var defaultBrandMap = {
|
|
155
|
+
lark: ['larksuite'],
|
|
156
|
+
feishu: ['feishu', 'larkoffice', 'larkenterprise'],
|
|
157
|
+
};
|
|
158
|
+
const { hostname } = window.location;
|
|
159
|
+
|
|
160
|
+
if (defaultBrandMap.feishu.some((item) => hostname.includes(item))) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (defaultBrandMap.lark.some((item) => hostname.includes(item))) {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (window.domainBrand) {
|
|
169
|
+
return window.domainBrand === 'lark';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
var isLarkBrand = isLarkDomain();
|
|
176
|
+
|
|
177
|
+
var config = {
|
|
178
|
+
'zh-CN': {
|
|
179
|
+
'desc': '抱歉,您访问的页面不存在',
|
|
180
|
+
'back': '返回首页',
|
|
181
|
+
'title': (isLarkBrand ? 'Lark' : '飞书') + '开放平台',
|
|
182
|
+
},
|
|
183
|
+
'en-US': {
|
|
184
|
+
'desc': 'The page does not exist.',
|
|
185
|
+
'back': 'Go to homepage',
|
|
186
|
+
'title': (isLarkBrand ? 'Lark': 'Feishu') + ' Open Platform',
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
var locale = getLocale();
|
|
190
|
+
var descObj = document.querySelector('.open-platform-desc');
|
|
191
|
+
var backObj = document.querySelector('.open-platform-back');
|
|
192
|
+
descObj.innerHTML = config[locale].desc;
|
|
193
|
+
backObj.innerHTML = config[locale].back;
|
|
194
|
+
document.title = config[locale].title;
|
|
195
|
+
|
|
196
|
+
</script>
|
|
197
|
+
</body>
|
|
198
|
+
</html>
|