Апр 13

Обновлено 29.01.2018. Изменен код для работы с расширением mysqli.

Созданы скрипты для интеграции сервиса Смотрёшка (API версии 2) в биллинг Netup UTM5. Прошу не ругать, код отвратительный, но я только начинаю. В качестве посредника для хранения lfstrm_id была использована база данных MySQL. Данные скрипты созданы с целью централизованной регистрации пользователей операторами биллинга. Мои костыли прекрасно подойдут для bandl и промо тарифов, самостоятельное подключение которых для абонентов закрыто.

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

  1. Регистрация учетной записи
  2. Запись пары account_id и lfstrm_id  в базу данных
  3. Отключение подписки
  4. Включение подписки
  5. Проверка на ранее зарегистрированную учетную запись

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

Я не стал использовать для работы с биллингом NetUP Utm5 разработанный на php пакет URFA, так как разобраться в его коде начинающим и «не программистам» довольно трудно. Да и заброс lfstrm_id  можно при желании организовать через MySQL прямо в базу биллинга, но так как база очень большая, я решил её не трогать и создать отдельную.
http://wiki.flintnet.ru/doku.php/urfaclient_admin.php

Создаем базу данных, пользователя и таблицу, куда будет записываться пара ACCOUNT_ID (параметр пользователя из биллинга Netup Utm5) и Lfstrm_id (генерируется при регистрации пользователя в панели оператора на сервере Смотрёшки).




1
2
3
4
5
6
7
mysql
CREATE DATABASE `smotreshka` CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER `smotreshka`@`localhost` IDENTIFIED BY `password123`;
GRANT ALL PRIVILEGES ON smotreshka.* TO `smotreshka`@`localhost`;
USE smotreshka;
CREATE TABLE lifestream (id INT AUTO_INCREMENT PRIMARY KEY, billing_id INT(10) NOT NULL, login VARCHAR(100) NOT NULL, lfstrm_id VARCHAR(100) NOT NULL);
DESCRIBE lifestream; quit;

РНР-скрипт, который будет проверять наличие у пользователя  Lfstrm_id в базе данных smotreshka и (при отсутствии параметра) регистрировать пользователя в панели оператора на сервере Смотрешки с последующей записью  Lfstrm_id в базу данных. Если параметр уже есть в базе данных, то пользователю добавляется iptv-пакет

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/local/bin/php
<!--php 
// Все параметры передаем скрипту через http запрос 
$login1 = $_GET["name"];  //хранит переменную LOGIN из биллинга NetUP UTM5 
$billing_id1 = $_GET["acid"]; //хранит переменную ACCOUNT_ID из биллинга NetUP UTM5 
$username1 = $billing_id1."__".$login1; //эта строка отправляется в панель оператора на сервер Смотрёшки 
$email1 = $_GET["mail"]; //хранит переменную EMAIL из биллинга NetUP UTM5 
$iptv_id1 = array($_GET["iptvid"]); //хранит id IPTV-пакета Смотрёшки, который подключается при регистрации пользователя на сервере Смотрёшки 
$iptv_id2 = $_GET["iptvid"]; //хранит id IPTV-пакета Смотрёшки, который подключается, если пользователь уже зарегистрирован на сервере Смотрёшки и имеет lfstrm_id 

// Для передачи параметров через ssh соединение, раскомментируйте нижние строки. 
// Пример команды: 
// #script_add.php LOGIN ACCOUNT_ID EMAIL id_iptv 
#$login1 = $argv[1]; 
#$billing_id1 = $argv[2]; 
#$username1 = $argv[2]."__".$argv[1]; 
#$email1 = $argv[3]; 
#$iptv_id1 = array($argv[4]); 
#$iptv_id2 = $argv[4]; 

//Это файл лога, который будет хранить информацию о регистрации пользователей на сервере Смотрёшки, 
//их lifestream id, а также время отключения и подключения тарифов 
$fd = fopen("/data/smotreshka/log/add_user.log", 'a+') or die("Error open file");
fwrite($fd," \n");
fwrite($fd, date(format).'__');
fwrite($fd, $billing_id1.'__');
fclose($fd);

//ваш url, предоставляемый менеджером Смотрёшки 
$api_string_url = "http://you_url_smotreshka.proxy.lfstrm.tv/v2/"; 

//функция для регистрации пользователя в панели оператора на сервере Смотрёшки 
function UserCreate($c, $username, $billing_id, $login, $email, array $iptv_id=['',]) 
{ 
global $api_string_url; 
$add_url = "accounts"; //согласно API Смотрёшки версии 2.0 
$body = array(  
'email' =--> $email,
'username' =&gt; $username,
'purchases' =&gt; $iptv_id //iptv-пакет, подключаемый по умолчанию. При необходимости, эту строку можно заккоментировать и убрать запятую после $username
);

$opts = array('http' =&gt;
array(
'method' =&gt; 'POST',
'header' =&gt; 'Content-type: application/x-www-form-urlencoded',
'content' =&gt; json_encode($body),
'timeout' =&gt; 60
)
);

$context = stream_context_create($opts);
$url = $api_string_url.$add_url; //согласно API Смотрёшки версии 2.0
$result = file_get_contents($url, false, $context);

//пишем ответ сервера Смотрешки в наш лог
$fd = fopen("/data/smotreshka/log/add_user.log", 'a+');
fwrite($fd, $result);

$obj=json_decode($result); //Вытащим из результата id, присваиваемый сервером Смотрёшки

$a = "insert into lifestream values ('".$billing_id."','".$billing_id."','".$login."','".$obj-&gt;id."')";

#$res = mysql_query($a);
$res = mysqli_query($c, $a, MYSQLI_USE_RESULT);
if ($res) echo $res;

//при возникновении ошибок с mysql пишем описание ошибки и её номер в лог
$me = ' MySQL error:'.mysql_error().'Error Num:'.mysql_errno();
fwrite($fd,$me);
fclose($fd);
mysqli_free_result($res);
}

//функция для добавления пользователю iptv-пакета
function subscribe($user_id, $billing_id, $iptv_id) {
global $api_string_url;

$add_url = "accounts/"; //согласно API Смотрёшки версии 2.0
$add_url2 = "/subscriptions"; //согласно API Смотрёшки версии 2.0
$body = array(
'id'=&gt;$iptv_id,
'valid'=&gt; true
);

$opts = array('http' =&gt;
array(
'method' =&gt; 'POST',
'header' =&gt; 'Content-type: application/x-www-form-urlencoded',
'content' =&gt; json_encode($body),
'timeout' =&gt; 60
)
);

$context = stream_context_create($opts);
$url = $api_string_url.$add_url.$user_id.$add_url2; //согласно API Смотрёшки версии 2.0
$result = file_get_contents($url, false, $context);
echo $result;

//Пишем в лог IPTV-подписку, которую получил пользователь
$fd = fopen("/data/smotreshka/log/add_user.log", 'a+') or die("Error open file");
fwrite($fd," \n");
fwrite($fd, date(format).'__');
fwrite($fd, $billing_id.'__');
fwrite($fd, 'IPTV_add__'.$result);
fclose($fd);

}

//проверяем по базе данных smotreshka, есть ли у пользователя биллинга lfstrm_id
#$c=mysql_connect("localhost:3306","smotreshka","password123");
#mysql_select_db("smotreshka",$c);
$c1=mysqli_connect('localhost:3306','smotreshka','password123','smotreshka');
$a = "select lfstrm_id from lifestream where id=".$billing_id1;
#$res = mysql_query($a);
#$array = mysql_fetch_array($res);
#echo $array[0];
$res = mysqli_query($c1, $a, MYSQLI_USE_RESULT);
$array = mysqli_fetch_array($res);
mysqli_free_result($res);
echo $array[0];
$res2 = $array[0];
if (($array[0]) == 0)
{
//lfstrm_id отсутствует, регистрируем
UserCreate($c1, $username1, $billing_id1, $login1, $email1, $iptv_id1);
}
else
{
//lfstrm_id уже есть, подключаем пользователю iptv-пакет
subscribe($res2, $billing_id1, $iptv_id2);
}
#mysql_close($c);
mysqli_close($c1);
?&gt;

РНР-скрипт, отключающий у зарегистрированного в Смотрёшке пользователя iptv-пакет

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/local/bin/php
<!--?php
$billing_id1 = $_GET["acid"];
$iptv_id1 = $_GET["iptvid"];

#$billing_id1 = $argv[1];
#$iptv_id1 = $argv[2];

//ваш url, предоставляемый менеджером Смотрёшки 
$api_string_url = "http://you_url_smotreshka.proxy.lfstrm.tv/v2/";

#$c=mysql_connect("localhost:3306","smotreshka","password123");
#mysql_select_db("smotreshka",$c);
$c=mysqli_connect("localhost:3306","smotreshka","password123","smotreshka");
$a = "select lfstrm_id from lifestream where id=".$billing_id1; //ищем lfstrm_id, соответствующий пользователю биллинга NetUP UTM5
#$res = mysql_query($a);
#$res1 = mysql_fetch_array($res);
#$res2 = $res1[0];
#mysql_close($c);
$res = mysqli_query($c, $a, MYSQLI_USE_RESULT);
$res1 = mysqli_fetch_array($res);
$res2 = $res1[0];
mysqli_free_result($res);
//функция для отключения iptv-пакета
function unsubscribe($user_id, $iptv_id) { 
global $api_string_url;

$add_url = "accounts/";  //согласно API Смотрёшки версии 2.0
$add_url2 = "/subscriptions";  //согласно API Смотрёшки версии 2.0
$body = array(
 'id'=-->$iptv_id,
'valid'=&gt; false
);

$opts = array('http' =&gt;
array(
'method' =&gt; 'POST',
'header' =&gt; 'Content-type: application/x-www-form-urlencoded',
'content' =&gt; json_encode($body),
'timeout' =&gt; 60
)
);
$context = stream_context_create($opts);
$url = $api_string_url.$add_url.$user_id.$add_url2; //согласно API Смотрёшки версии 2.0
$result = file_get_contents($url, false, $context);

echo $result;

}

unsubscribe($res2, $iptv_id1);
?&gt;
mysqli_close($c);

У нас возникла ситуация, когда пользователям были присвоены ТВ-тарифы, но в локальную базу данных не записался lifestream id. На сервере Смотрешки они зарегистрировались, и получили iptv-пакеты. Чтобы узнать lfstrm id, который почему-то не отображается в панели оператора Смотрешки, написал еще один РНР-скрипт, выгружающий со Смотрёшки инфу по всем пользователям.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/local/bin/php
<!--?php
//ваш url, предоставляемый менеджером Смотрёшки 
$api_string_url = "http://you_url_smotreshka.proxy.lfstrm.tv/v2/";

function UserInfo () {
global $api_string_url;

$add_url = "accounts?page_size=-1";

$opts = array('http' =-->
array(
'method' =&gt; 'GET',
'header' =&gt; 'Content-type: application/x-www-form-urlencoded',
'content' =&gt; json_encode($body),
'timeout' =&gt; 60
)
);

$context = stream_context_create($opts);
$url = $api_string_url.$add_url;
$result = file_get_contents($url, false, $context);
echo date(format);
echo "_____ \n";
echo $result;
}

UserInfo();

Теперь в биллинге необходимо создать тарифные планы Интернет+ТВ. В тарифные планы необходимо включить только услугу передачи IP трафика.
Для каждого комплексного тарифа требуется добавить четыре правила файрволла () (Настройки — Правила Firewall — Добавить). Два на подключение и отключение интернета. Остальные — на подключение и отключение iptv. Все правила срабатывают при наступлении событий «Включение интернета» или «Выключение интернета». В Названии тарифа выберите созданный комплексный тариф и установите галку на Совпадают все параметры.

У нас команды с файрволла передаются по ssh на микротик.

Примеры правил:

1
2
3
4
5
6
7
8
//включение интернета (событие Включение интернета)
/ip firewall address-list add address=UIP list=allow_list_tarif comment=UID
//включение ТВ (событие Включение интернета)
/tool fetch url="http://ip_биллинга/script_add.php\?name=LOGIN&acid=ACCOUNT_ID&mail=EMAIL&iptvid=117"
//выключение интернета (событие Выключение интернета)
/ip firewall address-list remove [find comment=UID]
//выключение ТВ (событие Выключение интернета)
/tool fetch url="http://ip_адрес_биллинга/script_off.php\?acid=ACCOUNT_ID&iptvid=117"

Если у вас настроен безпарольный ssh-доступ с Микротика на сервер биллинга, то правила включения-отключения ТВ можно заменить на следующие (дополнительно требуется раскоментировать начальные строки в скриптах):

1
2
3
4
//включение ТВ (событие Включение интернета)
/system ssh address=ip_адрес_биллинга user=admin command="/путь_к_скрипту/script_add.php LOGIN ACCOUNT_ID EMAIL 117"
//выключение ТВ (событие Выключение интернета)
/system ssh address=ip_адрес_биллинга user=admin command="/путь_к_скрипту/script_off.php ACCOUNT_ID 117"

Комментировать