1、Token生成

接口 : post        https://fabric.io/oauth/token
请求头:Headers Content-Type : application/json
正文: body {
        "grant_type":"password",
        "scope":"organizations apps issues features account twitter_client_apps beta software answers",
        "username":"mimimimimi@qq.com", //登录名
        "password":"123456789", //登录密码
        "client_id":"2c18f8a77609ee6bbac9e53f3768fedc45fb96be0dbcb41defa706dc57d9c931",
        "client_secret":"092ed1cdde336647b13d44178932cba10911577faf0eda894896188a7d900cc9"    
     }

  

2、返回值

{
"access_token": "ccccccccccccccccccccccc",
"token_type": "bearer",
"expires_in": 86400,
"refresh_token": "refresh_tokenqqqqqqqqqqqqq",
   "scope": "organizations apps issues features account twitter_client_apps beta software answers"
}

  

利用  access_token  可以进行后续接口访问。

3、利用 refresh_token 刷新新的token(讲得到的refresh_token<无过期时间>保存下来,刷新token):

接口 : post        https://fabric.io/oauth/token
请求头:Headers Content-Type : application/json
正文: body {
            "grant_type":"refresh_token",
            "refresh_token":"refresh_tokenqqqqqqqqqqqqq"
         }

返回值

{
"access_token": "ccccccccccccccccccccccc",
"refresh_token": "refresh_tokenqqqqqqqqqqqqq"
}

  

4、请求接口   接口文档出处   https://github.com/strongself/fabricio/blob/develop/docs/api_reference.md

举例两个接口

  (1)、GET -  https://fabric.io/api/v2/apps

get     https://fabric.io/api/v2/apps
Headers Authorization: Bearer {access_token}

  

 返回值

 [
{
"id": "11111111",
"name": "8888888888",
"bundle_identifier": "包名",
"base_identifier": "8888888888",
"collect_analytics": true,
"created_at": "2016-08-01T09:03:47Z",
"analytics_app_has_received_data": true,
"analytics_forward_to_google_analytics": false,
"analytics_include_purchase_events_in_forwarded_events": false,
"platform": "android",
"status": "activated",
"latest_build": null,
"icon_url": "https://s3.amazonaws.com555555555icon.png",
"icon_hash": null,
"kit_versions": null,
"sdk_kits": null,
"map_of_available_products": null,
"firebase_crashlytics": false,
"icon32_url": "https://s3.amazonaws.com/assets.crashlytics.com//icon.png",
"icon64_url": "https://s3.amazonaws.com/assets.crashlytics.com/production//icon.png",
"icon128_url": "https://s3.amazonaws.com/assets.crashlytics.com/production//icon.png",
"accounts_count": 23,
"organization_id": "1111111111111",
"watched": null,
"importance_level": null,
"app_link": null,
"dashboard_url": "https://www.fabric.io/333333333333",
"impacted_devices_count": 0,
"unresolved_issues_count": 0,
"crashes_count": 0
}
]

     ***  将红色的记录下来  organization_id  和  app_id  ***

   (2)获取日活

  

接口  get  https://fabric.io/api/v2/organizations/organization_id/apps/app_id/growth_analytics/daily_active.json?start=1478736000&end=1478736000
头设置 Headers Authorization: Bearer {access_token}

  

  返回值,解析需要的值:

{
"build": "all",
"series": [
[
1478736000, //日期
0 //日活
],
[
1478822400,
0
],
[
1481328000,
0
]
],
"start": 1478736000,
"end": 1481328000,
"app_id": "appid--------",
"deltas": {
"week_over_week": {
"delta_fraction": null,
"last_week_value": null
}
}
}

  

完整代码  PHP

 <?php

 class ScriptUserDaily
{
  //保存第一次获取的 refresh_token ,用于下次刷新token用
private $filePath = '/files/fabricToken.json'; public function fire()
{
$access_token = $this->getRefreshToken();
if(empty($access_token))
$access_token = $this->getToken(); $edata = time();
$sdata = $edata - 24 * 3600 * 5; $header = [
"Authorization: Bearer ".$access_token
];      //数据库获取应用,主要获取 organization_id 和 app_id
$appinfo = FanAppInfo::byFabric()->get();
foreach ($appinfo as $appItem){
$fabricid = $appItem->fabricid;
if(empty($fabricid))
continue;        $organization_id = $appItem->organization_id;
$url = "https://fabric.io/api/v2/organizations/$organization_id/apps/$fabricid/growth_analytics/daily_active.json?start=$sdata&end=$edata"; $this->getDatas($url,$header,1); $url2 = "https://fabric.io/api/v2/organizations/$organization_id/apps/$fabricid/growth_analytics/daily_new.json?start=$sdata&end=$edata"; $this->getDatas($url2,$header,2);
}
} private function getRefreshToken(){
//获取 refresh_token 从文件中读取保存的refresh_token
$path = $this->filePath; $JsonData = file_get_contents($path); $rejson = json_decode($JsonData, true);
$refresh_token = $rejson['refresh_token']; //刷新 token
$url = 'https://fabric.io/oauth/token';
$header = [
"content-type: application/json"
];
$body = [
'grant_type' => 'refresh_token',
'refresh_token' => trim($refresh_token)
]; $data = $this->curl_post($url,$header,json_encode($body));
$rejson = json_decode($data, true); $access_token_new = '';
$refresh_token_new = '';
if(isset($rejson['refresh_token']))
$refresh_token_new = $rejson['refresh_token'];
if(isset($rejson['access_token']))
$access_token_new = $rejson['access_token']; if(!empty($refresh_token_new)){
$txt = [
'access_token' => $access_token_new,
'refresh_token' => $refresh_token_new
]; //重新写入新的 refresh_token
$this->writeRefreshToken($txt);
} return $access_token_new;
} private function getToken(){
$url = 'https://fabric.io/oauth/token';
$header = [
"content-type: application/json"
];
$body = [
'grant_type' => 'password',
'scope' => 'organizations apps issues features account twitter_client_apps beta software answers',
'username' => '14141414@qq.com',
'password' => '123456789',
'client_id' => '2c18f8a77609ee6bbac9e53f3768fedc45fb96be0dbcb41defa706dc57d9c931',
'client_secret' => '092ed1cdde336647b13d44178932cba10911577faf0eda894896188a7d900cc9'
]; $data = $this->curl_post($url,$header,json_encode($body));
$rejson = json_decode($data, true); $access_token_new = '';
$refresh_token_new = '';
if(isset($rejson['refresh_token']))
$refresh_token_new = $rejson['refresh_token'];
if(isset($rejson['access_token']))
$access_token_new = $rejson['access_token']; if(!empty($refresh_token_new)){
$txt = [
'access_token' => $access_token_new,
'refresh_token' => $refresh_token_new
]; //重新写入新的 refresh_token
$this->writeRefreshToken($txt);
} return $access_token_new;
} private function writeRefreshToken($txt){
$path = $this->filePath; $myfile = fopen($path, "w");
$txt = json_encode($txt);
fwrite($myfile,$txt);
fclose($myfile);
} private function getDatas($url,$header,,$type){
$resData = $this->curl_get($url,$header);
$datas = json_decode($resData, true); if(!isset($datas['series']))
return ''; $active = 0;
$news = 0;
foreach ($datas['series'] as $item){
$date = date('Y-m-d',$item[0]); if($type == 1){
$active = intval($item[1]);
}elseif($type == 2){
$news = intval($item[1]);
} //处理数据 }
} private function curl_get($url, $header = [], $time = 5){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  if (!empty($header)) {
   curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
   }
   curl_setopt($ch, CURLOPT_TIMEOUT, $time);
   $result = curl_exec($ch);
   curl_close($ch);
   return $result;
  }   private function curl_post($url, $header = [], $body = [], $time = 5){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
   if (!empty($body)) {
   curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
   }
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   if (!empty($header)) {
   curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
   }
   curl_setopt($ch, CURLOPT_TIMEOUT, $time);
   $result = curl_exec($ch);
   curl_close($ch);
   return $result;
  }
}

***  参考文档    https://github.com/strongself/fabricio/blob/develop/docs/api_reference.md ***

fabric Report API的更多相关文章

  1. Python自动化运维工具-Fabric部署及使用总结

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  2. [Python Fabric] [SSH] Mac OS X 10.9 + Vagrant虚拟环境使用Python Fabric进行SSH远程登录的简单实验

    1. ssh客户端生成key $ Generating public/private rsa key pair. Enter file in which to save the key (/Users ...

  3. Python之Fabric模块

    Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行.文件上传.下载及完整执行日 ...

  4. Hyperledger Fabric Chaincode for Operators——实操智能合约

    什么是Chaincode(智能合约)? chaincode是一个程序,它是使用Go语言编写的,最终在Java等其他编程语言中实现了指定的接口.chaincode运行在一个被背书peer进程独立出来的安 ...

  5. Python3 模块 -- Fabric自动化模版

    安装 pip3 install fabric3 创建软连接 find / -type f -name "fab" /usr/local/python3/bin/fab ln -s ...

  6. Hyperledger Fabric链码之三

    在<Hyperledger Fabric链码之一>和<Hyperledger Fabric链码之二>中我们介绍了链码的定义,并通过dev网络测试了测试了自己编写的链码程序. 本 ...

  7. Fabric运维从入门到精通

    1. fabric的安装 在windows下的python3中安装fabric: 在python安装根目录下使用pip install fabric 安装 如图: fabric只支持python2不支 ...

  8. fabric 更详尽的用法

    项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上. 修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D, ...

  9. 系统批量运维管理器Fabric详解

    系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...

随机推荐

  1. Resharper F12下载dll源码

    原作者:赵青青 原文链接:Visual Studio(VS) F12 查看DLL源代码 Dot Peek 今天在调试时,又有这个需求,想查看dll的源代码,我决定从dot peek这个程序入手去查找相 ...

  2. 使用版本 1.0.0 的 Azure ARM SDK for Java 创建虚拟机时报错

    问题描述 我们可以通过使用 Azure ARM SDK 来管理 Azure 上的资源,因此我们也可以通过 SDK 来创建 ARM 类型的虚拟机,当我们使用 1.0.0 版本的 Azure SDK fo ...

  3. Python 调度算法 死锁 静动态链接(七)

    1 select poll epoll的区别 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点. (1)select ...

  4. bootstrap-multiselect.js多选下拉框初始化时默认选中初始值

    bootstrap-multiselect.js多选下拉框默认值设置 一.案例数据格式  二.HTML代码 <select id="msgRoles" multiple=&q ...

  5. arcgis for javascript ArcGISDynamicMapServiceLayer 过滤图层点

    记录下过滤 ArcGISDynamicMapServiceLayer 图层服务的方法 function filterArcGISDynamicMapServiceLayer(){ map.graphi ...

  6. Gym - 101246D 博弈

    题意:一个无向有环的图,从 1 号结点起火,开始蔓延,两个绝顶聪明的人轮流走,谁不能走谁输,输出输的人: 分析: 当时知道是博弈,但是想当然的以为 1 号结点有一个奇数层,就必胜:其实不是这样的,当一 ...

  7. 【转】总结oninput、onchange与onpropertychange事件的用法和区别

    经本人测试在chrome下的从历史记录中选取值的时候也户触发input事件 前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过 ...

  8. HDU 5258 数长方形【离散化+暴力】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5258 数长方形 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  9. Array GCD CodeForces - 624D (dp,gcd)

    大意: 给定序列, 给定常数a,b, 两种操作, (1)任选一个长为$t$的子区间删除(不能全部删除), 花费t*a. (2)任选$t$个元素+1/-1, 花费t*b. 求使整个序列gcd>1的 ...

  10. 九、IntelliJ IDEA 编译方式介绍及编译器的设置和选择

    相对于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也可以通过设置开启实时编译,但是太浪费资源了,因此不建议这样做.IntelliJ ...