Skip to content

Latest commit

 

History

History
412 lines (325 loc) · 10.7 KB

File metadata and controls

412 lines (325 loc) · 10.7 KB

腾讯企业微信微盘API调用示例

完整的企业微信微盘API Java实现,支持创建目录、文件管理、权限设置等功能。

📁 文件说明

文件 说明
WeworkWediskAPI.java 基础版本,实现核心的创建目录功能
WeworkWediskAdvanced.java 高级版本,包含完整的文件管理功能
pom_wework.xml Maven依赖配置

🚀 快速开始

1. 准备工作

获取企业微信凭证

  1. 登录企业微信管理后台
  2. 进入应用管理自建应用 → 创建应用
  3. 获取以下信息:
    • 企业ID(CorpID): 在"我的企业"页面查看
    • 应用Secret: 在应用详情页面查看

配置应用权限

在应用的API权限中,启用以下权限:

  • ✅ 微盘管理权限
  • ✅ 通讯录读取权限

2. 安装依赖

# 将 pom_wework.xml 重命名为 pom.xml
mv pom_wework.xml pom.xml

# 安装依赖
mvn clean install

3. 修改配置

在代码中替换以下配置:

String corpId = "your_corp_id";           // 替换为您的企业ID
String corpSecret = "your_corp_secret";   // 替换为应用Secret
String userId = "ZhangSan";               // 替换为实际用户ID

4. 运行程序

# 运行基础版本
mvn exec:java -Dexec.mainClass="WeworkWediskAPI"

# 运行高级版本
mvn exec:java -Dexec.mainClass="WeworkWediskAdvanced"

📚 功能说明

基础版本(WeworkWediskAPI.java)

1. 获取Access Token

WeworkWediskAPI api = new WeworkWediskAPI(corpId, corpSecret);
String token = api.getAccessToken();

2. 创建微盘空间

String spaceId = api.createSpace(userId, "项目文档空间");

3. 创建单个文件夹

String folderId = api.createFolder(userId, spaceId, spaceId, "技术文档");

4. 创建多级目录

String lastFolderId = api.createMultiLevelFolder(
    userId, 
    spaceId, 
    spaceId,
    "项目管理/2026年/Q1季度/银行交易系统"
);

高级版本(WeworkWediskAdvanced.java)

1. 批量创建目录结构

Map<String, List<String>> structure = new LinkedHashMap<>();
structure.put("技术文档", Arrays.asList("前端开发", "后端开发", "数据库设计"));
structure.put("项目管理", Arrays.asList("需求文档", "设计文档", "测试报告"));

Map<String, String> folderIdMap = api.createFolderStructure(
    userId, spaceId, spaceId, structure
);

2. 重命名文件/文件夹

api.renameFile(userId, fileId, "新文件名");

3. 移动文件/文件夹

api.moveFile(userId, fileId, targetFatherId);

4. 删除文件/文件夹

api.deleteFile(userId, fileId);

5. 获取文件信息

JsonObject fileInfo = api.getFileInfo(userId, fileId);
String fileName = fileInfo.get("file_name").getAsString();
int fileType = fileInfo.get("file_type").getAsInt();

6. 列出目录下的文件

List<JsonObject> files = api.listFiles(userId, spaceId, fatherId);
for (JsonObject file : files) {
    System.out.println(file.get("file_name").getAsString());
}

7. 设置空间权限

// authType: 1=可查看, 2=可编辑, 3=可管理
api.addSpacePermission(spaceId, userId, 2);

8. 设置文件权限

api.addFilePermission(fileId, userId, 2);

🔧 API接口说明

1. 获取access_token

  • 接口: GET /cgi-bin/gettoken
  • 参数: corpid, corpsecret
  • 返回: access_token, expires_in

2. 创建空间

  • 接口: POST /cgi-bin/wedrive/space_create
  • 参数:
    {
      "userid": "ZhangSan",
      "space_name": "空间名称"
    }
  • 返回: spaceid

3. 创建文件/文件夹

  • 接口: POST /cgi-bin/wedrive/file_create
  • 参数:
    {
      "userid": "ZhangSan",
      "spaceid": "space_id",
      "fatherid": "father_id",
      "file_type": 1,
      "file_name": "文件夹名称"
    }
  • file_type: 1=文件夹, 2=文件
  • 返回: fileid

4. 重命名文件

  • 接口: POST /cgi-bin/wedrive/file_rename
  • 参数:
    {
      "userid": "ZhangSan",
      "fileid": "file_id",
      "new_name": "新名称"
    }

5. 获取文件列表

  • 接口: POST /cgi-bin/wedrive/file_list
  • 参数:
    {
      "userid": "ZhangSan",
      "spaceid": "space_id",
      "fatherid": "father_id",
      "start": 0,
      "limit": 100
    }

📝 完整使用示例

示例1:创建项目文档结构

public class Example1 {
    public static void main(String[] args) throws IOException {
        WeworkWediskAPI api = new WeworkWediskAPI(corpId, corpSecret);
        api.getAccessToken();
        
        // 创建空间
        String spaceId = api.createSpace("ZhangSan", "项目文档");
        
        // 创建根目录
        String projectId = api.createFolder("ZhangSan", spaceId, spaceId, "银行项目");
        
        // 创建子目录
        api.createFolder("ZhangSan", spaceId, projectId, "需求文档");
        api.createFolder("ZhangSan", spaceId, projectId, "设计文档");
        api.createFolder("ZhangSan", spaceId, projectId, "开发文档");
        api.createFolder("ZhangSan", spaceId, projectId, "测试报告");
    }
}

示例2:创建按日期归档的目录

public class Example2 {
    public static void main(String[] args) throws IOException {
        WeworkWediskAdvanced api = new WeworkWediskAdvanced(corpId, corpSecret);
        api.getAccessToken();
        
        String spaceId = api.createSpace("ZhangSan", "会议记录");
        
        // 按年份组织
        String year2026 = api.createFolder("ZhangSan", spaceId, spaceId, "2026年");
        
        // 按季度组织
        String q1 = api.createFolder("ZhangSan", spaceId, year2026, "Q1");
        String q2 = api.createFolder("ZhangSan", spaceId, year2026, "Q2");
        
        // 按月份组织
        api.createFolder("ZhangSan", spaceId, q1, "01月");
        api.createFolder("ZhangSan", spaceId, q1, "02月");
        api.createFolder("ZhangSan", spaceId, q1, "03月");
    }
}

示例3:批量创建团队目录结构

public class Example3 {
    public static void main(String[] args) throws IOException {
        WeworkWediskAdvanced api = new WeworkWediskAdvanced(corpId, corpSecret);
        api.getAccessToken();
        
        String spaceId = api.createSpace("ZhangSan", "技术部文档");
        
        // 定义目录结构
        Map<String, List<String>> structure = new LinkedHashMap<>();
        structure.put("前端团队", Arrays.asList("React项目", "Vue项目", "小程序"));
        structure.put("后端团队", Arrays.asList("Java服务", "Python服务", "Go服务"));
        structure.put("运维团队", Arrays.asList("部署文档", "监控配置", "备份策略"));
        structure.put("测试团队", Arrays.asList("测试用例", "自动化脚本", "性能测试"));
        
        // 批量创建
        api.createFolderStructure("ZhangSan", spaceId, spaceId, structure);
        
        // 为团队成员设置权限
        api.addSpacePermission(spaceId, "LiSi", 2);    // 编辑权限
        api.addSpacePermission(spaceId, "WangWu", 1);  // 查看权限
    }
}

🐛 错误码说明

errcode 说明 解决方案
0 成功 -
40001 不合法的secret参数 检查corpSecret是否正确
40014 不合法的access_token 重新获取access_token
42001 access_token已过期 access_token有效期7200秒,需重新获取
44001 空的请求参数 检查必填参数是否传递
60011 userid不存在 检查用户ID是否在企业通讯录中
93000 未找到空间 检查spaceId是否正确
93001 未找到文件 检查fileId是否正确
93002 空间已满 联系管理员扩容
93003 无权限 检查用户是否有对应操作权限

⚠️ 注意事项

1. Token管理

  • access_token 有效期为 7200秒(2小时)
  • 建议实现token缓存机制,避免频繁请求
  • 可以在token过期前提前刷新
// Token缓存示例
private long tokenExpireTime = 0;

public String getAccessToken() throws IOException {
    if (System.currentTimeMillis() < tokenExpireTime) {
        return this.accessToken;  // 使用缓存的token
    }
    // 重新获取token
    // ...
    tokenExpireTime = System.currentTimeMillis() + 7000 * 1000;  // 提前200秒刷新
    return this.accessToken;
}

2. API调用频率限制

  • 企业微信API有调用频率限制
  • 建议添加重试机制
  • 批量操作时添加适当延迟

3. 用户ID说明

  • userid 必须是企业通讯录中存在的成员
  • 在企业微信管理后台的"通讯录"中查看

4. 空间和文件ID

  • spaceid: 创建空间后返回,用于后续所有操作
  • fileid: 每个文件/文件夹的唯一标识
  • 在根目录创建文件时,fatherid = spaceid

5. 文件类型

  • file_type=1: 文件夹
  • file_type=2: 文件(需要通过上传接口上传)

📊 性能优化建议

1. 批量操作

// 使用线程池批量创建
ExecutorService executor = Executors.newFixedThreadPool(5);
for (String folderName : folderNames) {
    executor.submit(() -> {
        try {
            api.createFolder(userId, spaceId, parentId, folderName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}
executor.shutdown();

2. 异常重试

public String createFolderWithRetry(String userId, String spaceId, 
                                    String fatherId, String folderName) {
    int maxRetries = 3;
    for (int i = 0; i < maxRetries; i++) {
        try {
            return createFolder(userId, spaceId, fatherId, folderName);
        } catch (IOException e) {
            if (i == maxRetries - 1) throw e;
            Thread.sleep(1000 * (i + 1));  // 指数退避
        }
    }
    return null;
}

3. 连接池配置

// 使用HttpClient连接池(需要添加依赖)
CloseableHttpClient httpClient = HttpClients.custom()
    .setMaxConnTotal(100)
    .setMaxConnPerRoute(20)
    .build();

🔗 相关资源


📞 技术支持

遇到问题可以:

  1. 查看企业微信官方文档
  2. 在企业微信开发者社区提问
  3. 联系企业微信技术支持

📄 许可证

MIT License