• Почему не срабатывает данный блок кода?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Комментировать
  • Почему не срабатывает данный блок кода?

    Stalker_RED
    @Stalker_RED
    Потму что у вас кириллица в utf-8 скорее всего, а это не один байт, и вы вместо того чтобы найти замену буквы ищите замену первой половине буквы, а затем второй половине.

    Можно получать буквы через mb_substr() например.
    https://ideone.com/N2Tffg
    Ответ написан
    Комментировать
  • Почему не срабатывает данный блок кода?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Потому что кириллица занимает на одну ячейку в памяти, а несколько, соответственно обращаться к ней как по индексу бессмысленно. Разбейте строку с помощью mb_str_split и бегите по нему.
    Ответ написан
    Комментировать
  • Как можно посчитать количество итераций в методе перебора .map()?

    добавить в .map индекс
    datafetch.map((data, index) => 
                        <div id = "Win" className="ItemsWinners" style={
                            {backgroundColor: randomBorderColor(style)}
                         } key={datafetch.length+data.count}>
                            <h2>{data.nameItems}</h2>
                        </div>,
                        setStyle(style + 1), console.log(style)
                    )
    Ответ написан
    Комментировать
  • Как можно посчитать количество итераций в методе перебора .map()?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Функция callback, создающая элемент в новом массиве, принимает три аргумента:

    currentValue
    Текущий обрабатываемый элемент массива.
    index Необязательный
    Индекс текущего обрабатываемого элемента в массиве.
    array Необязательный
    Массив, по которому осуществляется проход.
    Array.prototype.map()
    Ответ написан
    Комментировать
  • По каким причинам setState не меняет состояние?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Уберите:
    .then(response => console.log(response))
    Вызов console.log возвращает undefined, который передаётся дальше и попадает в setState.
    Ответ написан
    1 комментарий
  • Десериализация с System.text.json. Не получается распарсить сложный json ответ с API?

    1. Пропустил скобочки:
    Вот такой json должен быть

    {
      "status": {
        "timestamp": "2021-06-28T05:54:55.250Z",
        "error_code": 0,
        "elapsed": 28,
        "credit_count": 1,
        "total_count": 5475
      },
      "data": [
        {
          "id": 1,
          "name": "Bitcoin",
          "symbol": "BTC",
          "slug": "bitcoin",
          "num_market_pairs": 9210,
          "date_added": "2013-04-28T00:00:00.000Z",
          "tags": [
            "mineable",
            "pow",
            "sha-256",
            "store-of-value",
            "state-channels",
            "coinbase-ventures-portfolio",
            "three-arrows-capital-portfolio",
            "polychain-capital-portfolio",
            "binance-labs-portfolio",
            "arrington-xrp-capital",
            "blockchain-capital-portfolio",
            "boostvc-portfolio",
            "cms-holdings-portfolio",
            "dcg-portfolio",
            "dragonfly-capital-portfolio",
            "electric-capital-portfolio",
            "fabric-ventures-portfolio",
            "framework-ventures",
            "galaxy-digital-portfolio",
            "huobi-capital",
            "alameda-research-portfolio",
            "a16z-portfolio",
            "1confirmation-portfolio",
            "winklevoss-capital",
            "usv-portfolio",
            "placeholder-ventures-portfolio",
            "pantera-capital-portfolio",
            "multicoin-capital-portfolio",
            "paradigm-xzy-screener"
          ],
          "max_supply": 21000000,
          "circulating_supply": 18743737,
          "total_supply": 18743737,
          "cmc_rank": 1,
          "last_updated": "2021-06-28T05:54:02.000Z",
          "quote": {
            "USD": {
              "price": 34489.91295375669,
              "volume_24h": 33231566302.9618,
              "percent_change_1h": 0.24623143,
              "percent_change_24h": 4.72866241,
              "percent_change_7d": 0.0385825,
              "percent_change_30d": -6.57806083,
              "percent_change_60d": -36.08177402,
              "percent_change_90d": -40.16259997,
              "market_cap": 646469857558.1086,
              "last_updated": "2021-06-28T05:54:02.000Z"
            }
          }
        },
        {
          "id": 1027,
          "name": "Ethereum",
          "symbol": "ETH",
          "slug": "ethereum",
          "num_market_pairs": 6005,
          "date_added": "2015-08-07T00:00:00.000Z",
          "tags": [
            "mineable",
            "pow",
            "smart-contracts",
            "ethereum",
            "coinbase-ventures-portfolio",
            "three-arrows-capital-portfolio",
            "polychain-capital-portfolio",
            "binance-labs-portfolio",
            "arrington-xrp-capital",
            "blockchain-capital-portfolio",
            "boostvc-portfolio",
            "cms-holdings-portfolio",
            "dcg-portfolio",
            "dragonfly-capital-portfolio",
            "electric-capital-portfolio",
            "fabric-ventures-portfolio",
            "framework-ventures",
            "hashkey-capital-portfolio",
            "kinetic-capital",
            "huobi-capital",
            "alameda-research-portfolio",
            "a16z-portfolio",
            "1confirmation-portfolio",
            "winklevoss-capital",
            "usv-portfolio",
            "placeholder-ventures-portfolio",
            "pantera-capital-portfolio",
            "multicoin-capital-portfolio",
            "paradigm-xzy-screener"
          ],
          "circulating_supply": 116469137.499,
          "total_supply": 116469137.499,
          "cmc_rank": 2,
          "last_updated": "2021-06-28T05:54:02.000Z",
          "quote": {
            "USD": {
              "price": 1972.9974245462824,
              "volume_24h": 19489435867.08539,
              "percent_change_1h": -0.03164063,
              "percent_change_24h": 5.36554092,
              "percent_change_7d": -7.36312666,
              "percent_change_30d": -22.4570674,
              "percent_change_60d": -27.41396336,
              "percent_change_90d": 9.21290472,
              "market_cap": 229793308324.65384,
              "last_updated": "2021-06-28T05:54:02.000Z"
            }
          }
        },
        {
          "id": 825,
          "name": "Tether",
          "symbol": "USDT",
          "slug": "tether",
          "num_market_pairs": 13711,
          "date_added": "2015-02-25T00:00:00.000Z",
          "tags": [
            "payments",
            "stablecoin",
            "stablecoin-asset-backed",
            "solana-ecosystem"
          ],
          "circulating_supply": 62534142511.11169,
          "total_supply": 64471767616.826355,
          "platform": {
            "id": 1027,
            "name": "Ethereum",
            "symbol": "ETH",
            "slug": "ethereum",
            "token_address": "0xdac17f958d2ee523a2206206994597c13d831ec7"
          },
          "cmc_rank": 3,
          "last_updated": "2021-06-28T05:53:08.000Z",
          "quote": {
            "USD": {
              "price": 1.00023604778902,
              "volume_24h": 50665651395.52314,
              "percent_change_1h": -0.00327685,
              "percent_change_24h": -0.11177658,
              "percent_change_7d": -0.14175554,
              "percent_change_30d": -0.07861614,
              "percent_change_60d": 0.01010439,
              "percent_change_90d": -0.01064075,
              "market_cap": 62548903557.1897,
              "last_updated": "2021-06-28T05:53:08.000Z"
            }
          }
        },
        {
          "id": 1839,
          "name": "Binance Coin",
          "symbol": "BNB",
          "slug": "binance-coin",
          "num_market_pairs": 570,
          "date_added": "2017-07-25T00:00:00.000Z",
          "tags": [
            "marketplace",
            "centralized-exchange",
            "payments",
            "binance-smart-chain",
            "alameda-research-portfolio",
            "multicoin-capital-portfolio"
          ]
        }
      ]
    }


    2. После генерации нужно ещё руками подкорректировать классы:
    - Переименовать классы (например Root на Response)
    - Поменять типы (например double на decimal)
    - Дополнить недостающее. (Например Quote заменить на словарь)
    Код

    using System.Text.Json;
    using System.Text.Json.Serialization;
    
    public class Status
    {
        [JsonPropertyName("timestamp")]
        public DateTime Timestamp { get; set; }
    
        [JsonPropertyName("error_code")]
        public int ErrorCode { get; set; }
    
        [JsonPropertyName("elapsed")]
        public int Elapsed { get; set; }
    
        [JsonPropertyName("credit_count")]
        public int CreditCount { get; set; }
    
        [JsonPropertyName("total_count")]
        public int TotalCount { get; set; }
    }
    
    public class QuoteForCurrency
    {
        [JsonPropertyName("price")]
        public decimal Price { get; set; }
    
        [JsonPropertyName("volume_24h")]
        public decimal Volume24h { get; set; }
    
        [JsonPropertyName("percent_change_1h")]
        public decimal PercentChange1h { get; set; }
    
        [JsonPropertyName("percent_change_24h")]
        public decimal PercentChange24h { get; set; }
    
        [JsonPropertyName("percent_change_7d")]
        public decimal PercentChange7d { get; set; }
    
        [JsonPropertyName("percent_change_30d")]
        public decimal PercentChange30d { get; set; }
    
        [JsonPropertyName("percent_change_60d")]
        public decimal PercentChange60d { get; set; }
    
        [JsonPropertyName("percent_change_90d")]
        public decimal PercentChange90d { get; set; }
    
        [JsonPropertyName("market_cap")]
        public decimal MarketCap { get; set; }
    
        [JsonPropertyName("last_updated")]
        public DateTime LastUpdated { get; set; }
    }
    
    public class Platform
    {
        [JsonPropertyName("id")]
        public int Id { get; set; }
    
        [JsonPropertyName("name")]
        public string Name { get; set; }
    
        [JsonPropertyName("symbol")]
        public string Symbol { get; set; }
    
        [JsonPropertyName("slug")]
        public string Slug { get; set; }
    
        [JsonPropertyName("token_address")]
        public string TokenAddress { get; set; }
    }
    
    public class Item
    {
        [JsonPropertyName("id")]
        public int Id { get; set; }
    
        [JsonPropertyName("name")]
        public string Name { get; set; }
    
        [JsonPropertyName("symbol")]
        public string Symbol { get; set; }
    
        [JsonPropertyName("slug")]
        public string Slug { get; set; }
    
        [JsonPropertyName("num_market_pairs")]
        public int NumMarketPairs { get; set; }
    
        [JsonPropertyName("date_added")]
        public DateTime DateAdded { get; set; }
    
        [JsonPropertyName("tags")]
        public List<string> Tags { get; set; }
    
        [JsonPropertyName("max_supply")]
        public int MaxSupply { get; set; }
    
        [JsonPropertyName("circulating_supply")]
        public decimal CirculatingSupply { get; set; }
    
        [JsonPropertyName("total_supply")]
        public decimal TotalSupply { get; set; }
    
        [JsonPropertyName("cmc_rank")]
        public int CmcRank { get; set; }
    
        [JsonPropertyName("last_updated")]
        public DateTime LastUpdated { get; set; }
    
        [JsonPropertyName("quote")]
        public Dictionary<string, QuoteForCurrency> Quote { get; set; }
    
        [JsonPropertyName("platform")]
        public Platform Platform { get; set; }
    }
    
    public class Response
    {
        [JsonPropertyName("status")]
        public Status Status { get; set; }
    
        [JsonPropertyName("data")]
        public List<Item> Data { get; set; }
    }


    3. Тогда чтобы спарсить ответ надо будет просто написать код:
    var json = "{}"; // тут твой ответ json из ответа
    var responseData = JsonSerializer.Deserialize<Response>(json);
    Ответ написан
  • Как распарсить время для понимания JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const date = new Date(str.replace(/\S+/, m => m.split('.').reverse().join('-')));

    или

    const date = new Date(str.replace(/(\d+)\.(\d+)\.(\d+)/, '$3-$2-$1'));

    или

    const [ day, month, year, hours, minutes, seconds ] = str.split(/\D/);
    const date = new Date(year, month - 1, day, hours, minutes, seconds);

    или (day.js):

    const date = dayjs(str, 'DD.MM.YYYY HH:mm:ss').toDate();
    Ответ написан
    Комментировать
  • Как использовать сессии в в приложении ASP.Net Core Web.api + react?

    Если на js можно использовать sessionStorage, но говорят так делать не правильно.

    Кто говорит? И в какой ситуации не правильно? Если хранить только клиентские данные, типа корзины, то можно и в local/session storage
    Раз так, тогда как отслеживать их, постоянно отправлять гет запрос?

    Когда делаешь запрос к серверу, в запрос кладётся некоторый идентификатор, по которому можно отличить одного клиента от другого. Тот самый session id. По нему уже можно из бд вытащить всякие сохранённые данные.
    То есть получается, что бы взаимодействовать с сессией нужно постоянно использовать ajax, как по мне sessionStorage использовать куда дешевле...

    Если в вашей ситуации использовать session storage безопасно, то используйте.
    Ответ написан
    1 комментарий
  • Как бы вы реализовали бы проверку данных основываясь на существующем коде?

    Seasle
    @Seasle Куратор тега React
    Ух. Ну, используйте Formik в связке с Yup.
    import React, { useCallback } from 'react';
    import { Formik, Form, useField } from 'formik';
    import * as yup from 'yup';
    
    const initialValues = {
      firstName: '',
      lastName: '',
      nickName: '',
      email: '',
      password: '',
      confirmPassword: ''
    };
    
    const validationSchema = yup.object().shape({
      firstName: yup.string().required('Имя является обязательным'),
      lastName: yup.string().required('Фамилия является обязательной'),
      nickName: yup.string().required('Имя пользователя является обязательным'),
      email: yup
        .string()
        .email('Введенное значение не является почтой')
        .required('Почта является обязательной'),
      password: yup
        .string()
        .min(8, 'Минимальная длина пароля 8 символов')
        .required('Пароль является обязательным'),
      confirmPassword: yup
        .string()
        .oneOf([yup.ref('password'), null], 'Пароли не совпадают')
        .min(8, 'Минимальная длина пароля 8 символов')
        .required('Пароль является обязательным')
    });
    
    const ExampleField = ({ name, label, ...props }) => {
      const [field, meta, helpers] = useField(name);
    
      return (
        <label>
          {label}
          <input
            name={name}
            value={field.value}
            onChange={field.onChange}
            onBlur={field.onBlur}
            {...props}
          />
          {meta.error !== undefined && meta.touched && <div>{meta.error}</div>}
        </label>
      );
    };
    
    const ExampleForm = () => {
      const handleSubmit = useCallback((values, helpers) => {
        console.log(values);
        helpers.setSubmitting(false);
      }, []);
    
      return (
        <Formik
          initialValues={initialValues}
          validationSchema={validationSchema}
          validationOnBlur
          onSubmit={handleSubmit}
        >
          {({ values, errors, touched, isValid, isSubmitting }) => (
            <Form>
              <ExampleField label="Имя" name="firstName" />
              <ExampleField label="Фамилия" name="lastName" />
              <ExampleField label="Имя пользователя" name="nickName" />
              <ExampleField label="Почта" type="email" name="email" />
              <ExampleField label="Пароль" type="password" name="password" />
              <ExampleField label="Подтверждение пароля" type="password" name="confirmPassword" />
              <button type="submit" disabled={!isValid || isSubmitting}>
                Отправить
              </button>
              <pre>{JSON.stringify({ values, errors, touched }, null, 2)}</pre>
            </Form>
          )}
        </Formik>
      );
    };

    Пример.
    Ответ написан
    Комментировать
  • Как бы вы реализовали бы проверку данных основываясь на существующем коде?

    search
    @search
    мама говорит что я особенный
    Библиотеку бы заюзал. Нафиг надо придумывать то, что уже придумано.

    Например, такую https://github.com/jquense/yup

    Ну или какую-нибудь другую, главное чтоб она была про валидацию данных.
    Ответ написан
    Комментировать
  • Почему React не обрабатывает AddEventListener("click")?

    @atrevido
    Хуки вообще неприменимы для class components в react. Как написал Антон тут следует сделать нормальный подход средствами реакта. Если очень хочется через родительский компонент управлять элементами дочернего - можно использовать ref через React.createRef() в классах и useRef в FC.

    Что делает и зачем UseEffects используется в коде я не понял. Это не компонент реакта, возвращает эта функция саму себя. Это и не high order component и не FC. useEffect должен зависеть от внешних параметров, которые могут поменяться. Если надо его вызвать один раз на рендер компонента, то зависимости [], если каждый раз - вообще не указывать значение.

    Сделайте передачу через props делегата на вызов функции родительского компонента и откажитесь от прямой работы с DOM (если есть хотя бы один вариант сделать это средствами реакта)

    Не пишите стили напрямую, попробуйте сделать правильный класс с атрибутом {display: block}, например .block и на метод нажатия кнопки добавляйте стиль. Если стиль в другом компоненте - пробросьте через props методы изменения, или используйте контекст, redux и тп
    Ответ написан
    Комментировать
  • Где лучше всего хранить файлы различного размера?

    @alex1478
    Храните файлы на отдельном сервере и с него и раздавайте. Тут есть дешевые сервера с большим диском https://www.kimsufi.com/us/en/servers.xml (Смотрите сервера на Intel Atom).
    Ответ написан
    Комментировать
  • Где лучше всего хранить файлы различного размера?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    развернуть собственный сервер-хранилище (эта идея была практически сразу откинута)

    Не совсем ясно, отбросили ли вы исключительно "железный" отдельный сервер, или в т.ч. и виртуальные.
    В любом случае - один из вариантов - это "storage VPS", что-то наподобие вот этого (по ссылке просто пример): https://hosthatch.com/storage-vps

    Также можете использовать предназначенные для хранения сервисы:
    -- https://www.hetzner.com/storage/storage-box (ФТП и подобное);
    -- https://www.hetzner.com/storage/storage-share (NextCloud).

    Последние два варианта по цене побить, наверное, можно, но полагаю, что немногие из известных игроков предложат дешевле (хотя не проверял). Это уже готовые решения, которые вполне себе дёшевы и сердиты.
    Ответ написан
    Комментировать
  • Почему js скрипт не выполняется если он описан в отдельном файле, а не в разметке?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    А Вы можете открыть этот файл, напрямую обратившись в адресной строке браузера к его предполагаемому месторасположению?

    Обычно, в таких случаях проблема всегда в одном и том же. В вашем случае, она делится на 2 вида.
    1) Вы не верно указываете путь относительно конечного файла. Забыли слэш, забыли подняться на уровень выше и тд. (Судя по скринам он грузится, значит ок)

    2) Вам нужно использовать специальные функции для резолва путей и\или регистрации скрипта. (скрипт загрузился, но где-нибудь там не зарегистрировался и поэтому не исполняется

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

    А, забыл. Есть ещё вариант, который заставляет переодически страдать всех и каждого.
    КЭШ.
    Попробуйте в инкогнито режиме.
    Ответ написан
    1 комментарий
  • Как передавать заголовки POST через HttpRequest?

    @cicatrix
    было бы большой ошибкой думать
    В двух словах, после создания запроса, надо открыть RequestStream, записать в него все POST данные и отправить на сервер.
    Вот выдернул из готового проекта отправку POST запроса:
    // в data передаются параметры POST (ключ - значение)
    // если надо загрузить файл - передаётся в file
    internal static string Post(string url, Dictionary<string, string> data, FileUploadData file = null)
            {
                string ServerResponse = null;
                HttpWebRequest wrq = (HttpWebRequest)HttpWebRequest.Create(url);
                wrq.Method = WebRequestMethods.Http.Post;
                wrq.UserAgent = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + 
                                System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                wrq.Timeout = 600000;
                try
                {
                    // Это на случай использования прокси, можно выкинуть
                    if (Config.UseProxy)
                    {
                        WebProxy proxy = new WebProxy(Config.ProxyAddress, Config.ProxyPort);
                        if (Config.ProxyLogin != string.Empty || Config.ProxyPass != string.Empty)
                        {
                            proxy.Credentials = new NetworkCredential(Config.ProxyLogin, Config.ProxyPass);
                            proxy.UseDefaultCredentials = false;
                        }
                        else
                        {
                            proxy.UseDefaultCredentials = true;
                        }
                    }
    
                    if (null == file) // проверяем, надо ли загружать файл на сервер
                    {
                        wrq.ContentType = "application/x-www-form-urlencoded";
                        Stream requestStream = wrq.GetRequestStream();
                        List<string> keydata = new List<string>();
                        foreach (string key in data.Keys)
                        {
                            keydata.Add($"{HttpUtility.UrlEncode(key)}={HttpUtility.UrlEncode(data[key])}");
                        }
                        WriteToStream(requestStream, string.Join("&", keydata));
                        requestStream.Flush();
                    }
                    else
                    {
                        // Формируем multipart/form-data (отправка данных с формы)
                        string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
                        wrq.ContentType = "multipart/form-data; boundary =" + boundary;
                        Stream requestStream = wrq.GetRequestStream();
                        WriteMultipartForm(requestStream, boundary, data, file);
                    }
                    // Посылаем данные на сервер и ждём ответа
                    wrq.BeginGetResponse(a =>
                    {
                        try
                        {
                            WebResponse resp = wrq.EndGetResponse(a);
                            Stream respStr = resp.GetResponseStream();
                            using (StreamReader sr = new StreamReader(respStr))
                            {
                                ServerResponse = sr.ReadToEnd();
                            } // using sr
                    } // try
                    catch (Exception ex)
                        {
                            Logger.LogError("Transport.Post", Globalizer.ID_Transport_Request_executing_error, ex);
                        } // catch
                }, null);
                }  // try
                catch(Exception ex)
                {
                    Logger.LogError("Transport.Post", Globalizer.ID_Transport_Could_not_connect_to_server, ex);
                    return null;
                }
                return ServerResponse;
            } // Post
    
    private static void WriteMultipartForm(Stream s, string boundary, Dictionary<string, string> data, FileUploadData file)
            {
                /// The first boundary
                byte[] boundarybytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
                /// the last boundary.
                byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                /// the form data, properly formatted
                string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                /// the form-data file upload, properly formatted
                string fileheaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\";\r\nContent-Type: {2}\r\n\r\n";
    
                /// Added to track if we need a CRLF or not.
                bool bNeedsCRLF = false;
    
                if (data != null)
                {
                    foreach (string key in data.Keys)
                    {
                        /// if we need to drop a CRLF, do that.
                        if (bNeedsCRLF)
                            WriteToStream(s, "\r\n");
    
                        /// Write the boundary.
                        WriteToStream(s, boundarybytes);
    
                        /// Write the key.
                        WriteToStream(s, string.Format(formdataTemplate, key, data[key]));
                        bNeedsCRLF = true;
                    }
                }
    
                /// If we don't have keys, we don't need a crlf.
                if (bNeedsCRLF)
                    WriteToStream(s, "\r\n");
    
                WriteToStream(s, boundarybytes);
                WriteToStream(s, string.Format(fileheaderTemplate, file.FieldName, file.Filename, file.ContentType));
                /// Write the file data to the stream.
                WriteToStream(s, file.FileData);
                WriteToStream(s, trailer);
            }
    
    private static void WriteToStream(Stream s, string txt)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(txt);
                s.Write(bytes, 0, bytes.Length);
            } // WriteToStream
    Ответ написан
    Комментировать
  • Не могу отследить http запрос при нажатии на кнопку сайта?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В дополнение к совету выше
    Включите галочку сохранять логи. И по желанию не кэшировать данные
    3323e47b86.jpg
    Ответ написан
    1 комментарий
  • Не могу отследить http запрос при нажатии на кнопку сайта?

    @alexalexes
    Если это страница сайта, то берете браузер Chrome. Открываете панель разработчика F12, открываете вкладку Network, включаете прослушивание, устанавливаете вывод всех типов запросов. И жамкаете нужную кнопку, ни один запрос не проскочит без регистрации.
    Ответ написан
    1 комментарий