API для получения баланса

В данном форуме описаны все API, поддерживаемые нашими услугами.

API для получения баланса

Сообщение sd » 20 сен 2010, 14:55

Отправка запроса на получение баланса

Для получения баланса необходимо отправить HTTPS запрос по адресу:

Код: Выделить всё
http://api.comtube.ru/scripts/balance/balance.php

В дополнение к адресу необходимо передавать следующие параметры:

  • username – логин пользователя (обязательный параметр)
  • type – указывает, в каком виде возвращать результат. Возможные значения: xml, html (обязательный параметр).
  • signature – подпись запроса (обязательный параметр). Как создать подпись смотрите раздел "Создание подписи (signature)"

Хотим обратить внимание, что в частом обращении к данному сервиса ваш IP адрес будет заблокирован не некоторое время.

Обработка результата запроса

После обработки запроса возвращается XML или HTML страница с результатом. Ниже приводится HTML формат ответа:

Код: Выделить всё
code:200
desc:OK
crcy:RUB
balance:417.85


В первой строке указывается код выполнения операции code:

  • 200 - успешное выполнение
  • 401 - ошибка авторизации. Не указан логин пользователя
  • 403 - учетная запись заблокирована
  • 404 - ошибка авторизации. Некорректно сформирована подпись
  • 500 - системная ошибка

Поле desc предоставляет дополнительное описание ошибки.
Поле crcy указывает валюту, в которой приводится баланс.
Поле balance указывает непосредственно ваш баланс.

Пример отправки запроса и обработки ответа

Ниже приведен пример на языке программирования PHP для работы с данным API.

Код: Выделить всё
<?php

include_once('signature.inc');

$baseurl = "http://api.comtube.ru/scripts/balance/balance.php";

// Создаем массив и заполняем его параметрами
$params = array();
$params['username'] = 'mylogin';
$params['type'] = 'html';

// Создаем подпись к параметрам
$urlparams = BuildUrlParamsWithSignature($params, "mypwd");

// Формируем полный URL для обращения к серверу
$url = $baseurl . "?" . $urlparams;

// Инициализируем curl и отправляем запрос
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$data = curl_exec($ch);
curl_close($ch);

// Анализируем результат
$matches = array();
preg_match("/code:([0-9]+)<br>desc:(.*)<br>crcy:(.*)<br>balance:([0-9.]+)/", $data, $matches);

if (count($matches) > 0)
{
  $code = $matches[1];
  $desc = $matches[2];
  $crcy =  $matches[3];
  $balance =  $matches[4];

  if ($code != 200)
  {
    // При обработке запроса произошла ошибка
    echo "Failed to request balance, reeson: " . $desc . " (" . $code . ")";
  }
  else
  {
    // Успешное выполнение запроса
    echo "Your balance is " . $balance . " " . $crcy;
  }
}
else
{
  // Получен неправильный ответ от сервера
  echo "Invalid result";
}

?>
Аватара пользователя
sd
 
Сообщения: 5184
Зарегистрирован: 31 июл 2009, 13:11

Re: API для получения баланса

Сообщение malec » 06 дек 2012, 11:50

Рабочий код для VB.NET 3.5
Использую куски данного примера можно выполнять любые запросы. Удачного кодинга!
Код: Выделить всё
Imports System.Xml
Imports System.Data
Imports System.IO
Public Class Form1
    Function getMD5Hash(ByVal strToHash As String) As String
        Dim md5Obj As New Security.Cryptography.MD5CryptoServiceProvider
        Dim ByteHash() As Byte = System.Text.Encoding.Default.GetBytes(strToHash)
        ByteHash = md5Obj.ComputeHash(ByteHash)
        Dim strResult As String = ""
        For Each b As Byte In ByteHash
            strResult += b.ToString("x2")
        Next
        Return strResult
    End Function

    Public Function eescape(ByVal text As String)
        eescape = (Uri.EscapeDataString(text).Replace("%20", "+").Replace("!", "%21").Replace("*", "%2A").Replace("(", "%28").Replace(")", "%29").Replace("'", "%27"))
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Формируем ссылку с сигнатурой
        Dim LOGIN_USER As String = "LOGIN"               ' Логин пользователя
        Dim PASSWORRD_USER As System.Object = "PASSWORD"    ' Пароль пользователя

        Dim urlAPI As String = "http://api.comtube.com/scripts/api/user.php"

        Dim URL As String = (urlAPI & "?" & "type=xml&username=" & eescape(LOGIN_USER) & "&signature=" & _
                             getMD5Hash("type=xml&username=" & eescape(LOGIN_USER) & "&&password=" & eescape(PASSWORRD_USER)))

        Dim xmldoc As New XmlDataDocument()

        Dim Buffer As Byte() = (New Net.WebClient).DownloadData(URL)
        Dim FROM_STREAM As New MemoryStream(Buffer)
        xmldoc.Load(FROM_STREAM)

        Select Case xmldoc.CreateNavigator.SelectSingleNode("/result/code").Value
            Case Is = 200
                MsgBox(xmldoc.CreateNavigator.SelectSingleNode("/result/userinfo/balance").Value & " руб.")
            Case Is <> 200
                MsgBox(xmldoc.CreateNavigator.SelectSingleNode("/result/desc").Value, MsgBoxStyle.Critical, "Ошибка ")
        End Select
    End Sub
End Class

За помощь спасибо sd
Вложения
balanscomtube.zip
Проект VB.NET 3.5 /2013/
(81.22 Кб) Скачиваний: 5839
2014-05-23 17-57-43 Баланс Comtube.png
2014-05-23 17-57-43 Баланс Comtube.png (2.67 Кб) Просмотров: 124852
Последний раз редактировалось malec 23 май 2014, 18:27, всего редактировалось 2 раз(а).
Изображение
Аватара пользователя
malec
 
Сообщения: 47
Зарегистрирован: 17 янв 2012, 18:19

Re: API для получения баланса

Сообщение fremdling » 26 фев 2013, 11:34

Возник следующий вопрос. По этому API можно ли как-либо отслеживать состояние приобретённого "СМС пакета"? Как я полагаю рассылка СМС при наличии "СМС пакета" не должна влиять на изменение баланса ( ну кроме Скайлинка). Но в таком случае, как следить за состоянием израсходования "СМС пакета" сколько СМС ещё можно отправить, к примеру?
fremdling
 
Сообщения: 5
Зарегистрирован: 11 фев 2013, 10:05

Re: API для получения баланса

Сообщение BubnovRV » 26 фев 2013, 11:37

Присоединяюсь к вопросу про пакеты СМС
BubnovRV
 
Сообщения: 192
Зарегистрирован: 06 мар 2012, 05:41
Откуда: Новосибирск

Re: API для получения баланса

Сообщение sd » 26 фев 2013, 23:18

Да, хороший вопрос - API по получении информации по пакетам будет сделано. Придется подождать немного, однако.
Аватара пользователя
sd
 
Сообщения: 5184
Зарегистрирован: 31 июл 2009, 13:11

Re: API для получения баланса

Сообщение tveritin » 18 авг 2017, 12:47

Вот проверенный java-код, может кому пригодится.

Код: Выделить всё
package javaapplication1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import java.net.URLEncoder;
import java.security.*;

/**
 *
 * @author Aspire
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    String myURL = "http://api.comtube.ru/scripts/balance/balance.php?";

    try {
        HashMap<String, String> hashmap = new HashMap<String, String>();
        hashmap.put("username", "логин");
        hashmap.put("type", "html");
        String url1 = myURL + buildUrlParamsWithSignature(hashmap,"пароль");
         System.out.println("URL... " + url1);
       
        URL url = new URL(url1);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.getContent();
       
   BufferedReader in = new BufferedReader(
                              new InputStreamReader(connection.getInputStream()));
   String inputLine;
   StringBuffer html = new StringBuffer();

   while ((inputLine = in.readLine()) != null) {
      html.append(inputLine);
   }
   in.close();
        connection.disconnect();

        System.out.println("Output... " + html.toString());
       
       
   in.close();
        connection.disconnect();



    } catch (Exception e) {
   e.printStackTrace();
    }
   
    }
   
   
   
   
private static String convertToHex(byte[] data)
{
    StringBuffer buf = new StringBuffer();

    for (int i = 0; i < data.length; i++)
    {
        int halfByte  = (data[i] >>> 4) & 0x0F;
        int twoHalfs = 0;

        do
        {
            if ((0 <= halfByte) && (halfByte <= 9))
                buf.append((char)('0' + halfByte));
            else
                buf.append((char)('a' + (halfByte - 10)));

            halfByte = data[i] & 0x0F;
        } while(twoHalfs++ < 1);
    }

    return buf.toString();
}

private static String buildUrlParamsWithSignature(HashMap<String, String> params, String password)
{
    String   url  = "";
    Object[] key  = params.keySet().toArray();

    // Sort parameters by key (server side functions do the same).
    Arrays.sort(key);

    try
    {
        for (int i = 0; i < key.length; i++)
        {
            if (params.get(key[i]) != null)
            {
                String value = URLEncoder.encode(params.get(key[i]).toString(), "UTF8");
               
                // Java bug workaround.
                value = value.replace("*", "%2A");
                value = value.replace("~", "%7E");
               
                url += key[i] + "=" + value + "&";
            }
        }

        MessageDigest md5 = MessageDigest.getInstance("MD5");

        md5.reset();
        md5.update((url + "&password=" + URLEncoder.encode(password, "UTF8")).getBytes());

        url += "signature=" + convertToHex(md5.digest()).toLowerCase();
    }
    catch (java.security.NoSuchAlgorithmException e)
    {
        // Обалдеть - нет алгоритма MD5.
        url = "";
    }
    catch (java.io.UnsupportedEncodingException e)
    {
        // Плохо - нет поддержки UTF8. Возможно, подойдет иная системная кодировка.
        url = "";
    }

    return url;
}


}


tveritin
 
Сообщения: 3
Зарегистрирован: 28 сен 2015, 11:21

Re: API для получения баланса

Сообщение tveritin » 19 авг 2017, 13:50

Соблюдая авторские права, сообщаю, что методы создания сигнатуры заимствованы у пользователя alg, за это ему отдельное спасибо.
tveritin
 
Сообщения: 3
Зарегистрирован: 28 сен 2015, 11:21


Вернуться в API

Просмотр страницы «Кто сейчас на форуме COMTUBE»

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9