У zadarma.com есть API к их сервисам на языке php, но на моих серверах этот язык отсутствует. Ставить php ради обращений к задармам желания не было. Поискал в интернете не нашел ничего для perl и python.
Написал для себя, что получилось под катом.
Perl
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use feature 'say';
use Digest::SHA qw(hmac_sha1_hex);
use MIME::Base64 qw( encode_base64 );
use Digest::MD5 qw(md5_hex);
use LWP::UserAgent;
use Tie::Hash::Sorted;
use Data::URIEncode qw(complex_to_query);
#-------------------------------------------------------------------------------
# Конфиг API, путь для обращения и данные для передачи
#-------------------------------------------------------------------------------
my $api_key = 'В личном кабинете zadarma.com -> API поле Key';
my $secret_key = 'В личном кабинете zadarma.com -> API Secret';
my $path = '/v1/info/balance/';
my %data = ( 'format' => 'json', );
#-------------------------------------------------------------------------------
# Обработка и формирование авторизационной строки
#-------------------------------------------------------------------------------
tie my %sorted_data, 'Tie::Hash::Sorted', 'Hash' => %data;
my $query_string = complex_to_query( %sorted_data );
my $data = $path . $query_string . md5_hex($query_string);
my $digest = hmac_sha1_hex( $data, $secret_key );
my $auth = $api_key . ':' . encode_base64($digest);
#-------------------------------------------------------------------------------
# Отправка запроса и получение ответа через LWP
#-------------------------------------------------------------------------------
my $browser = LWP::UserAgent->new;
my @ns_headers = (
'User-Agent' => '-',
'Authorization' => $auth,
);
my $url = 'https://api.zadarma.com' . $path . '?' . $query_string;
my $response = $browser->get( $url, @ns_headers );
if ( $response->is_success ) {
say $response->decoded_content;
}
else {
die $response->status_line;
}
Результат:
{"status":"success","balance":53.4024,"currency":"USD"}
Для примера, есть метод "/v1/statistics/ — получение общей статистики", надо передать период от и до, чтобы получить статистику за период. Изменим несколько строк:
my $path = '/v1/statistics/';
my %data = (
'format' => 'json',
'start' => '2016-01-02',
'end' => '2016-03-04'
);
Остальное остается без изменений.
По аналогии и с остальными методами.
Python
#!/usr/bin/python
# -*- coding: utf8 -*-
from hashlib import sha1, md5
from collections import OrderedDict
from urllib import urlencode
import hmac
import requests
#-------------------------------------------------------------------------------
# Личные данные API и путь для обращения
#-------------------------------------------------------------------------------
api_key = 'В личном кабинете zadarma.com -> API поле Key'
secret_key = 'В личном кабинете zadarma.com -> API Secret'
path = '/v1/info/balance/'
data = { 'format': 'json'}
#-------------------------------------------------------------------------------
# Обработка и формирование авторизационной строки
#-------------------------------------------------------------------------------
od = OrderedDict(sorted(data.items()))
query_string = urlencode(od)
h = md5(query_string)
data = path + query_string + h.hexdigest()
hashed = hmac.new(secret_key, data, sha1)
auth = api_key + ':' + hashed.hexdigest().encode("base64")
#-------------------------------------------------------------------------------
# Отправка запроса и получение ответа
#-------------------------------------------------------------------------------
headers = {'User-Agent': '-', 'Authorization': auth}
url = 'https://api.zadarma.com' + path + '?' + query_string;
r = requests.get(url, headers=headers)
print(r.text)
Результат:
{"status":"success","balance":53.4024,"currency":"USD"}
В API есть методы, которые ждут дополнительных параметров при приеме.
Для примера, есть метод "/v1/statistics/ — получение общей статистики", надо передать период от и до, чтобы получить статистику за период. Изменим несколько строк:
path = '/v1/statistics/'
data = { 'format': 'json', 'start': '2016-03-03', 'end': '2016-05-05'}
Остальное остается без изменений.
По аналогии и с остальными методами.
Github
- Perl — Ссылка на github.
- Python — Ссылка на github
Автор: pcdesign