По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Сегодня подробно расскажем как найти практическое применение знаниям, полученным в статье про структуру asteriskcdrdb, а именно, как сделать ежедневные отчеты о входящих звонках на почту.
Создание скрипта
Чтобы наш .php скрипт смог подключиться к базе данных, необходимо создать пользователя, с правами, которые буду позволять ему извлекать необходимую информацию. Для этого, подключимся к нашему серверу по SSH
[root@asterisk]# mysql
mysql>CREATE USER ' user'@'localhost' IDENTIFIED BY 'P@ssw0rd';
На данном этапе мы создали пользователя user с паролем P@ssw0rd. Далее дадим ему необходимые права:
mysql> GRANT SELECT ON asteriskcdrdb.cdr TO 'user'
Создадим файл с расширением .php, в котором мы отразим подключение к нашей базе данных. Запишем эту конструкцию так:
$hostname = "localhost"; //адрес хоста. Скрипт мы будем запускать на той же машине, на которой находится БД asteriskcdrdb;
$username = "user"; //отражаем пользователя
$password = "P@ssw0rd"; //пароль для созданного нами пользователя
$dbName = "asteriskcdrdb"; //база данных, в которой хранятся необходимые нам данные
$today = date('y-m-d'); // сегодняшняя дата в формате 2016-03-25
$counter = 1; // счетчик
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); // соединиться к БД
mysql_select_db($dbName) or die(mysql_error()); //выбрать базу данных. Если произойдет ошибка - вывести ее
$headers = "; charset=windows-1251
"; //заголовок для письма
$headers .= "From: Мерион Нетворкс <info@merionet.ru>
";
$headers .= "Reply-To: info@merionet.ru
";
Предположим, что все входящие звонки приходят на номер секретаря – 100. Так же мы знаем, что при звонке из города, мы видим номер звонящего, который содержит в себе больше 3 символов (пусть у нас используется трехзначная внутренняя нумерация). Наша задача сводится к формулировке запроса к таблице cdr. Добавляем к нашему .php файлу:
$query = "SELECT `dst` , `src` , `duration` , `dstchannel` , `calldate` , `disposition` FROM `cdr` WHERE `calldate` >='$today 00:00:00' AND `calldate` <='$today 23:59:59' AND LENGTH( `src` ) >3 AND `dst` = '100';" ;
$res=mysql_query($query) or die(mysql_error()); // Выполнить запрос. Если произойдет ошибка - вывести ее.
$number = mysql_num_rows($res); // Как много нашлось строк
У нас почти все готово. Осталось только обработать данные на выходе. Для этого, нам понадобится следующая конструкция:
//формируем шапку нашей таблицы со значениями
$mes .= '
table style="max-width: 575px;border-bottom:none; margin: 0 auto;border-spacing: inherit;">
thead>
tr style="border-bottom: 2px solid #05477c;">
th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Порядковый номер</th>
th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Дата</th>
th style="padding:10px; color: #fff; max-width: 100px;background:#05477c;">От кого</th>
th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Кому</th>
th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Статус звонка</th>
/tr>
/thead>';
//перебираем значения ассоциативного массива. Число элементов данного массива равно числу строк на выходе sql запроса
while ($row=mysql_fetch_array($res)) { $mes .= '
tbody>
tr style="width: 100px;">
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$counter.'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['calldate'].'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['src'].'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$row['dst'].'</td>
td style="padding:10px; text-align:center; border-bottom: 1px solid #eee; min-width: 120px; ">'.$row['disposition'].'</td>
/tr>';
$counter = $counter + 1;
}
Теперь, мы храним в переменной $mes html таблицу, которая готова к отправке на почту. Добавим в конец скрипта:
mail("info@merionet.ru", 'Все входящие за '.$today.'', $mes, $headers);
ВАЖНО! Если вы используете кириллические символы, установите кодировку .php файла на Кириллицу (windows-1251)
Итак, готово. Давайте посмотрим что приходит нам на почту:
Работает. Давайте сделаем ежедневное задание на отработку этого скрипта через cron. Сделаем, например, ежедневно, в 17:30, когда рабочий день подходит к концу:
30 17 * * * php /home/admin/mail_report.php
Не забудьте в начала скрипта поставить открывающий тэг php, а в конце скрипта закрывающий.
Информационные технологии стали важнейшей частью нашей жизни: прямо сейчас по одному клику можно вызвать такси
Использование REST API является полезной функцией для реализации ваших сценариев. Вы можете получить доступ к новым функциям, а также расширить возможности создания новых, более продвинутых сценариев.
Опыт многих пользователей показывает, что, когда начинаешь использовать REST API в скриптах, то чувствуешь себя довольно неуклюже и непривычно. В этой заметке мы обсудим:
Что такое REST API
Как читать документацию
Как использовать API REST с PowerShell
Некоторые советы и подсказки, как облегчить и улучшить практику
Что такое "REST"?
REST, или RESTful API, это API, который использует HTTP запросы для получения, добавления, удаления или манипулирования данными в различных сервисах.
Как правило, то, что нужно сделать с данными, решается тем, какой HTTP-метод вы используете. Вот краткий список методов HTTP и их применение в REST API:
GET-Read
POST-Create
PATCH-Partial update/modify
PUT-Update/replace
DELETE-Remove
Данные, которые возвращает API REST, обычно представляются в формате JSON.
Теперь давайте начнём с нашего первого API запроса!
Что такое API
Работа с документацией
Для использования различных API REST необходимо научиться читать и интерпретировать документацию. К счастью, если вы знаете, как читать один тип документации, вы сможете быстро научиться читать другие.
В этой статье мы используем petstore.swagger.io, так как он использует популярный фреймворк Swagger, который довольно часто используется в разработке.
На предыдущем рисунке показана наиболее важная информация о конечных точках REST API:
HTTP-метод-GET/POST/DELETE и т.д.
URL-адрес, связанный с конечной точкой REST API (Базовый URL, как правило, представлен в верхней части страницы документации)
Краткое описание
Подробности
Первая страница документации просто замечательная, и, как правило, с помощью этой информации можно выполнить большинство запросов, требующих использования метода HTTP GET. Но такие методы, как POST и SET, обычно требуют, чтобы вы щелкнули и развернули строку, чтобы получить больше информации.
Если вы нажмете на одну из строк, то получите информацию, которая выглядит так:
Здесь мы представили конечную точку REST, которая может создать новый объект pet. Здесь указывается, как должен выглядеть JSON, предоставленный в теле POST, и какой тип контента он принимает. Другие конечные точки REST указывают, что это за параметры, каким типом данных они должны быть и т.д.
Это основы для чтения документации. Теперь, когда общие принцип более-менее ясны, пора начать использовать REST API с PowerShell.
Получение первых данных (GET)
Используя REST API с PowerShell обычно довольно просто, используется встроенные командлеты, таким образом, нет необходимости в дополнительных модулях. Мы собираемся извлечь данные с помощью метода GET в конечной точке /pet/{ petId}.
Если развернуть конечную точку /pet/{ petId} в документации, можно увидеть, что {petId} на самом деле является параметром, который принимает целое число.
Это делает URL-адрес для выборки объекта pet с идентификатором 1: https://petstore.swagger.io/v2/pet/1
В документации SWAGGER REST API обычно отображается базовый URL-адрес в верхней части страницы.
Теперь начнем с PowerShell. Откройте окно терминала и введите:
PS51 > Invoke-RestMethod -Method GET -ContentType "application/json" -Uri "https://petstore.swagger.io/v2/pet/1"
id : 1
category : @{id=0; name=string}
name : doggie
photoUrls : {string}
tags : {@{id=0; name=string}}
status : available
Поскольку в ответе от сервера возвращается тип содержимого "application/json" используется метод Invoke-RestMethod, который автоматически преобразует возвращаемый JSON в объект.
Ошибка 404 Not found, как правило, означает, что объект не найден или URL-адрес введен неправильно.
Итак, мы выполнили первый вызов REST API. Но возможности метода GET для получения данных довольно ограничены, так что давайте создадим что-нибудь с помощью метода POST.
Создание объекта методом POST
Метод POST чаще всего используется для создания, например, пользователей или записей и т.д. Запрос POST отправляет BODY, содержащий информацию, конечной точке REST, обычно в формате JSON, но он также может быть в виде формы с кодировкой URL.
Вы узнаете, как создать объект JSON, который можно отправить в конечную точку/pet.
Можно увидеть, как должен выглядеть JSON, если развернуть строку POST/pet в документации.
Начнем с создания хэштаблицы, который можно преобразовать в объект JSON. Raw JSON следует избегать в скриптах PowerShell, поскольку он ограничивает его возможности.
$Body = @{
id = 19
category = @{
id = 45
name = "Whatever"
}
name = "Dawg"
photoUrls = @(
"string"
)
tags = @(
@{
id = 0
name = "string"
}
)
status = "available"
}
Если вам трудно создать хештаблицу, который преобразуется в нужный JSON, установите модуль PsdKit и используйте команду $ JsonString | ThreadTo-Psd
Теперь имеется хэш-таблица, которую можно преобразовать в строку JSON и POST в конечную точку/pet:
$JsonBody = $Body | ConvertTo-Json
$Uri = "https://petstore.swagger.io/v2/pet"
Invoke-RestMethod -ContentType "application/json" -Uri $Uri -Method Post -Body $JsonBody
id : 19
category : @{id=45; name=Whatever}
name : Dawg
photoUrls : {string}
tags : {@{id=0; name=string}}
status : available
При создании объекта он обычно получает созданный для подтверждения объект. Использование DELETE. Метод DELETE используется для удаления данных, а применение очень схоже с методом GET.
PS51 > Invoke-RestMethod -Method DELETE -ContentType "application/json" -Uri "https://petstore.swagger.io/v2/pet/1"
Только убедитесь, что не удалите ничего важного
Использование PUT
Метод PUT используется для обновления данных. Это делается аналогично методу POST путем представления полного или частичного объекта JSON:
PS51> $Body = [PSCustomObject]@{
id = 19
name = "Dawg with a new name"
}
PS51> $JsonBody = $Body | ConvertTo-Json
PS51> $Uri = "https://petstore.swagger.io/v2/pet"
PS51> Invoke-RestMethod -ContentType "application/json" -Uri $Uri -Method PUT -Body $JsonBody
id name photoUrls tags
-- ---- --------- ----
19 Dawg with a new name {} {}
Обычно API REST возвращает объект JSON с использованными и/или обновленными данными. Можно увидеть, что объект был обновлен с помощью метода GET:
PS 51> Invoke-RestMethod -ContentType "application/json" -Uri "https://petstore.swagger.io/v2/pet/19"
id : 19
category : @{id=45; name=Whatever}
name : Dawg with a new name
photoUrls : {string}
tags : {@{id=0; name=string}}
status : available
Создание функций
Писать эти команды каждый раз вручную может стать довольно утомительным и на самом деле не масштабируемым. Если мы вызываем конечную точку несколько раз, то лучше создать для нее функцию. Это довольно просто и нужно написать всего несколько строк:
Function Get-PetstorePet {
[cmdletbinding()]
param(
# Id of the pet
[Parameter(Mandatory,ValueFromPipeline)]
[int]$Id
)
Begin{}
Process{
$RestMethodParams = @{
Uri = "https://petstore.swagger.io/v2/pet/$Id"
ContentType = "application/json"
Method = "GET"
}
Invoke-RestMethod @RestMethodParams
}
End{}
}
После создания функции ее можно вызвать в сценарии:
PS51> Get-PetstorePet -Id 1
id name photoUrls tags
-- ---- --------- ----
1 Doggie {http://picture.url} {}
Это можно сделать и для метода POST для создания нового объекта pet в Petstore:
Function Add-PetstorePet {
[cmdletbinding()]
param(
# Id of the pet
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[int]$Id,
# Name of the pet
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[string]$Name,
# Status of the pet (available, sold etc)
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[string]$Status,
# Id of the pet category
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[int]$CategoryId,
# Name of the pet category
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[string]$CategoryName,
# URLs to photos of the pet
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[string[]]$PhotoUrls,
# Tags of the pets as hashtable array: @{Id=1;Name="Dog"}
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[Hashtable[]]$Tags
)
Begin{}
Process{
$Body = @{
id = $Id
category = @{
id = $CategoryId
name = $CategoryName
}
name = $Name
photoUrls = $PhotoUrls
tags = $Tags
status = $Status
}
$BodyJson = $Body | ConvertTo-Json
$RestMethodParams = @{
Uri = "https://petstore.swagger.io/v2/pet/"
ContentType = "application/json"
Method = "Post"
Body = $BodyJson
}
Invoke-RestMethod @RestMethodParams
}
End{}
}
И вызов этой функции PowerShell намного упрощает задачу:
PS51> $AddPetStorePetsParams = @{
Id = 44
Name = "Birdie"
Status = "available"
CategoryId = 50
CategoryName = "Hawks"
PhotoUrls = "https://images.contoso.com/hawk.jpg"
Tags = @(
@{
Id=10
Name="Not eagles"
}
)
}
PS51> Add-PetStorePet @AddPetStorePetsParams
id : 44
category : @{id=50; name=Hawks}
name : Birdie
photoUrls : {https://images.domain.com/hawk.jpg}
tags : {@{id=0}}
status : available
Возможно, что многие модули, которые вы ежедневно используете, состоят из функций, который за кулисами используют REST API.
Заключение
Обучение работы с REST API, главным образом основано на чтении документации. Мы использовали документацию на основе SWAGGER в этом посте, так как она представляет, как могут выглядеть другие стили документации.
Кроме того, преобразование вызовов API в функцию может сэкономить много времени, упростить работу и очистить сценарии.