OpenAPI的使用代码-登录优快云

原文地址:
http://www.java2000.net/p7715
http://blog.youkuaiyun.com/java2000_net/archive/2008/07/30/2736659.aspx
此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.youkuaiyun.com)所有,转载请保留此声明、代码注释和原始链接


优快云在很早以前就提供了登录优快云的OpenAPI,原始地址如下:http://passport.youkuaiyun.com/WebService/UserLoginService.asmx

原理分析
系统提供了2个方法
                UserLogin                                                           
                UserPreLogin
我们要使用这个服务,必须经过2个步骤。
1 预登录,获取一些验证信息(ClientKey)以及验证码图片
2 显示验证码图片,并让用户输入用户名和密码
3 提交数据,包括ClientKey,用户名和密码,以及验证码
4 拿到结果,最重要的就是 cookie的信息(ErrorInfo)

我们依然使用
URLConnection直接进行数据处理的方法.

先看预登录的部分。
看看协议

POST /WebService/UserLoginService.asmx HTTP/1.1
Host: passport.youkuaiyun.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserPreLogin xmlns="http://passport.youkuaiyun.com/">
      <RobotName>string</RobotName>
    </UserPreLogin>
  </soap12:Body>
</soap12:Envelope>


实现的代码

  /**
   * 预登录优快云系统
   *
   * @author 赵学庆,www.java2000.net
   * @param username 预登录的用户名
   * @return 结果数组.[0]:验证码的字符串, [1] Client的字符串 ,[2] Cookie数据
   */
  public static String[] preLogin(String username) {
    StringBuilder b = new StringBuilder();
    try {
      b.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
      b
          .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\n");
      b.append("  <soap12:Body>\n");
      b.append("    <UserPreLogin xmlns=\"http://passport.youkuaiyun.com/\">\n");
      b.append("      <RobotName>" + username + "</RobotName>\n");
      b.append("    </UserPreLogin>\n");
      b.append("  </soap12:Body>\n");
      b.append("</soap12:Envelope>\n");
      String[] strs = postPage("http://passport.youkuaiyun.com/WebService/UserLoginService.asmx",
          "passport.youkuaiyun.com", null, b.toString());
      String textXml = strs[1];
      SAXBuilder builder = new SAXBuilder();
      Document doc = null;
      Reader in = new StringReader(textXml);
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      Element result2 = (Element) content.get(1);
      String[] rtn = new String[3];
      if ("UserPreLoginResult".equals(result.getName())) {
        rtn[0] = result.getText();
      }
      if ("ClientKey".equals(result2.getName())) {
        rtn[1] = result2.getText();
      }
      rtn[2] = strs[0];
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }



调用的登录表单代码

<form method="post">
<table>
  <tr>
    <td>优快云用户名</td>
    <td><input type="text" name="username" /></td>
  </tr>
  <tr>
    <td>优快云密码</td>
    <td><input type="password" name="password" /></td>
  </tr>
  <tr>
    <td>图形验证码</td>
    <td><input type="text" size="6" name="code" /><br>
    <img id="vc" src="get优快云Image.jsp" /></td>
  </tr>
  <tr>
    <th>保存密码</th>
    <td><input type="checkbox" name="savePassword" value="true" id="savePassword" tabindex="-1" /></td>
  </tr>
  <tr>
    <td colspan="2">
    <button type="submit">登陆</button>
    </td>
  </tr>
</table>
</form>



其中的显示验证码的部分是关键

String[] rtn = OpenAPI.preLogin("java2000_net_test");
session.setAttribute("优快云_ClientKey",rtn[1]);
session.setAttribute("优快云_COOKIE",rtn[2]);
OutputStream os = response.getOutputStream();
os.write( org.apache.commons.codec.binary.Base64.decodeBase64(rtn[0].getBytes()));


里面讲返回的信息记录到了session里面,以备下次调用时使用

提示:返回的验证码图片数据是Base64编码后的,需要先解码才能使用。


到目前为止,预登录完成


下面我们进入第二步,登录

先看登录的协议


POST /WebService/UserLoginService.asmx HTTP/1.1
Host: passport.youkuaiyun.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserLogin xmlns="http://passport.youkuaiyun.com/">
      <LoginName>string</LoginName>
      <Password>string</Password>
      <VerifyCode>string</VerifyCode>
      <ClientKey>string</ClientKey>
    </UserLogin>
  </soap12:Body>
</soap12:Envelope>



参数有4个,登录的用户名,密码,认证码和ClientKey


登录返回的XML协议


HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserLoginResponse xmlns="http://passport.youkuaiyun.com/">
      <UserLoginResult>boolean</UserLoginResult>
      <ErrorInfo>string</ErrorInfo>
      <WarningInfo>string</WarningInfo>
    </UserLoginResponse>
  </soap12:Body>
</soap12:Envelope>



其中的
UserLoginResult为登录结果
ErrorInfo 为登录失败的错误信息
WarningInfo 我没用,估计是不是被暴力破解的那个警告啊

实现的代码

  /**
   * 登录优快云系统
   *
   * @author 赵学庆,www.java2000.net
   * @param username 登录的用户名
   * @param password 密码
   * @param verifyCode 校验码
   * @param clientkey 预登录的clientKey
   * @param cookie 预登录拿到的cookie
   * @return 登录结果,[0] 登录结果,'true'成功, [1] 错误信息,[2] 登录后的cookie数据
   */
  public static String[] login(String username, String password, String verifyCode,
      String clientkey, String cookie) {
    StringBuilder b = new StringBuilder();
    try {
      b.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
      b
          .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\n");
      b.append("  <soap12:Body>\n");
      b.append("   <UserLogin xmlns=\"http://passport.youkuaiyun.com/\">\n");
      b.append("    <LoginName>" + username + "</LoginName>\n");
      b.append("    <Password>" + password + "</Password>\n");
      b.append("     <VerifyCode>" + verifyCode + "</VerifyCode>\n");
      b.append("     <ClientKey>" + clientkey + "</ClientKey>\n");
      b.append("   </UserLogin>\n");
      b.append(" </soap12:Body>\n");
      b.append(" </soap12:Envelope>\n");
      String[] strs = postPage("http://passport.youkuaiyun.com/WebService/UserLoginService.asmx",
          "passport.youkuaiyun.com", cookie, b.toString());
      String textXml = strs[1];
      SAXBuilder builder = new SAXBuilder();
      Document doc = null;
      Reader in = new StringReader(textXml);
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      Element result2 = (Element) content.get(1);
      String[] rtn = new String[3];
      if ("UserLoginResult".equals(result.getName())) {
        rtn[0] = result.getText();
      }
      if ("ErrorInfo".equals(result2.getName())) {
        rtn[1] = result2.getText();
      }
      rtn[2] = strs[0];
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }




下面看登录的程序
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String code = request.getParameter("code");
    String clientKey = (String) session.getAttribute("优快云_ClientKey");
    String cookies = (String) session.getAttribute("优快云_COOKIE");
    String[] rtn = OpenAPI.login(username, password, code, clientKey, cookies);
    if ("true".equals(rtn[0])) {
      out.println("登陆成功!");
      // 其它的处理代码
      return;
    } else {
      out.println("登陆失败:" + rtn[1]);
    }




总结:
这个OpenAPI设计的还是挺好的,我们拿到ClientKey 和 Cookie之后,就可以在其它的请求里面把他们放在cookie里,直接向优快云提交请求,就如同你用浏览器直接访问一样。


附件:
系统用到的postPage的源代码
  /**
   * 提交数据到指定的地址
   *
   * @param urlTo 指定提交的地址
   * @param host 主机名称
   * @param cookies cookies的数据
   * @param data 提交的数据
   * @return 返回提交的结果数组,[0] 为返回的cookie 数据,[1]为返回的内容本体数据
   */
  private static String[] postPage(String urlTo, String host, String cookies, String data) {
    try {
      URL url = new URL(urlTo);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      con.setDoOutput(true); // POST方式
      con.setRequestMethod("POST");
      con.addRequestProperty("Host", host);
      con.addRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
      if (cookies != null) {
        con.addRequestProperty("Cookie", cookies);
      }
      byte[] bs = data.getBytes("UTF-8");
      con.addRequestProperty("Content-Length", Integer.toString(bs.length));
      OutputStream os = con.getOutputStream(); // 输出流,写数据
      os.write(bs);
      Map<String, List<String>> map = con.getHeaderFields();
      String[] rtn = new String[2];
      String cookie = "";
      if (map.get("Set-Cookie") != null)
        for (String v : map.get("Set-Cookie")) {
          cookie += v.substring(0, v.indexOf(";") + 1);
        }
      rtn[0] = cookie;
      BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
          "UTF-8")); // 读取结果
      String line;
      StringBuilder b = new StringBuilder();
      while ((line = reader.readLine()) != null) {
        b.append(line);
      }
      reader.close();
      rtn[1] = b.toString();
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }












<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
openapi-demo-java:钉钉企业应用接入-JSAPI权限验证-Java Demo 软件依赖 java version "1.7" maven3 Getting Started 将工程clone到本地:git clone https://github.com/open-dingtalk/openapi-demo-java.git 使用IDE导入工程,比如eclipse点击File->import(推荐使用maven导入), IDEA点击File->New->Project from Existing Sources..., 文件编码都是UTF-8 打开工程的Env.java文件,填入企业的CORP_ID,APP_KEY,APP_SECRET。参数获取请参考 public static final String CORP_ID = "your CORP_ID"; public static final String APP_KEY = "your APP_K 立即下载

相关推荐

开放平台的Open API设计

开放平台的Open API设计 开发者的抱怨 • 加密算法从没有听过! • 从其他平台迁移过来好难啊! • 说明文档看不懂

OpenAPI的使用代码-判断用户名和密码

原文地址:http://www.java2000.net/p7714http://blog.csdn.net/java2000_net/archive/2008/07/30/2736268.aspx此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.csdn.net)所有,转载请保留此声明、代码注释和原始链接   优快云的 OpenAPI 提

老紫竹的专栏 3805

登陆页面API ::登陆页面API

登陆页面API TL; DR 发展 npm run build npm run develop 生产 npm run build npm start 贡献 叉子! 创建功能分支git checkout -b feature/my-new-feature 提交您的更改git commit -m "feat: add some feature" 推到分支git push origin feature/my-new-feature 提交拉取请求 安全漏洞 如果在此项目中发现安全漏洞,请通过向MagnoBiét发送。 所有安全漏洞将得到及时解决。 执照 该软件包是根据获得。 版权所有:copyright:MagnoBiét

OpenAI注册以及Java代码调用

OpenAI可以使用google账号登录,也可以使用微软账号登录,这里建议使用微软账号登录,微软账号不需要vpn即可实现注册,用国内的邮箱和电话号码即可。在红色对话框即可进行对话,需要注意的是,因为受返回会话字数限制,超过一定数量就不会继续,可以在对话框输入continue继续进行。注意这个有效时间是20分钟,如果没有接收到短信会将购买费用返回,我使用阿根廷、印度的都能成功,可以根据实际情况选择。使用第一步注册的微软账号登录,接着会让提供电话号码,使用第二步购买的号码,等待验证码输入即可。

有问题请发邮箱dengyifanlittle@163.com进行讨论 1万+

openapi-demo-java-mater.zip

钉钉OA开发demo 本文档将带你一步步创建完成一个钉钉企业应用,并可以在手机上体验该企业应用的实际效果,显示用户登录姓名、头像等信息

apicloud登录注册实例代码(链接自己服务器)

apicloud登录注册实例代码,此代码是基于链接自己服务器。适合新手学习

openai的使用

openai的使用

qq_53298558的博客 3052

爬取国家统计局最近10年年度数据

一、编码流程 1.目标网址:https://data.stats.gov.cn/easyquery.htm?cn=C01 2.编码思路: (1) 解析左侧指标树,实现4级标签定位 (难点:层层嵌套,下一级指标的xpath路径以上一级指标为基础;不是所有二级指标都含有三和四级指标,需要进行判断) (2) 使用selenium webdriver 点选指标,加载出右侧表格数据 (难点:当指标无法在全局页面显示时,需向下拖动滚动条) (3) 解析右侧数据,实现数据存储 3.使用模块: (1) selenium:解

weixin_39645690的博客 4563

第三方登陆

1.什么是“QQ登陆OAuth2.0” OAuth:OAuth(开放授权)是开放一个标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或者分享他们数据的所有内容。QQ登陆OAuth2.0:对于用户相关的openAPI(例如获取用户的信息,动态同步,照片,日志,分享等)为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显示的向用户征求...

Cici3051336992的博客 311

双有源桥变换器(DAB)TPS控制:从理论建模到Simulink/PSIM仿真实践

本文深入探讨了双有源桥变换器(DAB)的三重移相(TPS)控制技术,从理论建模到仿真实现。文章详细分析了TPS相比SPS和DPS的优势,阐述了其12种工况的划分逻辑与电流应力最优调制策略,并提供了在Simulink和PSIM平台搭建仿真模型的详细步骤与实战经验,帮助工程师掌握这一高效控制方法。

white的博客 584

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2214

优快云--OpenAPI的使用代码-判断用户名和密码

http://www.java2000.net/p7714http://blog.csdn.net/java2000_net/archive/2008/07/30/2736268.aspx此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.csdn.net)所有,转载请保留此声明、代码注释和原始链接   优快云的 OpenAPI 提供了WebSe

gogo313的专栏 852

wpf入门第五篇 WPF with ECharts

前言 本文是wpf入门系列第五篇,面向有winform或者web前端基础的、并且也有C#基础的同学。 ECharts是百度团队开发的开源免费的js图表控件库,非常强大,文档齐全。WPF中使用图表,除了可以选择devexpress或者oxyplot之类的专为wpf开发的图表控件之外,还可以考虑使用 WebBrowser+ECharts 来完成复杂的图表展示,其展示效果不亚于前者。 本文介绍了 WP...

wf824284257的博客 1万+

本人已经实现的使用OpenAPI的应用汇总

本人已经实现的使用OpenAPI的应用汇总

jgfyyfd的博客 1904

1 电科院FTU检测标准学习笔记-外观检查

作者简介:本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验。

sixtome 1852

rknn-toolkit推理yolov5-face.rknn模型--python代码

import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN ONNX_MODEL = 'yolov5s.onnx' RKNN_MODEL = 'yolov5s.rknn' IMG_PATH = './bus.jpg' DATASET = './dataset.txt' QUANTIZE_ON = True BOX_THR.

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3079

openApi 使用

2、调用标准的费用报销单接口。1、先登录获取token。

MZ199290的博客 3269

基于Matlab使用雷达资源管理有效跟踪多个机动目标仿真(附源码)

多功能雷达可以搜索目标,确认新轨道,并重新访问轨道以更新状态。为了执行这些功能,多功能雷达通常由资源管理器管理,该资源管理器创建用于搜索、确认和跟踪的雷达任务。这些任务是根据优先级和时间安排的,因此,在每个时间步长中,多功能雷达都可以将其波束指向所需的方向。在此示例中,对于用于跟踪机动目标的雷达,有两个相互冲突的要求:目标的数量及其初始位置通常事先不知道。因此,雷达必须不断搜索感兴趣的区域才能找到目标。此外,雷达需要在进入雷达覆盖区域后立即检测并建立对每个目标的跟踪。目标机动的时间段事先是未知的。

珞瑜的博客 3150

利用码云OpenApi|GiteePage搭建图床

因为自建博客需要图片服务器,考虑到用本机的图片服务器需要考虑数据备份链接路径等一系列问题,还是推荐使用第三方的服务 当前各个主要平台的oss服务,有免费的有收费的,这里就不多说,毕竟个人的理解不一样 本文只讨论使用码云搭建第三方图床的问题,好了,开始使用码云搭建图床的具体操作 在码云上建一个空的远程仓库,然后建一个空的文件夹 这里有几点建议 不要轻易修改仓库的名字和文件夹的名字 注意命名规范简洁...

misty's technology stack 2686

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: OpenAPI的使用代码-判断用户名和密码
下一篇: 将字符串按照单词完全反转-大公司面试题
java2000_test
博客等级 码龄19年 10粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值