{"id":31565486,"url":"https://github.com/corhyam/slack-channel-archive-tool","last_synced_at":"2026-04-17T13:33:05.180Z","repository":{"id":307438679,"uuid":"1027599815","full_name":"corhyam/slack-channel-archive-tool","owner":"corhyam","description":"Slack Channel Archive Tool / Slack Channel 归档工具","archived":false,"fork":false,"pushed_at":"2025-08-01T08:05:59.000Z","size":6018,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-05T07:11:51.893Z","etag":null,"topics":["archive-channel","private-channels","slack","slack-bot"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/corhyam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2025-07-28T08:54:14.000Z","updated_at":"2025-08-01T08:05:19.000Z","dependencies_parsed_at":"2025-07-31T10:06:29.930Z","dependency_job_id":null,"html_url":"https://github.com/corhyam/slack-channel-archive-tool","commit_stats":null,"previous_names":["corhyam/slack-channel-archive-tool"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/corhyam/slack-channel-archive-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/corhyam%2Fslack-channel-archive-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/corhyam%2Fslack-channel-archive-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/corhyam%2Fslack-channel-archive-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/corhyam%2Fslack-channel-archive-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/corhyam","download_url":"https://codeload.github.com/corhyam/slack-channel-archive-tool/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/corhyam%2Fslack-channel-archive-tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31931455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T12:37:54.787Z","status":"ssl_error","status_checked_at":"2026-04-17T12:37:25.095Z","response_time":62,"last_error":"SSL_read: 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":["archive-channel","private-channels","slack","slack-bot"],"created_at":"2025-10-05T07:08:15.145Z","updated_at":"2026-04-17T13:33:05.164Z","avatar_url":"https://github.com/corhyam.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Slack 私有频道归档工具\n\n\u003cdiv align=\"center\"\u003e\n\n[![Node.js Version](https://img.shields.io/badge/Node-%3E%3D18.17.0-brightgreen)](https://nodejs.org/)\n[![Express](https://img.shields.io/badge/Express-4.x-blue.svg)](https://expressjs.com/)\n[![JavaScript](https://img.shields.io/badge/JavaScript-ES6+-yellow.svg)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n[![CSS3](https://img.shields.io/badge/CSS3-3.x-1572B6.svg)](https://developer.mozilla.org/en-US/docs/Web/CSS)\n[![Slack API](https://img.shields.io/badge/Slack%20API-Web%20API-orange.svg)](https://api.slack.com/)\n\n[![English](https://img.shields.io/badge/Language-English-blue?style=for-the-badge)](README_EN.md)\n[![中文](https://img.shields.io/badge/Language-中文-green?style=for-the-badge)](README.md)\n\n\u003c/div\u003e\n\nSlack Private Channel 归档工具，帮助用户安全地归档 Slack 私有频道。该工具提供支持 OAuth 授权、频道列表查看、批量选择和归档操作。\n\n## 默认配置说明\n\n**当前默认版本为归档 Private Channel 且列表仅过滤出授权者创建的 channel，具体需要操作私有频道或公共频道，可根据需求自己配置。**\n\n\u003e 💡 **配置提示**：如需修改频道类型或过滤条件，请参考 [配置说明文档](CONFIGURATION.md) 进行自定义设置。\n\n## 功能特性\n\n- 🔐 **安全的 OAuth 授权** - 使用 Slack OAuth 2.0 流程，无需手动输入 token\n- 📋 **频道列表管理** - 显示所有私有频道，包含成员数量、创建时间等信息、（可配置 public channel，但日常 public channel 可通过 bot token 进行管理）\n- ✅ **批量选择** - 支持全选/取消全选，方便批量操作\n- 🗄️ **一键归档** - 安全地归档选中的频道\n- 📊 **操作结果反馈** - 详细的成功/失败结果展示\n- 🎨 **UI** - 响应式设计，支持移动端访问\n- ⚡ **实时状态** - 显示频道状态（活跃/已归档）\n\n## 页面展示\n\n### 主页面\n![主页面第三版](screenshots/index_third_version.png)\n**当前版本** - 采用Slack品牌配色方案，白色背景配合紫色渐变头部。\n\n![主页面第二版](screenshots/index_second_version.png)\n![主页面第一版](screenshots/index_first_version.png)\n应用的主页面，提供Slack授权入口和功能介绍。\n\n### 频道列表\n![频道列表](screenshots/channel_lists.png)\n显示所有可归档的私有频道，支持批量选择和查看频道详细信息。\n\n### 确认归档\n![确认归档](screenshots/confirm_archive.png)\n归档操作前的确认页面，显示选中的频道列表供用户最终确认。\n\n### 归档结果\n![归档结果](screenshots/after_archive.png)\n归档操作完成后的结果展示，包含成功/失败统计和详细结果。\n\n## 技术栈\n\n- **后端**: Node.js + Express\n- **前端**: 原生 JavaScript + CSS3\n- **API**: Slack Web API\n- **样式**: CSS + Font Awesome 图标\n\n## 环境要求\n\n- **Node.js**: \u003e= 18.17.0\n- **npm**: \u003e= 8.0.0\n\n## 安装和配置\n\n### 1. 克隆项目\n\n```bash\ngit clone \u003crepository-url\u003e\ncd slack-channel-archive-tool\n```\n\n### 2. 安装依赖\n\n**确保您使用的是支持的 Node.js 版本**：\n\n```bash\n# 检查 Node.js 版本\nnode --version  # 应该显示 v18.17.0 或更高版本\n\n# 安装依赖\nnpm install\n```\n\n### 3. 配置 Slack App\n\n1. 访问 [Slack API 网站](https://api.slack.com/apps)\n2. 点击 \"Create New App\" → \"From scratch\"\n3. 输入应用名称和选择工作区\n4. 在 \"OAuth \u0026 Permissions\" 页面配置：\n   - **Redirect URLs**: `https://localhost:3000/auth/callback` ⚠️ **必须使用 HTTPS**\n   - **Scopes**: 添加以下权限\n     - `channels:read` - 读取公开频道信息\n     - `groups:read` - 读取私有频道信息\n     - `channels:write` - 管理公开频道\n     - `groups:write` - 管理私有频道\n\n**重要**: Slack OAuth 2.0 强制要求回调 URL 必须是 HTTPS 协议。\n\n### 4. 配置环境变量\n\n#### 本地开发环境\n复制 `env.local.example` 文件为 `.env`：\n\n```bash\ncp env.local.example .env\n```\n\n#### 生产环境\n复制 `env.example` 文件为 `.env`：\n\n```bash\ncp env.example .env\n```\n\n编辑 `.env` 文件，填入您的 Slack App 配置：\n\n**本地开发配置**：\n```env\n# Slack App 配置\nSLACK_CLIENT_ID=your_slack_client_id\nSLACK_CLIENT_SECRET=your_slack_client_secret\nSLACK_REDIRECT_URI=https://localhost:3000/auth/callback\n\n# 服务器配置\nPORT=3000\nNODE_ENV=development\nUSE_HTTPS=true\n\n# 加密配置（可选，不设置会自动生成）\n# ENCRYPTION_KEY=your_32_byte_encryption_key\n```\n\n**生产环境配置**：\n```env\n# Slack App 配置\nSLACK_CLIENT_ID=your_slack_client_id\nSLACK_CLIENT_SECRET=your_slack_client_secret\nSLACK_REDIRECT_URI=https://your-domain.com/auth/callback\n\n# 服务器配置\nPORT=3000\nNODE_ENV=production\nUSE_HTTPS=false\n\n# 加密配置（建议设置，提高安全性）\nENCRYPTION_KEY=your_32_byte_encryption_key\n```\n\n**注意**: \n- 本地开发时 `SLACK_REDIRECT_URI` 使用 `https://localhost:3000/auth/callback`\n- 生产环境时 `SLACK_REDIRECT_URI` 使用您的实际域名\n- `USE_HTTPS` 在本地开发时设为 `true`，生产环境时设为 `false`\n\n### 5. 配置 SSL 证书（仅本地开发需要）\n\n**本地开发环境**：由于 Slack OAuth 2.0 强制要求 HTTPS 回调，您需要生成本地 SSL 证书：\n\n```bash\n# 生成自签名证书\nopenssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes\n```\n\n**生产环境**：如果使用 Cloudflare 等代理服务，无需生成本地证书，设置 `USE_HTTPS=false` 即可。\n\n**注意**: \n- 生成的 `key.pem` 和 `cert.pem` 文件已被 `.gitignore` 忽略，不会上传到版本控制\n- 本地开发时这是必要步骤，生产环境由代理服务处理 HTTPS\n\n### 6. 启动应用\n\n```bash\n# 开发模式（自动重启）\nnpm run dev\n\n# 生产模式\nnpm start\n```\n\n访问 `https://localhost:3000` 开始使用。\n\n**注意**: 浏览器可能会显示安全警告，因为使用的是自签名证书。点击\"高级\"→\"继续访问\"即可。\n\n## 使用说明\n\n### 1. 授权访问\n- 点击 \"授权 Slack 访问\" 按钮\n- 在 Slack 授权页面确认权限\n- 授权成功后自动返回应用\n\n### 2. 选择频道\n- 查看所有私有频道列表\n- 使用复选框选择要归档的频道\n- 支持全选/取消全选操作\n- 可以刷新列表获取最新数据\n\n### 3. 确认归档\n- 查看选中的频道列表\n- 确认操作（不可逆）\n- 点击 \"确认归档\" 执行操作\n\n### 4. 查看结果\n- 显示归档成功/失败统计\n- 详细的每个频道操作结果\n- 可以开始新的归档会话\n\n## API 端点\n\n### 认证相关\n- `GET /auth` - 启动 OAuth 授权流程\n- `GET /auth/callback` - OAuth 回调处理\n\n### 频道管理\n- `GET /api/channels?token_id=\u003cid\u003e` - 获取私有频道列表\n- `POST /api/archive` - 归档选中的频道\n\n### 调试端点（仅开发环境）\n- `GET /debug/token/:tokenId` - 查看Token基本信息（不暴露敏感数据）\n\n## 安全考虑\n\n- 使用 OAuth 2.0 流程，无需存储用户密码\n- Token 加密存储，5分钟后自动过期\n- 定期清理过期的 token\n- 所有 API 调用都经过验证\n- 调试端点仅在开发环境可用\n- 敏感信息不会在日志中暴露\n\n## 开发说明\n\n### 项目结构\n```\nslack-channel-archive-tool/\n├── server.js              # Express HTTPS 服务器\n├── package.json           # 项目配置\n├── package-lock.json      # 依赖锁定文件\n├── .gitignore             # Git 忽略文件\n├── env.example            # 环境变量示例\n├── env.local.example      # 本地环境变量示例\n├── README.md              # 项目说明\n├── README_EN.md           # 英文文档\n├── QUICKSTART.md          # 快速开始指南\n├── QUICKSTART_EN.md       # 英文快速开始指南\n├── CONFIGURATION.md       # 配置说明文档\n├── CHANGELOG.md           # 更新日志\n├── CHANGELOG_EN.md        # 英文更新日志\n├── DEPLOYMENT.md          # 部署说明\n├── LICENSE                # 许可证文件\n├── screenshots/           # 页面截图\n└── public/                # 静态文件\n    ├── index.html         # 主页面\n    ├── styles.css         # 样式文件\n    └── script.js          # 前端逻辑\n```\n\n### 重要文件说明\n\n- **`.env`**: 环境变量文件（不提交到版本控制）\n- **`key.pem` \u0026 `cert.pem`**: SSL 证书文件（不提交到版本控制）\n- **`node_modules/`**: 依赖包目录（不提交到版本控制）\n\n### 自定义配置\n\n#### 修改端口\n编辑 `.env` 文件中的 `PORT` 变量。\n\n#### 修改 OAuth 重定向 URL\n1. 更新 `.env` 文件中的 `SLACK_REDIRECT_URI`\n2. 在 Slack App 设置中更新对应的重定向 URL\n\n#### 自定义样式\n编辑 `public/styles.css` 文件来自定义界面样式。\n\n#### 频道类型配置\n当前默认配置为仅显示私有频道且仅显示授权者创建的频道。如需调整，可修改 `server.js` 中的相关配置：\n\n**获取频道列表的配置**（第 150-160 行左右）：\n```javascript\n// 获取私有频道列表\nconst channelsResponse = await axios.get('https://slack.com/api/conversations.list', {\n  headers: {\n    'Authorization': `Bearer ${decryptedToken}`\n  },\n  params: {\n    types: 'private_channel',  // 可改为 'public_channel' 或 'private_channel,public_channel'\n    exclude_archived: true\n  }\n});\n\n// 过滤频道（第 170-175 行左右）\nconst filteredChannels = channelsResponse.data.channels.filter(channel =\u003e {\n  return channel.creator === currentUserId;  // 移除此条件可显示所有频道\n});\n```\n\n**配置选项说明**：\n- `types: 'private_channel'` - 仅私有频道\n- `types: 'public_channel'` - 仅公共频道  \n- `types: 'private_channel,public_channel'` - 私有和公共频道\n- `channel.creator === currentUserId` - 仅显示当前用户创建的频道\n- 移除过滤条件 - 显示所有频道\n\n## 故障排除\n\n### 常见问题\n\n1. **Node.js 版本问题**\n   - 确保使用 Node.js 18.17.0 或更高版本\n   - 如果遇到 npm 语法错误，请升级 Node.js 版本\n   - 使用 `node --version` 检查当前版本\n\n2. **OAuth 授权失败**\n   - 检查 Slack App 配置是否正确\n   - 确认重定向 URL 匹配\n   - 验证 Client ID 和 Secret\n\n3. **无法获取频道列表**\n   - 确认 App 有正确的权限范围\n   - 检查用户是否有访问私有频道的权限\n\n4. **归档操作失败**\n   - 确认用户有归档频道的权限\n   - 检查频道是否已经被归档\n\n### 调试模式\n\n启动时添加调试信息：\n\n```bash\nDEBUG=* npm start\n```\n\n## 许可证\n\nMIT License","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcorhyam%2Fslack-channel-archive-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcorhyam%2Fslack-channel-archive-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcorhyam%2Fslack-channel-archive-tool/lists"}