百度统计接口:登录接口,其实在数据查询时并不需要进行登录接口调用,但是需要提供百度统计账户、数据导出token、ucid(首次登录获取后存储在数据库中即可),百度接口文档中一般称之为“用户相关”。

今天我们看一下如何进行登录接口调用以及获取ucid

首先,查询百度统计登录接口文档DR-API

DR-API挂接方发送的消息应该遵循如下规范:
CLIENT ID    ENCRYPT   VERSION    RESERVED    RESERVED    REAL DATA    每一个消息都包含了消息头和数据。消息头由8个字节组成,分成4个整数,每个整数包含2 个字节高位在前。
第一个整数表示client id,由DR-API统一分配。 第二个整数表示encrypt version,由DR-API统一分配。
第三个和第四个整数为保留整数,暂不使用。 消息头后面紧跟着消息数据。数据采用先压缩后加密的形式:
......

最初看到这个文档时,真的觉得很头大,不知道在干嘛,其中里面包含了三个接口方法,preLogin,verifyQuestion,doLogin,而我们只需要doLogin即可。参照官方提供的demo,我总结了以下几个步骤:
1. 注册百度统计账户,确保网站昨日PV大于100,开通数据导出服务获得Token(好像有冷却时间,开通后不能立即用);
2. 设置公钥key(我在项目中胡写的,但一直这么用没出啥问题),并进行RSA工具类获取公钥;
3. 按照文档要求构造请求参数对象req(DoLoginRequestImpl);

4. 将请求参数转换为json,并使用Gzip进行压缩;

5. 通过RSA工具类用公钥加密数据,参数为第2步获取的公钥,第4步获取的string;

6. 通过HTTP请求进行登录,返回结果数据;

7. 解压返回结果。

分享测试代码:

    /*** 登陆接口* 将登陆用户信息进行压缩加密,然后登陆* @author shy* @date 2016-11-15 下午01:08:44*/public static DoLoginResponse doLogin(WebsiteUser site) {try {DoLoginRequestImpl req = new DoLoginRequestImpl();req.setPassword(site.getPassword());req.setUsername(site.getUserName());req.setUuid(AppConstans.UUID);req.setToken(site.getToken());req.setFunctionName(AppConstans.LOGIN_METHOD);Key publicKey = RSAUtil.getPublicKey(AppConstans.KEY);//System.out.println("publicKey:" + publicKey );Gson gson = new Gson();String json = gson.toJson(req);//System.out.println("json:" + json);byte[] bytes = RSAUtil.encryptByPublicKey(GZipUtil.gzipString(json), publicKey);//System.out.println("zip:" + bytes.length);String loginResult =  HttpClientUtils.doHttpPost(AppConstans.HOME_LOGIN_ADDRESS, bytes, 10000, "utf-8");DoLoginResponse resp = gson.fromJson(loginResult, DoLoginResponse.class);return resp;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} return null;}

HTTP请求也比较特殊

    /*** 仅用于登陆的http post请求,登陆返回结果需要解压,然后才可以返回String或者obj* @param url* @param bytes* @param timeout* @param encode* @return* @author shy* @date 2016-11-15 下午01:26:48*/public static String doHttpPost(String url, byte[] bytes, int timeout, String encode){HttpClient httpClient = new HttpClient(new HttpClientParams(), new SimpleHttpConnectionManager());httpClient.getParams().setContentCharset(encode);PostMethod postMethod = new PostMethod(url);InputStream inputStream = new ByteArrayInputStream(bytes, 0, bytes.length);RequestEntity requestEntity = new InputStreamRequestEntity(inputStream, bytes.length, "text/json; charset=utf-8");postMethod.setRequestEntity(requestEntity);postMethod.addRequestHeader("Content-Type", "text/json; charset=utf-8");postMethod.addRequestHeader("uuid", AppConstans.UUID);postMethod.addRequestHeader("account_type", "1");        //默认是百度账号try {httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);int num = httpClient.executeMethod(postMethod);//System.out.println(num);if (num == AppConstans.SC_OK) {//System.out.println(postMethod.getResponseBodyAsString());InputStream in = postMethod.getResponseBodyAsStream();try {byte[] b = new byte[8];if (in.read(b) != 8) {throw new ClientInternalException("Server response is invalid.");}if (b[1] != 0) {throw new ClientInternalException("Server returned an error code: " + b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]);}int total = 0, k = 0;b = new byte[AppConstans.MAX_MSG_SIZE];while (total < AppConstans.MAX_MSG_SIZE) {k = in.read(b, total, AppConstans.MAX_MSG_SIZE - total);if (k < 0)break;total += k;}if (total == AppConstans.MAX_MSG_SIZE) {throw new ClientInternalException("Server returned message too large.");}byte[] zip = ArrayUtils.subarray(b, 0, total);zip = GZipUtil.unGzip(zip);//System.out.println(JacksonUtil.str2Obj(new String(zip, "UTF-8"), DoLoginResponse.class));//return JacksonUtil.str2Obj(new String(zip, "UTF-8"), DoLoginResponse.class);return new String(zip, "UTF-8");} catch (IOException e) {throw new ClientInternalException(e);} finally {if (in != null) {try {in.close();} catch (IOException e) {throw new ClientInternalException(e);}}}}} catch (Exception e) {//logger.error(e.getMessage(), e);} finally {postMethod.releaseConnection();}return "";}

请求参数相关实体类DoLoginRequestImpl

DoLoginRequestImpl.txt

请求参数相关实体类AbstractLoginRequest

AbstractLoginRequest.txt

两个官方提供的工具类 RSAUtil,GzipUtil

GZipUtil.txt

RSAUtil.txt

几个请求方法路径参数,两个胡写的key,uuid

public static final String HOME_LOGIN_ADDRESS = "https://api.baidu.com/sem/common/HolmesLoginService";
public static final String LOGIN_METHOD = "doLogin";
public static final String KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHn/hfvTLRXViBXTmBhNYEIJeGGGDkmrYBxCRelriLEYEcrwWrzp0au9nEISpjMlXeEW4+T82bCM22+JUXZpIga5qdBrPkjU08Ktf5n7Nsd7n9ZeI0YoAKCub3ulVExcxGeS3RVxFai9ozERlavpoTOdUzEH6YWHP4reFfpMpLzwIDAQAB";
public static final String UUID = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg-1";
public static final String ENCODING = "UTF-8";
public static final String KEY_ALGORITHM = "RSA";

本地测试结果

publicKey:Sun RSA public key, 1024 bits
modulus: 140181360492363042093064629109168807058601283712538405681407110724656257746707446709576724699949199331786898836532551899046132726873049289034928462964377304267872154683916692441298827083987020018969530763815538492523273482363822189405756057227531045360665993857388167087281300717732444075072406512231372180431
public exponent: 65537
json:{"request":{"password":"******"},"username":"rhhz1","token":"904cfbbc6fdc894d91e35b50fa036d8a","functionName":"doLogin","uuid":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg-1"}
zip:256
{"retcode":0,"retmsg":"成功","ucid":23881277,"st":"8b3f013d045f6139b15b797e5c6a01cc709797379f84c37d4258e7269026864b51583989641952d80c53bac5","istoken":0,"setpin":0,"questions":null}

分享源码,点击下载

通过爱效率网站获取百度统计数据说明

百度统计接口调用——获取站点列表

百度统计接口调用——获取站点访问数据

百度统计接口调用——登录接口相关推荐

  1. 华为快游戏调用登录接口失败,返回错误码 -1

    问题描述 在快游戏项目中,调用华为提供的登录接口,按照示例代码编写完成后,在手机上调试登录时,返回错误码 -1.如下: I jsLog : gameLoginWithReal fail:"A ...

  2. vuepress+百度统计 API 调用+源码

    ⭐️ ⭐️ 这是百度普通版统计 API 使用,而非百度商用版 API 百度统计 百度统计-用户手册 这里有各式各样的请求参数和示例,总能找到你想要的返回数据 1 必要条件 1.1 在 vuepress ...

  3. java实现百度统计api调用

    **公司需要调用百度统计的api,昨天搞了一天,先看了百度统计的官方文档 emmmmmmm 是真的没怎么看懂,然后在网上搜了各位大牛的实现,最后自己尝试了一下访问成功!** 1 2 思路大概是这样的  ...

  4. delphi 子接口是否实现父接口_您可以从子类接口的接口调用父接口的默认方法吗?...

    在Java 8中,我有类似以下内容: package test; public class SimpleFuncInterfaceTest { public static void carryOutW ...

  5. java接口调用_java 接口怎么调用

    一个类实现了某一个接口就可以调用接口中的方法.接口可以理解为一种能力,例如:每种动物都有叫的能力,但是每种动物的叫声都不一样,叫的能力就可以定义为一个接口. 一.创建项目和包 打开Eclipse,依次 ...

  6. 金蝶EAS,调用标准产品登录接口,EASLogin接口调用

    调用金蝶EAS系统提供的标准WebService接口或者二次开发提供的接口之前,都需要先调用登录接口. 下载登录接口对应的wsdl文件,生成客户端代码之后,调用实例如下(包路径根据实际情况修改): p ...

  7. Jmeter使用教程--调用其他接口使用账号密码登录

    新建一个测试计划 在测试计划右击,添加线程组 线程数:同一个时间起多少线程,不应该太多,不然Jmeter运行起来会卡 Ramp-Up时间:多少秒之内把线程数都跑起来 循环次数:线程数循环多少次,发送多 ...

  8. 你的登录接口真的安全吗?快看看你有没有中招!

    大家学写程序时,第一行代码都是hello world.但是当你开始学习WEB后台技术时,很多人的第一个功能就是写的登录 (小声:别人我不知道,反正我是).但是我在和很多工作经验较短的同学面试或沟通的时 ...

  9. 最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法

    以前的天气获取方式已经不支持了,虽然能获取到数据,但是获取到的信息已经不对了. 中国天气网提供的最新接口需要数据请求秘钥key.而且有效期只有7天,用完了还要重新购买,很麻烦,但是获取到的内容绝对是最 ...

  10. 企业微信小程序_授权登录接口获取用户userid

    文章目录 一.前置知识 1. 阅读 企业微信小程序开发文档 2. 企业微信小程序登录流程 3. 微信小程序区别 二.前端部分 2.1. 调用登录接口 2.2. 请求后端接口 2.3. 项目源码 三.后 ...

最新文章

  1. 虚拟机管理你的服务器,全面解析VMware的虚拟机管理解决方案
  2. json数据格式 python_python中json是什么文件格式
  3. 关于页面布局的一些注意点
  4. array关于map,reduce,filter的用法
  5. LeetCode 357. 计算各个位数不同的数字个数(DP)
  6. 第10篇 WINDOWS2003服务器 IIS上配置404页面的图文教程
  7. 常用三大java框架
  8. 机器学习:HMM:基础
  9. C#:实现敏感词过滤算法(附完整源码)
  10. usb声卡驱动_哑巴电脑拯救者——它可能是你见过使用最简单的外接声卡!
  11. 影像系统需求分析及架构概要
  12. 计算机无法删除tf卡的内容,SD卡无法格式化数据可以读取,但是删除不掉
  13. 如何用photoshop做24色环_如何用PS做色相环?色相环的制作教程
  14. vs2010中, 注释导致的怪异现象
  15. Flash 第二篇 AS影片剪辑
  16. iOS 相册多选 相机选择图片
  17. python 换国内源
  18. 17届华为杯数学建模大赛B题代码
  19. 学以致用——Java源码——员工薪酬系统功能增强(Payroll System Modification)
  20. 干货!!史上最全Java学习视频

热门文章

  1. 企业间数据竞争规则研究
  2. 基于Retrofit框架的金山API翻译功能案例
  3. java微博自动转发_被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
  4. 微软招 HR 了!看来是招聘需求太旺盛,忙不过来了
  5. 解决桥接模式连接虚拟机的问题
  6. 一文2000字搞懂高并发性能指标:QPS、TPS、RT、并发数、吞吐量
  7. java生成二维码图片
  8. QT error: undefined reference to `__imp__ZN12QSqlDatabase7driversEv‘报错
  9. 生活中的算法的实际举例_算法在实际生活中的应用
  10. 计算机方面发什么类型的论文,计算机类本科毕业论文