{"id":44975909,"url":"https://github.com/k-l-lambda/chrome-wechat-md","last_synced_at":"2026-02-18T17:04:32.202Z","repository":{"id":333483711,"uuid":"1137497511","full_name":"k-l-lambda/chrome-wechat-md","owner":"k-l-lambda","description":"Wechat MP markdown publish chrome extension","archived":false,"fork":false,"pushed_at":"2026-02-01T16:07:12.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-01T23:47:25.756Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/k-l-lambda.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-19T12:54:39.000Z","updated_at":"2026-02-01T16:07:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/k-l-lambda/chrome-wechat-md","commit_stats":null,"previous_names":["k-l-lambda/chrome-wechat-md"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/k-l-lambda/chrome-wechat-md","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k-l-lambda%2Fchrome-wechat-md","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k-l-lambda%2Fchrome-wechat-md/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k-l-lambda%2Fchrome-wechat-md/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k-l-lambda%2Fchrome-wechat-md/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/k-l-lambda","download_url":"https://codeload.github.com/k-l-lambda/chrome-wechat-md/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/k-l-lambda%2Fchrome-wechat-md/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29587066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T16:55:40.614Z","status":"ssl_error","status_checked_at":"2026-02-18T16:55:37.558Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-18T17:04:30.733Z","updated_at":"2026-02-18T17:04:32.176Z","avatar_url":"https://github.com/k-l-lambda.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WeChat Markdown Publisher\n\n最小权限设计的微信公众号 Markdown 发布扩展\n\n## 特点\n\n✅ **最小权限** - 仅需微信公众号域名访问权限\n✅ **无 CSP 问题** - 纯 Content Script 实现，无 Service Worker\n✅ **简单易用** - 在微信公众号后台直接使用\n✅ **自动认证** - 读取浏览器登录态，无需手动配置\n\n## 权限说明\n\n```json\n{\n  \"permissions\": [\"storage\", \"activeTab\"],\n  \"host_permissions\": [\"https://mp.weixin.qq.com/*\"]\n}\n```\n\n- `storage` - 存储用户设置和 Markdown 模板\n- `activeTab` - 访问当前标签页（用户主动触发）\n- `https://mp.weixin.qq.com/*` - 仅微信公众号后台\n\n**对比完整版 Wechatsync:**\n- 原版需要: `http://*/*` + `https://*/*` (所有网站)\n- 本扩展: 仅微信域名 (**减少 95% 权限范围**)\n\n## 安装\n\n### 加载未打包扩展 (推荐)\n\n1. 打开 Chrome: `chrome://extensions`\n2. 启用 \"开发者模式\"\n3. 点击 \"加载已解压的扩展程序\"\n4. 选择此目录\n\n## 使用方法\n\n1. 登录微信公众号后台: https://mp.weixin.qq.com/\n2. 点击浏览器工具栏中的扩展图标\n3. 在弹出窗口中:\n   - 粘贴 Markdown 内容\n   - 或从文件选择 `.md` 文件\n4. 点击\"发布到草稿箱\"\n5. 等待处理完成，获取草稿链接\n\n## 功能\n\n### ✅ 已实现\n- Markdown → HTML 转换 (marked.js)\n- CSS 样式内联 (juice.js)\n- 图片自动上传到微信 CDN\n- 发布到微信草稿箱\n- 实时进度显示\n\n### 🚧 计划中\n- LaTeX 数学公式支持\n- 代码块语法高亮\n- 自定义样式模板\n- 草稿管理功能\n\n## 技术架构\n\n### Content Script Only 设计\n\n```\n用户访问 mp.weixin.qq.com\n    ↓\nContent Script 自动注入\n    ↓\n读取 document.cookie (获取 token)\n    ↓\n直接调用微信 API (fetch)\n    ↓\n无需 Background Service Worker\n```\n\n**优势:**\n- ✅ 避免 CSP 限制 (无 eval/Function)\n- ✅ 直接访问页面上下文\n- ✅ 无消息传递开销\n- ✅ 实现简单，易维护\n\n## 项目结构\n\n```\nwechat-md-extension/\n├── manifest.json           # 扩展配置（最小权限）\n├── icons/                  # 扩展图标\n│   ├── icon-16.png\n│   ├── icon-48.png\n│   └── icon-128.png\n├── popup/                  # 弹出界面\n│   ├── popup.html\n│   ├── popup.js\n│   └── popup.css\n├── content/                # Content Script\n│   ├── publisher.js        # 核心发布逻辑\n│   └── ui.css             # 注入的 UI 样式\n├── lib/                    # 第三方库\n│   ├── marked.min.js      # Markdown 解析器\n│   └── juice.browser.min.js  # CSS 内联工具\n└── README.md\n```\n\n## 核心代码\n\n### Markdown 转换\n\n```javascript\n// 使用 marked.js 解析 Markdown\nconst html = marked.parse(markdown)\n\n// 使用 juice 内联 CSS 样式\nconst WEIXIN_CSS = `\n  p { color: rgb(51,51,51); font-size: 15px; line-height: 1.75em; }\n  h1 { font-size: 1.25em; font-weight: bold; }\n  ...\n`\nconst styledHtml = juice.inlineContent(`\u003csection\u003e${html}\u003c/section\u003e`, WEIXIN_CSS)\n```\n\n### 图片上传\n\n```javascript\nasync function uploadImage(imageUrl) {\n  const blob = await fetch(imageUrl).then(r =\u003e r.blob())\n  const formData = new FormData()\n  formData.append('file', blob, 'image.jpg')\n\n  const response = await fetch(\n    `https://mp.weixin.qq.com/cgi-bin/filetransfer?action=upload_material\u0026token=${token}`,\n    { method: 'POST', body: formData }\n  )\n\n  const { cdn_url } = await response.json()\n  return cdn_url\n}\n```\n\n### 发布文章\n\n```javascript\nasync function publishArticle(title, content) {\n  const formData = new URLSearchParams({\n    token,\n    title0: title,\n    content0: content,\n    auto_gen_digest0: '1',\n    // ... 其他参数\n  })\n\n  const response = await fetch(\n    'https://mp.weixin.qq.com/cgi-bin/operate_appmsg?sub=create',\n    {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n      body: formData\n    }\n  )\n\n  const { appMsgId } = await response.json()\n  return `https://mp.weixin.qq.com/cgi-bin/appmsg?appmsgid=${appMsgId}`\n}\n```\n\n## 对比其他方案\n\n| 方案 | 权限 | CSP 安全 | 实现复杂度 |\n|------|------|---------|----------|\n| **本扩展 (Content Script)** | ✅ 最小 | ✅ 是 | ✅ 低 |\n| Wechatsync (MV2) | ❌ 全域 | ⚠️ 需 eval | ⚠️ 中 |\n| Node.js CLI | ✅ 无 | ✅ 是 | ⚠️ 中 |\n\n## 故障排除\n\n### 扩展无法加载\n- 检查 Chrome 版本 (需 v88+)\n- 确认已启用开发者模式\n\n### 无法发布文章\n- 确认已登录微信公众号后台\n- 检查浏览器控制台错误信息\n- 验证 token 是否有效\n\n### 图片上传失败\n- 检查图片 URL 是否可访问\n- 验证图片大小 (微信限制 10MB)\n\n## 开发\n\n### 调试\n\n1. 访问 `chrome://extensions`\n2. 找到此扩展，点击\"检查视图\"\n3. 在微信后台页面，按 F12 查看 Content Script 日志\n\n### 修改代码\n\n修改后需重新加载扩展:\n1. 在 `chrome://extensions` 点击刷新按钮\n2. 或者 Ctrl+R 重新加载页面\n\n## 许可证\n\nMIT License\n\n## 相关项目\n\n- [Wechatsync](https://github.com/wechatsync/Wechatsync) - 多平台同步扩展\n- [marked](https://github.com/markedjs/marked) - Markdown 解析器\n- [juice](https://github.com/Automattic/juice) - CSS 内联工具\n\n## 贡献\n\n欢迎提交 Issue 和 Pull Request！\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk-l-lambda%2Fchrome-wechat-md","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fk-l-lambda%2Fchrome-wechat-md","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fk-l-lambda%2Fchrome-wechat-md/lists"}