12
返回列表 发帖
楼主: 秋天的诉说

[已解决] Discuz! 3.5 的 UCenter 接口返回 Access denied for operation changed

0

主题

5

回帖

10

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2025-5-12 15:54:46 | 查看全部
  1. public String ucApiPost(String module, String action, Map<String, Object> arg) {
  2.         StringBuffer s = new StringBuffer();
  3.         String sep = "";
  4.         //foreach(arg as k => v) {
  5.         for (String k : arg.keySet()) {
  6.             //k = (k);
  7.             Object v = arg.get(k);
  8.             k = urlencode(k);

  9.             if (v.getClass().isAssignableFrom(Map.class)) {
  10.                 String s2 = "";
  11.                 String sep2 = "";
  12.                 //foreach(v as k2 => v2) {
  13.                 for (String k2 : ((Map<String, Object>) v).keySet()) {
  14.                     Object v2 = ((Map<String, Object>) v).get(k2);
  15.                     k2 = urlencode(k2);
  16.                     s2 += sep2 + "{" + k + "}[" + k2 + "]=" + urlencode(ucStripslashes(String.valueOf(v2)));
  17.                     sep2 = "&";
  18.                 }
  19.                 s.append(sep).append(s2);
  20.             } else {
  21.                 s.append(sep).append(k).append("=").append(urlencode(ucStripslashes(String.valueOf(v))));
  22.             }
  23.             sep = "&";
  24.         }
  25.         String postdata = ucApiRequestdata(module, action, s.toString(), "");
  26.         return ucFopen2(UC_API + "/index.php", 500000, postdata, "", true, UC_IP, 20, true);
  27. //        return ucFopen2(UC_API, 500000, postdata, "", true, UC_IP, 20, true);
  28.     }


  29.     /**
  30.      * 构造发送给用户中心的请求数据
  31.      *
  32.      * @param module 请求的模块
  33.      * @param action 请求的动作
  34.      * @param arg    参数(会加密的方式传送)
  35.      * @param extra  附加参数(传送时不加密)
  36.      * @return string
  37.      */
  38.     protected String ucApiRequestdata(String module, String action, String arg, String extra) {
  39.         String input = ucApiInput(arg, module, action);
  40.         String post = "m=" + module + "&a=" + action + "&inajax=2&release=" + UC_CLIENT_RELEASE + "&input=" + input + "&appid=" + UC_APPID + extra;
  41.         return post;
  42.     }

  43.     protected String ucApiUrl(String module, String action, String arg, String extra) {
  44.         String url = UC_API + "/index.php?" + ucApiRequestdata(module, action, arg, extra);
  45.         return url;
  46.     }

  47.     public String ucApiInput(String data, String module, String action) {
  48.         data = data + "&m="+ module + "&a=" + action + "&appid=" + UC_APPID;
  49.         //String s = data;
  50.         //String s = urlencode(uc_authcode(data+"&agent="+md5(_SERVER["HTTP_USER_AGENT"])+"&time="+time(), "ENCODE", UC_KEY));
  51.         String s = urlencode(ucAuthcode(data + "&agent=" + md5(HTTP_USER_AGENT) + "&time=" + time(), "ENCODE", UC_KEY));
  52.         //String s = urlencode(ucAuthcode(data + "&agent=" + md5("") + "&time=" + time(), "ENCODE", UC_KEY));
  53.         return s;
  54.     }
复制代码

我的版本是3.5的discuz,ucenter2.0,也报"Access denied for agent changed"这个错  ,client代码中,也都按照“专家”的步骤实现了。搞不懂哪里的问题了
回复

使用道具 举报

0

主题

5

回帖

10

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2025-5-12 15:55:51 | 查看全部
weekdaysun 发表于 2025-5-12 15:52
我的版本是3.5的discuz,ucenter2.0,也不报这个错,client代码中,也都按照“专家”的步骤实现了。搞不懂哪 ...

也报Access denied for agent changed的错误
回复

使用道具 举报

0

主题

5

回帖

10

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2025-5-12 16:01:24 | 查看全部
  1. @Override
  2.     public String ucApiPost(String module, String action, Map<String, Object> arg) {
  3.         StringBuffer s = new StringBuffer();
  4.         String sep = "";
  5.         //foreach(arg as k => v) {
  6.         for (String k : arg.keySet()) {
  7.             //k = (k);
  8.             Object v = arg.get(k);
  9.             k = urlencode(k);

  10.             if (v.getClass().isAssignableFrom(Map.class)) {
  11.                 String s2 = "";
  12.                 String sep2 = "";
  13.                 //foreach(v as k2 => v2) {
  14.                 for (String k2 : ((Map<String, Object>) v).keySet()) {
  15.                     Object v2 = ((Map<String, Object>) v).get(k2);
  16.                     k2 = urlencode(k2);
  17.                     s2 += sep2 + "{" + k + "}[" + k2 + "]=" + urlencode(ucStripslashes(String.valueOf(v2)));
  18.                     sep2 = "&";
  19.                 }
  20.                 s.append(sep).append(s2);
  21.             } else {
  22.                 s.append(sep).append(k).append("=").append(urlencode(ucStripslashes(String.valueOf(v))));
  23.             }
  24.             sep = "&";
  25.         }
  26.         String postdata = ucApiRequestdata(module, action, s.toString(), "");
  27.         return ucFopen2(UC_API + "/index.php", 500000, postdata, "", true, UC_IP, 20, true);
  28. //        return ucFopen2(UC_API, 500000, postdata, "", true, UC_IP, 20, true);
  29.     }


  30.     /**
  31.      * 构造发送给用户中心的请求数据
  32.      *
  33.      * @param module 请求的模块
  34.      * @param action 请求的动作
  35.      * @param arg    参数(会加密的方式传送)
  36.      * @param extra  附加参数(传送时不加密)
  37.      * @return string
  38.      */
  39.     protected String ucApiRequestdata(String module, String action, String arg, String extra) {
  40.         String input = ucApiInput(arg, module, action);
  41.         String post = "m=" + module + "&a=" + action + "&inajax=2&release=" + UC_CLIENT_RELEASE + "&input=" + input + "&appid=" + UC_APPID + extra;
  42.         return post;
  43.     }

  44.     protected String ucApiUrl(String module, String action, String arg, String extra) {
  45.         String url = UC_API + "/index.php?" + ucApiRequestdata(module, action, arg, extra);
  46.         return url;
  47.     }

  48.     public String ucApiInput(String data, String module, String action) {
  49.         data = data + "&m="+ module + "&a=" + action + "&appid=" + UC_APPID;
  50.         //String s = data;
  51.         //String s = urlencode(uc_authcode(data+"&agent="+md5(_SERVER["HTTP_USER_AGENT"])+"&time="+time(), "ENCODE", UC_KEY));
  52.         String s = urlencode(ucAuthcode(data + "&agent=" + md5(HTTP_USER_AGENT) + "&time=" + time(), "ENCODE", UC_KEY));
  53.         //String s = urlencode(ucAuthcode(data + "&agent=" + md5("") + "&time=" + time(), "ENCODE", UC_KEY));
  54.         return s;
  55.     }
复制代码

脑壳疼,目前按钮“专家”的步骤实现了java语言的client,但依然返回Access denied for agent changed;版本discuz3.5,ucenter2.0(之前1.7的也返回相同的错);在ucenter中和java应用通信是成功的。
希望大神们能够回复一下
回复

使用道具 举报

0

主题

5

回帖

10

积分

初学乍练

贡献
0 点
金币
5 个
发表于 2025-5-12 16:03:52 | 查看全部
weekdaysun 发表于 2025-5-12 16:01
脑壳疼,目前按钮“专家”的步骤实现了java语言的client,但依然返回Access denied for agent changed;版 ...
  1. public String ucAuthcode(String string, String operation, String key, int expiry) {

  2.         int ckey_length = 4;    //note 随机密钥长度 取值 0-32;
  3.         //note 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
  4.         //note 取值越大,密文变动规律越大,密文变化 = 16 的 ckey_length 次方
  5.         //note 当此值为 0 时,则不产生随机密钥

  6.         key = md5(key != null ? key : UC_KEY);
  7.         String keya = md5(substr(key, 0, 16));
  8.         String keyb = md5(substr(key, 16, 16));
  9.         String keyc = ckey_length > 0 ? (operation.equals("DECODE") ? substr(string, 0, ckey_length) : substr(md5(microTime()), -ckey_length)) : "";

  10.         String cryptkey = keya + md5(keya + keyc);
  11.         int key_length = cryptkey.length();

  12.         string = operation.equals("DECODE") ? base64Decode(substr(string, ckey_length)) : sprintf("%010d", expiry > 0 ? expiry + time() : 0) + substr(md5(string + keyb), 0, 16) + string;
  13.         int string_length = string.length();

  14.         StringBuffer result1 = new StringBuffer();

  15.         int[] box = new int[256];
  16.         for (int i = 0; i < 256; i++) {
  17.             box[i] = i;
  18.         }

  19.         int[] rndkey = new int[256];
  20.         for (int i = 0; i <= 255; i++) {
  21.             rndkey[i] = (int) cryptkey.charAt(i % key_length);
  22.         }

  23.         int j = 0;
  24.         for (int i = 0; i < 256; i++) {
  25.             j = (j + box[i] + rndkey[i]) % 256;
  26.             int tmp = box[i];
  27.             box[i] = box[j];
  28.             box[j] = tmp;
  29.         }

  30.         j = 0;
  31.         int a = 0;
  32.         for (int i = 0; i < string_length; i++) {
  33.             a = (a + 1) % 256;
  34.             j = (j + box[a]) % 256;
  35.             int tmp = box[a];
  36.             box[a] = box[j];
  37.             box[j] = tmp;

  38.             result1.append((char) (((int) string.charAt(i)) ^ (box[(box[a] + box[j]) % 256])));

  39.         }

  40.         if (operation.equals("DECODE")) {
  41.             String result = result1.toString();
  42.             try {
  43.                 result = new String(result.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
  44.             } catch (Exception e) {
  45.                 result = result1.substring(0, result1.length());
  46.             }
  47.             if ((Integer.parseInt(substr(result, 0, 10)) == 0 || Long.parseLong(substr(result, 0, 10)) - time() > 0) && substr(result, 10, 16).equals(substr(md5(substr(result, 26) + keyb), 0, 16))) {
  48.                 return substr(result, 26);
  49.             } else {
  50.                 return "";
  51.             }
  52.         } else {
  53.             return keyc + base64Encode(result1.toString()).replaceAll("=", "");
  54.         }
  55.     }
复制代码

加密算法比对php版本的,逻辑也一致
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 关注公众号
  • 有偿服务微信
  • 有偿服务QQ

手机版|小黑屋|Discuz! 官方交流社区 ( 皖ICP备16010102号 |皖公网安备34010302002376号 )|网站地图|star

GMT+8, 2025-6-16 13:42 , Processed in 0.037052 second(s), 10 queries , Redis On.

Powered by Discuz! W1.0 Licensed

Cpoyright © 2001-2025 Discuz! Team.

关灯 在本版发帖
有偿服务QQ
有偿服务微信
返回顶部
快速回复 返回顶部 返回列表