fabric Report API
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 ***