Main.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.company;
  2. import com.tencent.wework.Finance;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. //10000 参数错误,请求参数错误
  6. //10001 网络错误,网络请求错误
  7. //10002 数据解析失败
  8. //10003 系统失败
  9. //10004 密钥错误导致加密失败
  10. //10005 fileid错误
  11. //10006 解密失败
  12. //10007 找不到消息加密版本的私钥,需要重新传入私钥对
  13. //10008 解析encrypt_key出错
  14. //10009 ip非法
  15. //10010 数据过期
  16. public class Main {
  17. public static void main(String[] args){
  18. //seq 表示该企业存档消息序号,该序号单调递增,拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时seq传0,sdk会返回有效期内最早的消息。
  19. //limit 表示本次拉取的最大消息条数,取值范围为1~1000
  20. //proxy与passwd为代理参数,如果运行sdk的环境不能直接访问外网,需要配置代理参数。sdk访问的域名是"https://qyapi.weixin.qq.com"。
  21. //建议先通过curl访问"https://qyapi.weixin.qq.com",验证代理配置正确后,再传入sdk。
  22. //timeout 为拉取会话存档的超时时间,单位为秒,建议超时时间设置为5s。
  23. //sdkfileid 媒体文件id,从解密后的会话存档中得到
  24. //savefile 媒体文件保存路径
  25. //encrypt_key 拉取会话存档返回的encrypt_random_key,使用配置在企业微信管理台的rsa公钥对应的私钥解密后得到encrypt_key。
  26. //encrypt_chat_msg 拉取会话存档返回的encrypt_chat_msg
  27. // if (args.length < 2) {
  28. // System.out.println("./sdktools 1(chatmsg) 2(mediadata) 3(decryptdata)\n");
  29. // System.out.println("./sdktools 1 seq limit proxy passwd timeout\n");
  30. // System.out.println("./sdktools 2 fileid proxy passwd timeout savefile\n");
  31. // System.out.println("./sdktools 3 encrypt_key encrypt_chat_msg\n");
  32. // return;
  33. // }
  34. long ret = 0;
  35. //使用sdk前需要初始化,初始化成功后的sdk可以一直使用。
  36. //如需并发调用sdk,建议每个线程持有一个sdk实例。
  37. //初始化时请填入自己企业的corpid与secrectkey。
  38. long sdk = Finance.NewSdk();
  39. ret = Finance.Init(sdk, "wwd1f2fb82952be74c", "0k4XYuHUl4QB8QTB6cAOSaRIX00ur1Vyjjz4p_REP_k");
  40. System.out.println(ret);
  41. String arg0 = "0";
  42. if(ret != 0){
  43. Finance.DestroySdk(sdk);
  44. System.out.println("init sdk err ret " + ret);
  45. return;
  46. }else {
  47. System.out.println("init sdk ok");
  48. }
  49. if (arg0.equals("1")) {
  50. //拉取会话存档
  51. int seq = Integer.parseInt(args[1]);
  52. int limit = Integer.parseInt(args[2]);
  53. String proxy = args[3];
  54. String passwd = args[4];
  55. int timeout = Integer.parseInt(args[5]);
  56. //每次使用GetChatData拉取存档前需要调用NewSlice获取一个slice,在使用完slice中数据后,还需要调用FreeSlice释放。
  57. long slice = Finance.NewSlice();
  58. ret = Finance.GetChatData(sdk, seq, limit, proxy, passwd, timeout, slice);
  59. System.out.println("==============="+ret);
  60. if (ret != 0) {
  61. System.out.println("getchatdata ret " + ret);
  62. Finance.FreeSlice(slice);
  63. return;
  64. }
  65. System.out.println("getchatdata :" + Finance.GetContentFromSlice(slice));
  66. Finance.FreeSlice(slice);
  67. }
  68. else if (args[0].equals("2")) {
  69. //拉取媒体文件
  70. String sdkfileid = args[1];
  71. String proxy = args[2];
  72. String passwd = args[3];
  73. int timeout = Integer.parseInt(args[4]);
  74. String savefile = args[5];
  75. //媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。若该文件未拉取完整,sdk的IsMediaDataFinish接口会返回0,同时通过GetOutIndexBuf接口返回下次拉取需要传入GetMediaData的indexbuf。
  76. //indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“,表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。
  77. String indexbuf = "";
  78. while(true){
  79. //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
  80. long media_data = Finance.NewMediaData();
  81. ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, proxy, passwd, timeout, media_data);
  82. if(ret!=0){
  83. System.out.println("getmediadata ret:" + ret);
  84. Finance.FreeMediaData(media_data);
  85. return;
  86. }
  87. System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data));
  88. try {
  89. //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
  90. FileOutputStream outputStream = new FileOutputStream(new File(savefile), true);
  91. outputStream.write(Finance.GetData(media_data));
  92. outputStream.close();
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. if(Finance.IsMediaDataFinish(media_data) == 1)
  97. {
  98. //已经拉取完成最后一个分片
  99. Finance.FreeMediaData(media_data);
  100. break;
  101. }
  102. else
  103. {
  104. //获取下次拉取需要使用的indexbuf
  105. indexbuf = Finance.GetOutIndexBuf(media_data);
  106. Finance.FreeMediaData(media_data);
  107. }
  108. }
  109. }
  110. else if (args[0].equals("3")) {
  111. //解密会话存档内容
  112. //sdk不会要求用户传入rsa私钥,保证用户会话存档数据只有自己能够解密。
  113. //此处需要用户先用rsa私钥解密encrypt_random_key后,作为encrypt_key参数传入sdk来解密encrypt_chat_msg获取会话存档明文。
  114. String encrypt_key = args[1];
  115. String encrypt_chat_msg = args[2];
  116. //每次使用DecryptData解密会话存档前需要调用NewSlice获取一个slice,在使用完slice中数据后,还需要调用FreeSlice释放。
  117. long msg = Finance.NewSlice();
  118. ret = Finance.DecryptData(sdk, encrypt_key, encrypt_chat_msg, msg);
  119. if (ret != 0) {
  120. System.out.println("getchatdata ret " + ret);
  121. Finance.FreeSlice(msg);
  122. return;
  123. }
  124. System.out.println("decrypt ret:" + ret + " msg:" + Finance.GetContentFromSlice(msg));
  125. Finance.FreeSlice(msg);
  126. }
  127. else {
  128. System.out.println("wrong args " + args[0]);
  129. }
  130. Finance.DestroySdk(sdk);
  131. }
  132. }