• Есть ли единое API для доступа к данным чека онлайн касс?

    @IvanG
    <тут был старый ответ, на устаревшее апи>
    информация по новому апи (август 2020)
    тут в комментах: leftjoin.ru/all/sobiraem-dannye-s-chekov-gipermark...
    и тут в ишью разбирают новый формат запросов:
    https://github.com/kosov/fns-check/issues/3#issuec...
    https://github.com/DmitriyBobrovskiy/CheckReceiptS...

    спойлер - чуть усложнилось, нужно получать сессионный айди, который живет пару дней, а после обновляеть его по токену (сессия и токен первоначально при верификации номера / регистрации выдаются, дальше при обновлении сессии сразу пара обновляется токен/сессионный ключ)

    p.s. ссылки взяты из темы обсуждения приложения, может еще что полезное там есть: https://4pda.ru/forum/index.php?showtopic=835790&s...
    Ответ написан
    3 комментария
  • Есть ли единое API для доступа к данным чека онлайн касс?

    @sb_user
    Каждый ОФД имеет свой API. Т.е. если вы пишите софт под определенную кассу, то необходимую ссылку вы собрать сможете
    Например ссылка на чек такскома будет выглядить так:
    https://receipt.taxcom.ru/v01/show?fp=[fpd]&s=[sum...
    где fpd - фискальная подпись документа
    summ - итоговая сумма чека

    Для ofd.ru будет выглядить вот так:
    https://ofd.ru/rec/[inn]/[rn]/[fn]/[docNumb]/[fpd]
    inn - инн юр лица пробившего чек
    rn - рег. номер кассового аппарата
    fn - номер фискального накопителя
    docNumb - номер чека
    fpd - фискальная подпись

    Но согласен, ответ на вопрос интересен =) Если будет универсальный API единый для всех, то это конешно удобнее.
    Ответ написан
  • Есть ли единое API для доступа к данным чека онлайн касс?

    @BorisKorobkov
    Web developer
    QR-код на чеке дублирует ту же самую информацию, что и человек может прочитать на чеке.

    Куда именно приложение ФНС отправляет данные для проверки, вы можете проверить самостоятельно, если установите их программу https://kkt-online.nalog.ru/ и воспользуетесь любым сниффером.

    Также можно проверить чек на
    https://kpkcheck.ru/System/ExpressCheck.aspx
    https://ofd.ru/checkinfo
    https://ofd-ya.ru/check
    https://consumer.1-ofd.ru/#/landing
    и пр.
    Ответ написан
    3 комментария
  • Что Вы сделали из своей raspberry pi, orange pi и т.п.?

    @famidur
    Вариантов применения полно
    - для просмотра фильмов
    - умный дом
    - wifi роутер с шифрованрем трафика (например через тор или впн)
    - веб сервер
    - снифер трафика и его анализ
    - onion сервер
    Ответ написан
    Комментировать
  • Как подключенить ардуино к домофону?

    Teivaz
    @Teivaz
    Ответ написан
    Комментировать
  • Разные курсы биткоина, где реальный?

    @nirvimel
    Во-первых, что такое реальный курс? Для фиатных валют (только СКВ) это сумма в резервной валюте, по которой сам эмитент готов выкупать обратно свои же денежные единицы. Например, Центробанк обязуется выкупить каждый свой выпущенный рубль за 1/30 USD (в 2013 году, например), эта гарантия выкупа и обеспечивает валюту реальной стоимостью, без этой гарантии любая валюта - просто фантики. Для не-СКВ не существует аналога понятия "реальный курс", так как формально заявленный курс в отсутствии реальной возможности что-то по нему реализовать - просто бессмысленная цифра.

    Теперь перейдем к децентрализованным валютам. У них не существует определенного эмитента и никто не дает гарантий их обратного выкупа. Что же наполняет их стоимостью? Только мгновенный (на данную секунду) спрос на них. В чем физически выражается спрос на биткоин, например? Это просто объем ликвидности, который стоит на бирже в ордерах на покупку ниже по курсу, то есть то "мясо", в которое зароется и упрется курс если начнет валиться вниз. Но суммарный объем этой ликвидности на порядок ниже объема открытых позиций в биткоинах, так что реальная обеспеченность биткоина (даже мгновенная) составляет единицы-десятки процентов.

    Что касается реального курса. Курс это возможность вернуть назад купленные фантики за определенное количество реальных денег. Очевидно, эта возможность полностью завит от биржи. Но я удивлю вас еще больше: эта возможность зависит еще и от объема вашей позиции, которую вы закрываете. Та цифра, которую вы видите на биржевом табло - это возможность продать один сатоши (или какой там минимальный объем лота на вашей бирже) в эту секунду. Как только вы попытаетесь продать больше, курс мгновенно дернется вниз еще до того, как исполнится ваш ордер. Так что вам никогда не удастся продать 1000 BTC по цене с табло (и даже близко к этому), рынок рухнет раньше, он не примет такой объем по такой цене. Так что держатель позиции с трехзначным числом BTC должен рассчитывать у себя в голове совсем другой курс продажи.
    Ответ написан
    Комментировать
  • Как организовать уведомление о новой заявке на landing page в личку VK?

    @vshvydky
    Открыть описание методов вк апи, на сервере у себя сделать приемку пост, гет с лендинга и по апи сообщать себе.... вроде очевидно же.
    Ответ написан
    2 комментария
  • Как организовать уведомление о новой заявке на landing page в личку VK?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Варианты:
    1. личное сообщение сообщение от вашего «запасного» аккаунта ВК;
    2. сообщение от Сообщества (группы);
    3. уведомление от Приложения ВК;
    4. смс (платно).

    Метод messages.send() отправляет сообщение от пользователя или сообщества; secure.sendNotification() – уведомление от приложения; secure.sendSMSNotification() – эсэмэсина от приложения. Наверное, лучше сделать сообщение от Сообщества.

    Создайте себе новую закрытую группу, где будете только вы. Включите сообщения сообщества и получите ключ (просто скопируйте его из Настроек сообщества – Работа с API.

    При событии в лендинге откройте скриптом ссылку API ВКонтакта, например, так:
    $url = "https://api.vk.com/method/messages.send";
    $params = [
    	'user_id' => 123456, // ваш user_id в ВК
    	'message' => 'Новая заявка!',
    	'access_token' => $TOKEN, // токен сообщества
    	'v' => 5.62
    ];
    $url = $url . '?' . http_build_query($params);
    file_get_contents($url);
    Ответ написан
    1 комментарий
  • Как решить проблему с концентрацией?

    saboteur_kiev
    @saboteur_kiev Куратор тега Организация работы
    software engineer
    Мозг работает так, как он привык работать.

    Все, чего вы сейчас достигли (отвлекаться на свои мысли вместо того, чтобы заниматься текущей задачей), вы нарабатывали долгим и упорным трудом всю предыдущую жизнь.

    Нарабатывать умение концентрироваться на неприятных и неинтересных вещах делается таким же способом - стараетесь через силу регулярно это делать. Через несколько лет мозг привыкнет к новому поведению.
    Можно это назвать силой воли - умение осознанно приспособиться к некомфортным условиям.

    P.S. С детства такие вещи тренируются. Чем взрослее тем сложнее, и даже факт того что ты осознаешь конкретный недостаток не облегчает того, что избавиться от него тяжело.
    Ответ написан
    2 комментария
  • Как разделить .xlsx по строкам?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Если файл сохранён на диске, можно так:
    1. Открываете книгу с данными на нужном листе
    2. Заходите в VBA (Alt+F11)
    3. Выбираете в меню Insert -> Module
    4. Вставляете нижеприведённый код
    5. Нажимаете F5 (не сохраняете исходный файл)

    Option Explicit ' Обязательное объявление переменных
    Option Base 1 ' Нижняя граница массива (по умолчанию)
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Border_Limit()
      Dim Limit As Integer, Count As Integer, SaveDir As String, SetTitle As Boolean
      
      Count = 1: Limit = 1000 ' Счётчик файлов; Количество строк
      SetTitle = False ' Если есть заголовок, заменить False на True
      
      SaveDir = ThisWorkbook.Path ' Или вписать полный путь для сохранения "C:\"
      ' Предполагается, что в колонке A нет пустых ячеек
      While Not IsEmpty(Cells(IIf(SetTitle, 2, 1), 1))
        Rows("1:" & Limit).Copy
        Workbooks.Add xlWBATWorksheet ' Создать новую книгу: шаблон с 1 листом
        ActiveSheet.Paste: Cells(1, 1).Select
        ActiveWorkbook.SaveAs Filename:=SaveDir & "\Массив_" & Count & ".xlsx", _
          FileFormat:=xlOpenXMLWorkbook
        ActiveWindow.Close
        Rows(IIf(SetTitle, 2, 1) & ":" & Limit).Delete Shift:=xlUp
        Count = Count + 1
      Wend: MsgBox "Файл разбит на " & Count - 1 & " файл(ов). "
    End Sub

    Никакие C++ запускать не надо.

    Для пытливых умов: Отказ от Слияния в пользу шаблонов https://toster.ru/q/320942
    Ответ написан
    5 комментариев
  • Как получить данные о пользователе который просмотрел письмо?

    AdGooroo
    @AdGooroo
    Специалист в области интернет-маркетинга
    Для начала надо создать следящий пиксель.
    <img src="http://www.google-analytics.com/collect?v=1&…" width="1" height="1">

    И добавляем в ссылку параметры, чтобы ссылка получилась примерно такой:
    http://www.google-analytics.com/collect?v=1&tid=UA-XXXXXX&t=event&cid=*|UNIQID|*&cn=hellridecase&cs=email&ec=blogemail&ea=open

    где:

    tid = идентификатор отслеживания Google Analytics (выглядит как UA-XXXX)

    cid = идентификатор сессии (Unique session id (recipient id))

    t = тип отслеживания (Tracking type) (event);

    ec = категория события;

    ea = действие по событию;

    el = ярлык события (необязательно);

    cn = название кампании (необязательно);

    cs = источник кампании (нужен, если отслеживаете кампанию).

    Присваиваем значения переменным

    В зависимости от того, насколько вы знакомы с GA, у вас может быть уже сложившаяся система использования переменных, так что способ, который мы предлагаем, — лишь один из нескольких возможных путей.

    Переменной tid присваиваем идентификатора отслеживания, а для «t» прописываем «event» (событие), чтобы GA понимал, что вы отслеживаете событие, а не просмотр страницы.

    Категория события (ec) может использоваться, чтобы группировать ваши события. Мы использовали название «blogemail»

    Действие по событию (ea) вы можете использовать, чтобы уточнить тип события, которое вы отслеживаете, например, взаимодействие, открытие, почтовый клиент, анимация и т.д.

    Ярлык события (el) указывать необязательно. Вы можете использовать его, чтобы указать тип взаимодействия (rollover, клик) или деталь, например, блок в письме, с которым взаимодействовал пользователь. Ещё можно использовать ярлык события, чтобы передавать тип почтового клиента (webkit, мобильный, браузерный gmail)

    Вы можете использовать название кампании (cn) и источник кампании (cs), чтобы отслеживать отчёты по email кампаниям. Источник кампании обязателен, если вы хотите отслеживать по названию кампании, и вы можете использовать любое значение. Я оставляю просто «email»

    Уникальный ID сессии (cid)

    Уникальный ID сессии (cid) — идентификатор, присваиваемый конкретной сессии конкретного пользователя. В обычном случае вы могли бы использовать email пользователя, но Google не разрешает этого делать. Согласно документации, информация, передаваемая в GA, не должна содержать персональных данных.

    Чтобы удовлетворить эти требования, вы можете обратиться к своему почтовому провайдеру и получить уникальные идентификаторы для каждого пользователя. В MailChimp для этого есть мердж тег, который создаёт идентификаторы пользователей:
    *|UNIQID|*
    Внедряем GA Pixel

    Теперь, когда у вас есть URL со следящим пикселем, вы можете использовать его в своих кампаниях. Вот здесь Tracking Interactions in Interactive Email можно почитать про основы этого.

    Вот некоторые примеры, реализованные с помощью кода из приведённой статьи (не забудьте заменить идентификатор отслеживания, )

    Отслеживание открытий Давайте начнём с простого отслеживания открытий, которое будет записывать событие всякий раз, когда письмо кто-то открывает (исходя из предположения, что картинки отображаются)

    <img src="http://www.google-analytics.com/collect?v=1&
    tid=UA-XXXXXX&t=event&cid=*|UNIQID|*&cn=hellridecase&
    cs=email&ec=blogemail&ea=open" width=1 height=1>

    Вращающиеся изображения (rollover)
    .img-swap:hover .tpixel{
    background-image:url(http://www.google-analytics.com/collect?v=1&
    tid=UA-XXXXXX&t=event&cid=*|UNIQID|*&cn=hellridecase&
    cs=email&ec=blogemail&ea=interact&el=rollover);
    }

    Карусель: Это не сработает в MailChimp, поскольку он не поддерживает некоторые элементы, такие, как радиокнопки
    .radio2:checked ~ .carousel .tpixel{
    background-image:url(http://www.google-analytics.com/collect?v=1&
    tid=UA-XXXXXX&t=event&cid=*|UNIQID|*&cn=hellridecase&
    cs=email&ec=blogemail&ea=interact&el=radio2_select);
    }
    .radio3:checked + .carousel .tpixel{
    background-image:url(http://www.google-analytics.com/collect?v=1&
    tid=UA-XXXXXX&t=event&cid=*|UNIQID|*&cn=hellridecase&
    cs=email&ec=blogemail&ea=interact&el=radio3_select);
    
    }

    Открытия с мобильных
    <style>
    @media screen and (max-device-width: 600px) {
    .mobile-pixel{
    background-image: url(http://www.google-analytics.com/collect?
    v=1&amp;tid=UA-XXXXXX&amp;t=event&amp;cid=*|UNIQID|*
    &amp;cn=hellridecase&amp;cs=email&amp;ec=blogemail
    &amp;ea=client-type&amp;el=mobile);
    }
    }
    </style>
    <div class="mobile-pixel"></div>

    Тестируем пиксель
    Одна из классных функций Google Analytics — возможность отслеживать события в реальном времени. Так вы можете моментально проверить, правильно ли настроены ваши пиксели. Для проверки вы можете отправить тестовое письмо или открыть html файл письма в браузере, и ваши события появятся в отчётах в реальном времени. Попасть в эти отчёты вы можете из левого меню: В режиме реального времени — События. Клик по отчёту «События за последние 30 минут» даст вам возможность увидеть полное количество событий по каждому действию за последние полчаса.

    c04afeff0a3d4bc28340c883629243e7.gif

    В отчёте вы можете заметить, что задержка между действием и срабатыванием события очень мала. Также обратите внимание, что из-за того, что пиксель, загрузившись один раз, больше не срабатывает, пока вы не обновите страницу, активация события по вращающемуся изображению во второй раз не запишется.`

    Отчёты

    Тут начинается самое захватывающее. Вы можете зайти в отчёты по событиям в Google Analytics Поведение — События — Лучшие события. Там вы увидите все события, разбитые по категориям. Кликаем на kinetic и видим действия по событию как на скриншоте ниже:`

    Вы можете видеть Все события и Уникальные события. Все события — сколько раз пиксель был загружен.

    Однако уникальные события это не количество уникальных пользователей, действие которых спровоцировали запись события. Уникальные события показывают количество сессий, в которых событие сработало. Например, если один и тот же пользователь открыл письмо 10 раз за три дня, то Все события будут показывать 10, а Уникальные — 3, но не 1. Google Analytics начинает считать сессию как новую, если пользователь был неактивен в течение получаса. Посмотрите эту статью для большей информации.
    Ответ написан
    Комментировать
  • Какой двигатель выбрать для Landing Page?

    @bromzh
    Drugs-driven development
    Если тебе нужен только 1 лэндинг, то просто пиши с нуля, подключай разные js-библиотеки (jquery, angular/knockout/etc для отображения данных), jquery-плагины, и т.д.

    Если лэндинги надо делать периодически и их будет много, то выбери сам нужный стек технологий. Если лэндинги не однотипные, то что-то универсальное готовое вряд ли существует.

    Мой стек:
    1) Grunt, bower - для быстрого равёртывания нового проекта и подключения внешних библиотек.
    2) Less - как более удобный инструмент вёрстки
    3) jQuery с плагинами (какие - зависит от проекта), normalize.css, modernizr.
    4) Github Pages - для просмотра страницы по мере разработки

    Собственно, всё сводится к написанию под себя конфига для grunt. У меня он позволяет скачивать зависимости bower'а. Далее, все внешние js и css кидаются во временную папку. Туда же кидаются мои скомпилированные css и js. Далее, если это не production, то каждый файл инжектится отдельно на html-страницу. Если production - всё сжимается до 1-го файла (т.е. на выходе будет 1 js-файл и 1 css-файл) и инжектится только 1 js и 1 css. Все изменения в конфиге bower'a, изменения в css, less и js-файлах отслеживаются. Если они изменились - то grunt автоматом запускает нужные задачи, т.е. при изменении, например, в less-файла, через пару секунд эти изменения будут видны на странице, которая открыта в браузере.
    Ответ написан
    Комментировать
  • Как сделать уровни в telegram-bot на node js??

    Ni55aN
    @Ni55aN
    Типичная машина состояний:

    - К каждому состоянию привязать шаблоны для прослушивания сообщений
    - Для каждого пользователя запоминать текущее состояние
    - Начинать прослушивание с корневого состояния
    - При получении соответствующего сообщения переходить в нужное состояние (или остаться в текущем)
    Ответ написан
    1 комментарий
  • Бот Telegram на NodeJS?

    Ni55aN
    @Ni55aN
    Было бы правильнее вводить имя возле самой команды

    Хотя можно и так:
    var stateSetName = false;
    
    bot.onText(/\(.*)/, function (msg, match) {
    
    if(!stateSetName)return;
    
    var name = match[1];
    });
    
    bot.onText(/\/setname/, function (msg, match) {
      
      var fromId = msg.from.id;
      bot.sendMessage(fromId, "Введите имя");
    stateSetName =true;
    
     setTimeout(function(){   bot.sendMessage(fromId, "Отмена!"); stateSetName =false;},30000);
    });

    но в идеале подобное с цепочками сообщений нужно делать через состояния
    Ответ написан
    Комментировать
  • Бот Telegram на NodeJS?

    SPAHI4
    @SPAHI4
    реактовцы - это не девы, а прокидыватели пропсов
    в этой либе есть такой тип
    https://github.com/mdibaiee/node-telegram-api/wiki...
    Ответ написан
    Комментировать
  • 301 moved permanently при попытке авторизоваться в Qiwi c помощью Curl. Как исправить?

    @shad541
    Есть решение!
    require_once 'Curl.php'; //https://github.com/php-curl-class/php-curl-class
    
    $curl = new \Curl\Curl();
    $curl->setOpt(CURLOPT_SSL_VERIFYPEER, 0);
    $curl->setCookieFile('cookie.txt');
    $curl->setHeader('Content-Type', 'application/json');
    $curl->setHeader('X-Requested-With', 'XMLHttpRequest');
    $curl->setUserAgent('Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:40.0) Gecko/20100101 Firefox/40.0');
    
    // Получаем TGT-тикет по логину и паролю
    $res = json_decode($curl->post('https://auth.qiwi.com/cas/tgts', json_encode(array(
        'login' => '+***',
        'password' => '***'
    ))));
    $TgtTicket = $res->entity->ticket;
    
    // Получаем пару ST-тикетов по TGT-тикету
    // первый тикет не нужен, а вот второй понадобится
    $curl->post('https://auth.qiwi.com/cas/sts', json_encode(array(
        'ticket' => $TgtTicket,
        'service' => 'https://qiwi.com/j_spring_cas_security_check',
    )));
    
    $res = json_decode($curl->post('https://auth.qiwi.com/cas/sts', json_encode(array(
        'ticket' => $TgtTicket,
        'service' => 'https://qiwi.com/j_spring_cas_security_check',
    ))));
    $STticket = $res->entity->ticket;
    
    // выполняем чек
    $res = $curl->get('https://qiwi.com/j_spring_cas_security_check?ticket='.$STticket);
    // запрос к проксе
    $res = $curl->get('https://auth.qiwi.com/app/proxy?v=1');
    
    // запрос отчета за неделю
    $curl->setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    $reports = $curl->post('https://qiwi.com/user/report/list.action', array(
        'type' => '3'
    ));
    // возвращаем Content-Type назад
    $curl->setHeader('Content-Type', 'application/json');
    
    print_r($reports);  // обработка результатов
    
    // запрос баланса etc
    $res = $curl->post('https://qiwi.com/person/state.action');
    print_r($res); // обработка результатов
    
    $curl->close();
    Ответ написан
    1 комментарий
  • Проверка перевода на QIWI кошелек?

    Логинится, парсить список транзакций, заносить их в масив, ну и каждые 5 секунд проверять нет ли новых.
    У меня есть готовый Daemon на Node.js с аутентификацией, проверкой транзакций, и добавление в бд.
    Ответ написан
    6 комментариев
  • Где можно взять хороший html шаблон/дизайн для сайта портфолио?

    vadorg
    @vadorg
    UX Faper
    раз templated.co
    два html5up.net
    все бесплатно, ну а если лень лезть в код - можно смотреть в сторону конструкторов https://readymag.com
    Ответ написан
    Комментировать