API к zadarma.com на perl и python

в 5:35, , рубрики: api, perl, python, Zadarma, метки:

API к zadarma.com на perl и python - 1
У zadarma.com есть API к их сервисам на языке php, но на моих серверах этот язык отсутствует. Ставить php ради обращений к задармам желания не было. Поискал в интернете не нашел ничего для perl и python.
Написал для себя, что получилось под катом.

Perl

Получение баланса через API
#!/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;
}

Результат:

Ответ в формате json

{"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

Получение баланса через API

#!/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)

Результат:

Ответ в формате json

{"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

Автор: pcdesign

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js