Перейти к содержимому


Snoopy class + Zadarma API


Сообщений в теме: 2

#1 Dinak

    Активный участник

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 18 Декабрь 2015 - 08:39

Люди help )))
Используем на веб версии (php 5.2) телефонию от ZADARMA, у них есть API для получения статистики звонков.
На GitHub нашел готовый php class для подключения к API:
<?php
namespace Zadarma_API;
use Exception;
class Client
{
    const PROD_URL = 'https://api.zadarma.com';
    const SANDBOX_URL = 'https://api-sandbox.zadarma.com';
    private $_url;
    private $_key;
    private $_secret;
    private $_httpCode;
    private $_limits = array();
    /**
	 * @param $key
	 * @param $secret
	 * @param bool|false $isSandbox
	 */
    public function __construct($key, $secret, $isSandbox = false)
    {
	    $this->_url = ($isSandbox) ? self::SANDBOX_URL : self::PROD_URL;
	    $this->_key = $key;
	    $this->_secret = $secret;
    }
    /**
	 * @param $method - API method, including version number
	 * @param array $params - Query params
	 * @param string $requestType - (get|post|put|delete)
	 * @param string $format - (json|xml)
	 * @param bool|true $isAuth
	 *
	 * @return mixed
	 * @throws Exception
	 *
	 */
    public function call($method, $params = array(), $requestType = 'get', $format = 'xml', $isAuth = true)
    {
	    if (!is_array($params)) {
		    throw new Exception('Query params must be an array.');
	    }
	    $type = strtoupper($requestType);
	    if (!in_array($type, array('GET', 'POST', 'PUT', 'DELETE'))) {
		    $type = 'GET';
	    }
	    $params['format'] = $format;
	    $options = array(
		    CURLOPT_URL		    => $this->_url . $method,
		    CURLOPT_CUSTOMREQUEST  => $type,
		    CURLOPT_CONNECTTIMEOUT => 10,
		    CURLOPT_RETURNTRANSFER => true,
		    CURLOPT_SSL_VERIFYPEER => false,
		    CURLOPT_SSL_VERIFYHOST => false,
		    CURLOPT_HEADERFUNCTION => array($this, '_parseHeaders')
	    );
	    $ch = curl_init();
	    if ($type == 'GET') {
		    $options[CURLOPT_URL] = $this->_url . $method . '?' . http_build_query($params);
	    } else {
		    $options[CURLOPT_POST] = true;
		    $options[CURLOPT_POSTFIELDS] = http_build_query($params);
	    }
	    if ($isAuth) {
		    $options[CURLOPT_HTTPHEADER] = $this->_getAuthHeader($method, $params);
	    }
	    curl_setopt_array($ch, $options);
	    $response = curl_exec($ch);
	    $error = curl_error($ch);
	    $this->_httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	    curl_close($ch);
	    if ($error) {
		    throw new Exception($error);
	    }
	    return $response;
    }
    /**
	 * @return int
	 */
    public function getHttpCode()
    {
	    return $this->_httpCode;
    }
    /**
	 * @return array
	 */
    public function getLimits()
    {
	    return $this->_limits;
    }
    /**
	 * @param $method
	 * @param $params
	 *
	 * @return array
	 */
    private function _getAuthHeader($method, $params)
    {
	    ksort($params);
	    $paramsString = http_build_query($params);
	    $signature = base64_encode(hash_hmac('sha1', $method . $paramsString . md5($paramsString), $this->_secret));
	    return array('Authorization: ' . $this->_key . ':' . $signature);
    }
    /**
	 * @param $curl
	 * @param $line
	 *
	 * @return int
	 */
    private function _parseHeaders($curl, $line)
    {
	    if (preg_match('/^X-RateLimit-([a-z]+):\s([0-9]+)/i', $line, $match)) {
		    $this->_limits[$match[1]] = (int) $match[2];
	    }
	    return strlen($line);
    }
}


Также сам код на получение статистики
<?php
define('KEY', '');
define('SECRET', '');
$params = array(
    'start' => '2015-01-01 00:00:00',
    'end' => '2015-01-31 00:00:00'
);
$zd = new \Zadarma_API\Client(KEY, SECRET);
$answer = $zd->call('/v1/statistics/pbx/', $params);
$answerObject = json_decode($answer);
if ($answerObject->status == 'success') {
    print_r($answerObject->stats);
} else {
    echo $answerObject->message;
}
?>


Скажите как это все запихать в SNOOPY для получения stats по крону ? help .. :rolleyes: :rolleyes: :rolleyes:

#2 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 18 Декабрь 2015 - 13:50

все проще.
задорма отдают статистику просто по ссылке с секретным кодом, посмотреть можно внизу страницы отчета у них в ЛК.
код ниже берет операторов сиз таблицы, запрашивает статистику за вчера, парсит и записывает в отчет.

убирайте лишнее, если хотите (у меня каждому стоит стоимость минуты и сразу в отчет добавляется)
добавляйте в крон раз в день ночью.

проверку на корректность отслеживает крон, если будет сбой - запустить в ручную придется. но за пару месяцев сбоев не было...

//отчет на дату
$date = Date("Ymd",strtotime("-1 day"));
//$date = "20151031";
// таблица операторов
$ats_users = 490;
$ats_users_name = "f7180";
$ats_users_login = "f7190";
$ats_users_price = "f7200";
// таблица отчета
$ats_report = 500;
$ats_report_name = "f7250";
$ats_report_date = "f7260";
$ats_report_phone = "f7270";
$ats_report_time = "f7280";
$ats_report_price = "f7290";
$data_users1 = data_select_array($ats_users, 'ALL_ROWS', '`status`= 0');
foreach($data_users1 as $v){
  $data_users_tmp = array();
  $data_users2[$v[$ats_users_login]]['id'] = $v['id'];
  $data_users2[$v[$ats_users_login]]['price'] = $v[$ats_users_price];
}
$data_report = file_get_contents("https://ss.zadarma.com/mypbx/stat/export?secret=ВАШ СЕКРЕТНЫЙ КОД&start=".$date."000000&end=".$date."235959");
$tmp = str_getcsv($data_report , "\n");
foreach($tmp as $v) {
  $data_tmp = str_getcsv($v, ";");
  if(($data_tmp[4] == "incoming" || $data_tmp[5] == "answered") && strlen($data_tmp[1]) > 5 ) $data[] = $data_tmp;
}
 
foreach($data as $k => $v){
  //echo $v[0]." || ".$v[1]." || ".$v[2]." || ".$v[3]." || ".$v[4]." || ".$v[5]." || ".$v[6]."<br>";
  if($v[4] == "incoming"){
    if($v[5] == "no answer"){
	  // пишем неотвеченый вызов
	  data_insert($ats_report , EVENTS_ENABLE, array(
													 'status'=>'0',
													 $ats_report_name => 0,
													 $ats_report_date => $v[2],
													 $ats_report_phone => $v[3],
													 $ats_report_time => 0,
													 $ats_report_price => 0,
													 ));
    }else{
	  if($v[3] == $data[$k-1][3] && $data[$k-1][4] != "incoming"){
	    $ats_user_id = $data_users2[$data[$k-1][4]]['id'];
	    $ats_user_price = $data_users2[$data[$k-1][4]]['price'];
	  }elseif($v[3] == $data[$k+1][3] && $data[$k+1][4] != "incoming"){
	    $ats_user_id = $data_users2[$data[$k+1][4]]['id'];
	    $ats_user_price = $data_users2[$data[$k+1][4]]['price'];
	  }else {
	    $ats_user_id = 0;
	    $ats_user_price = 0;
	  }
	 
	  data_insert($ats_report , EVENTS_ENABLE, array(
													 'status'=>'0',
													 $ats_report_name => $ats_user_id,
													 $ats_report_date => $v[2],
													 $ats_report_phone => $v[3],
													 $ats_report_time => $v[6],
													 $ats_report_price => $v[6]*$ats_user_price/60,
													 ));
    }
  }
}
echo "done";


#3 Dinak

    Активный участник

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 22 Декабрь 2015 - 09:00

Спасибо коллега )))) в принципе ещё поразмыслив смог подключится к API, осталось немного разобраться со вставкой в КБ ))





Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных