diff --git a/providers/ab-bonus-magnit/anybalance-manifest.xml b/providers/ab-bonus-magnit/anybalance-manifest.xml
new file mode 100644
index 000000000..0d5ec31c1
--- /dev/null
+++ b/providers/ab-bonus-magnit/anybalance-manifest.xml
@@ -0,0 +1,31 @@
+
+
+ ab-bonus-magnit
+
+ Магнит
+ Предоставляет информацию о балансе на бонусной карте сети магазинов Магнит https://magnit.ru
+ Информация берется из личного кабинета https://moy.magnit.ru
+ ]]>
+ Для использования провайдера необходимо активировать карту Магнит в личном кабинете https://moy.magnit.ru
+ ]]>
+ AnyBalance Team <info@anybalance.ru>
+
+
+
+
+ icon.png
+ preferences.xml
+ main.js
+ history.xml
+
+
+
+
+
+
+
+ bonus
+ ru
+
\ No newline at end of file
diff --git a/providers/ab-bonus-magnit/history.xml b/providers/ab-bonus-magnit/history.xml
new file mode 100644
index 000000000..90fd8b007
--- /dev/null
+++ b/providers/ab-bonus-magnit/history.xml
@@ -0,0 +1,11 @@
+
+
+
+ - Первая версия провайдера.
+
+
+
\ No newline at end of file
diff --git a/providers/ab-bonus-magnit/icon.png b/providers/ab-bonus-magnit/icon.png
new file mode 100644
index 000000000..90fdfb05a
Binary files /dev/null and b/providers/ab-bonus-magnit/icon.png differ
diff --git a/providers/ab-bonus-magnit/main.js b/providers/ab-bonus-magnit/main.js
new file mode 100644
index 000000000..95c8f44d8
--- /dev/null
+++ b/providers/ab-bonus-magnit/main.js
@@ -0,0 +1,131 @@
+
+/**
+Провайдер AnyBalance (http://any-balance-providers.googlecode.com)
+*/
+
+var g_headers = {
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Charset': 'windows-1251,utf-8;q=0.7,*;q=0.3',
+ 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
+ 'Connection': 'keep-alive',
+ // Mobile
+ //'User-Agent':'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+',
+ // Desktop
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36',
+};
+
+var g_apiHeaders = {
+ 'Connection': 'Keep-Alive',
+ 'User-Agent': 'okhttp/3.12.0'
+};
+
+function callApi(verb, postParams, addH){
+ var method = 'GET';
+ var h = g_apiHeaders;
+ if(isset(postParams)){
+ method = 'POST';
+ }
+
+ if(addH)
+ h = addHeaders(addH, h);
+
+ var html = AnyBalance.requestPost('https://moy.magnit.ru/b2c/' + verb, postParams, h, {HTTP_METHOD: method});
+
+ if(!html)
+ return {__empty: true};
+
+ var json = getJson(html);
+ if(json.error && json.error !== 'OTP_REQUIRED'){
+ AnyBalance.trace(html);
+ throw new AnyBalance.Error(json.message, null, /парол|password/i.test(json.error.description));
+ }
+
+ return json;
+}
+
+function login(){
+ var prefs = AnyBalance.getPreferences();
+ delete g_apiHeaders.Authorization;
+
+ var json = callApi('login', {
+ username: '7' + prefs.login,
+ password: prefs.password,
+ channel: 'O',
+ mobileSystem: 'A'
+ });
+
+ if(json.error === 'OTP_REQUIRED'){
+ AnyBalance.trace(json.message);
+ var code = AnyBalance.retrieveCode('Пожалуйста, введите код из SMS для входа в ЛК Магнит', null, {inputType: 'number', timeout: 180000});
+ json = callApi('login', {
+ username: '7' + prefs.login,
+ password: prefs.password,
+ channel: 'O',
+ mobileSystem: 'A'
+ }, {
+ 'X-CLM-OTP-Token': code
+ });
+ }
+
+ if(!json.access_token){
+ AnyBalance.trace(JSON.stringify(json));
+ throw AnyBalance.Error('Не удалось зайти в личный кабинет. Сайт изменен?');
+ }
+
+ AnyBalance.setData('login', prefs.login);
+ AnyBalance.setData('access_token', json.access_token);
+ AnyBalance.setData('refresh_token', json.refresh_token);
+ AnyBalance.saveData();
+}
+
+function setAuthHeaders(){
+ var at = AnyBalance.getData('access_token');
+ g_apiHeaders.Authorization = 'Bearer ' + at;
+ //g_apiHeaders.queryMode = '2';
+}
+
+function main() {
+ var prefs = AnyBalance.getPreferences();
+ AnyBalance.setDefaultCharset('utf-8');
+
+ AB.checkEmpty(prefs.login, 'Введите номер телефона!');
+ AB.checkEmpty(/^\d{10}$/.test(prefs.login), 'Введите 10 цифр номера телефона без пробелов и разделителей, например, 9261234567 !');
+ AB.checkEmpty(prefs.password, 'Введите пароль!');
+
+ var _login = AnyBalance.getData('login');
+ if(_login !== prefs.login){
+ login();
+ }
+
+ setAuthHeaders();
+ var json;
+
+ try{
+ json = callApi('me');
+ if(json.anonymized)
+ throw new AnyBalance.Error('Not logged in');
+ }catch(e){
+ //Надо бы по рефреш токену восстановить здесь доступ
+ //но пока просто логин
+ login();
+ setAuthHeaders();
+
+ json = callApi('me');
+ if(json.anonymized){
+ AnyBalance.trace(JSON.stringify(json));
+ throw new AnyBalance.Error('Не удалось зайти в личный кабинет после попытки авторизации. Сайт изменен?');
+ }
+ }
+
+
+ var result = {
+ success: true
+ };
+
+ AB.getParam(json.mainPointsBalance/100, result, 'balance');
+ AB.getParam(json.firstName, result, 'fio');
+ AB.getParam(json.mainIdentifier, result, '__tariff');
+ AB.getParam(json.statusName, result, 'status');
+
+ AnyBalance.setResult(result);
+}
diff --git a/providers/ab-bonus-magnit/preferences.xml b/providers/ab-bonus-magnit/preferences.xml
new file mode 100644
index 000000000..88b49b847
--- /dev/null
+++ b/providers/ab-bonus-magnit/preferences.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file