• Как разбить список на блоки?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если $all_users->response->profiles это массив профилей, то можно разбить массив на части функцией array_chunk()
    https://www.php.net/manual/ru/function.array-chunk.php

    <?php
    $parts = array_chunk($all_users->response->profiles, 100);
    print_r($parts);
    Ответ написан
    Комментировать
  • Где найти хорошую библиотеку для работы с Instagram API?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://github.com/postaddictme/instagram-php-scraper
    Это указанная в вопросе либа, отлично справляется с поставленой задачей. Это по сути парсер веб версии инстаграма.
    Авторизация не нужна, если парсите публичные профили, только нужно будет пачку приватных проксей, в идеале резидентные прокси.
    Если будете парсить приватные профили, тогда конечно нужно авторизоваться.
    Ответ написан
  • Не может больше внести txt чем 3 мб. почему?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Тут скорее проблема в том что скрипту не хватает памяти чтобы вместить все $collectuids, так как никаких ограничений на выгрузку groups.getMembers vk не накладывает, и я без проблем выгружал списки участников сообществ по 1млн+ участников.

    Быстрый хак - увеличить скрипту памяти при выполнении, а так же включить отображение ошибок
    <?php
    ini_set('display_errors', 1);
    error_reporting(-1);
    
    ini_set('memory_limit', '512M'); //512Mb
    
    //тут ваш код


    p.s. так же если скрипт запускается не через CLI, а через браузер, то он может вылетать просто по таймауту соединения.
    Ответ написан
    Комментировать
  • Парсинг сайта на Flash?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Там javascript делает запросы к API (ajax/XHR) и результаты встраивает на страницу
    Посмотреть эти запросы можно в dev-tools во вкладке network

    пример url'а
    https://api.edadeal.ru/web/search/offers?count=30&...

    в случае в edadeal там ещё прикручены Protobuffers - https://ru.wikipedia.org/wiki/Protocol_Buffers
    с Protobuffers придётся разобраться если захочется полностью раскодировать ответы api, если цель выдернуть ссылки то они видны в ответе api и без раскодирования.

    5e78d08c496de649495874.png
    Ответ написан
    4 комментария
  • Как переписать код?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    // Guestbook, Гостевая книга
    
    if (!is_dir("messages")) {
    mkdir("messages");
    };
    
    function postMessages() {
    foreach (glob('messages/*.txt') as $message) {
    $message = file($message);
    echo str_replace("\n", "", $message[0]) . "<br/>";
    echo str_replace("\n", "", "<a href='mailto:$message[1]'>$message[1]</a>") . "<br/>";
    for ($i = 2; $i < sizeof($message); $i++) {
    echo htmlspecialchars($message[$i]) . "<br/>";
    };
    echo "<br/>";
    };
    };
    
    $messages = scandir("messages");
    
    if (!$_POST) {
    postMessages();
    //a:
    print_form();
    } else {
    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) !== false && $_POST['author'] && $_POST['email'] && $_POST['message']) {
    $author = str_replace("\r\n", "", $_POST['author']);
    $email = str_replace("\r\n", "", $_POST['email']);
    $msg = $_POST['message'];
    $time = (int)(microtime(true) * 1000000);
    file_put_contents("messages/$time.txt", "$author
    $email
    $msg");
    } else {
    echo 'Error while adding your message.';
    //goto a;
    print_form();
    };
    postMessages();
    //goto a;
    print_form();
    };
    
    function print_form()
    {
        echo
        '<form action="index.php" method="post">
        <p><input type="text" name="author" required /></p>
        <p><input type="text" name="email" required /></p>
        <p><textarea name="message" required></textarea></p>
        <p><input type="submit" /></p>
        </form>';
    }
    ?>
    Ответ написан
  • Почему ничего не происходит каксделать чтоб что-то происходило?

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

    <?php
    function myChown($fname, $attr) {
            if (PHP_OS == "UNIX") {
                // Функция-заглушка
                // Ничего не делает
                 return 1;
            } else {
                  return chown($fname, $attr);
            }
        }
    Ответ написан
    Комментировать
  • Сертификат по ГОСТ-2012?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    openssl вполне подходит для этих целей

    статья с подробным разбором и докер образами
    https://habr.com/ru/post/353534/

    Пару ссылок для общего ознакомления с болью
    https://www.cryptopro.ru/forum2/default.aspx?g=pos...
    http://wiki.rosalab.ru/ru/index.php/OpenSSL_и_ГОСТ
    Ответ написан
    Комментировать
  • Как перебирать такие массивы/объекты?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Это не массивы. Для работы со строками столбцами и данными нужно использовать специальные методы (гетеры и тд) которые предоставляет данная бибилотека.

    К сожалению Вам придётся всё-таки изучить документацию
    https://phpspreadsheet.readthedocs.io/en/latest/

    а так же можно ознакомится с примерами кода тут
    https://github.com/PHPOffice/PhpSpreadsheet/tree/m...

    Получить данные из ячейки или строки
    https://phpspreadsheet.readthedocs.io/en/latest/to...
    Ответ написан
    Комментировать
  • Как исправить сортировку у Advanced Custom Fields?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Не влезая в код плагина - никак
    В остальном проблема в алгоритме сортировки и в том что плагин явно не использует https://www.php.net/natsort
    Ответ написан
    Комментировать
  • Как найти ссылку в тексте с якорем (#anchor)?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Есть даже целый сайт с регулярками по матчингу url для разных ЯП - https://urlregex.com/

    %^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu


    <?php
    $str = 'Здесь ссылка должна быть в теге <a> https://example.ru/ru/task#348141 конец текста';
    
    $re = '%(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}'.
    '|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
    '(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
    '*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?%usi';
    
    $result = preg_replace($re, '<a href="$0" target="_blank">$0</a>', $str);
    
    var_dump($result);
    
    //string(167) "Здесь ссылка должна быть в теге <a> <a href="https://example.ru/ru/task#348141" target="_blank">https://example.ru/ru/task#348141</a> конец текста"
    Ответ написан
    4 комментария
  • Какой сейчас актуальный способ переноса сайта на https?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    От яндекса есть официальные рекомендации
    https://yandex.ru/support/webmaster/yandex-indexin...
    https://yandex.ru/support/webmaster/yandex-indexin...

    Проверенный способ без вылета страниц
    1. 301 редирект всех страниц http -> https
    2. в вебмастере ставим галочку переезд на https
    Именно переезд http -> https по момему опыту в яндексе происходит гладко и без особых просадок. Главное не накосячить с редиректом и ssl-сертификатом чтобы небыло роста отказов.

    Технически такой переезд это смена главного зеркала через редирект, но именно в случае http -> https в рамках одного домена, всё проходит с минимумом просадок, и как-правило после перехода на https всегда наблюдали по итогу рост трафика из ПС.
    Ответ написан
    Комментировать
  • Сбилась кодировка у страницы, как исправить?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    whatislov, хочу заметить, что на скриншоте редактируемого файла и скриншоте страницы всё в порядке с кодировкой и отображением.
    Вы редактируете текст с места "... инвестиционный проект и тд" и он нормально тображается.

    А проблемы с кодировкой в верхнем меню, которое, видимо и нужно отредактировать отдельно.
    Ответ написан
    Комментировать
  • Приходит странный API ответ. Это сжато или зашифрованно?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Так как ответ приходит на клиент, то не важно как и чем он зашифрован, вы всегда сможете расшифровать.
    Алгоритм расшифровки доступен, так как сайт же как-то расшифровывает эти ответ, и надо его лишь его найти в js
    В вашем случае код расшифровки находится в файле https://мойгаз.смородина.онлайн/app.js
    Так как в этом файле есть упоминание data0, data1 и base64
    Шифрование там AES.
    Удачи.
    5e7892f0b0a81105444621.png
    Ответ написан
    Комментировать
  • Не может раскодировать символ?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    HellFingers,
    echo mb_substr($string, 0, 1);
    Ответ написан
    Комментировать
  • Как php повторно узнает о файлах в каталоге: из памяти или читает все занова?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. путь до файла (куда пишете) у вас в $path, а вы проверяете $name, что не верно
    2. проверку на существование делаете после curl, а значит даже если в файл не пишете, то всё-равно делаете http запрос что не имеет смысла

    Подправленный вариант
    <?php
    foreach($data as $k)
    {
        foreach($k as $kq => $v)
        {
            foreach(($v["photo_list"]) as $key => $url)
            {
                $name = (basename($url));
                $path = "/".$name;
                
                //если файл существует идём к следующему $url
                if(file_exists($path))
                {                
                    continue;
                }
    
                //скачиваем
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_HTTPHEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $data = curl_exec($ch);
                curl_close($ch);
                
                //записываем
                $file = fopen($path, "w+");
                fwrite($file, $data);
                fclose($file);
            }
        }
    }
    Ответ написан
  • Как сделать Телеграмм бот с приемом заявок, принять или отклонить?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    m1sh0ck, вам нужно хранить промежуточные данные, состояние и список сообщений например в БД.
    То есть сообщение которое бот отправляет пользователю имеет своё id и бот может редактировать это сообщение.
    Останется сделать обратную связь, когда при нажатии одобрить/отклонить боту отдаётся команда, бот находит заявку и связанное с ней сообщение и редактирует его.
    Все кнопки это часть сообщения и их можно менять, то есть кнопки не "откроются", а просто появятся у пользователя, так как бот их вставит в сообщение.
    Ответ написан
  • Как оптимизировать запрос получения рекомендуемых постов с одним из тех же тегов?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Иногда лучший способ оптимизации, разбить сложный запрос на два простых, в том числе на каждый запрос можно прикрутить отдельно кеширование
    1. SELECT tag FROM post_tags WHERE post_id = 123
    2.
    SELECT DISTINCT(post_id) FROM post_tags WHERE tag IN(..список tag из п1)
    Ответ написан
  • Как оптимизировать выборку из Mysql?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    И за какое время у вас отрабатывает 10000 SELECT'ов? Индекc на uid есть + LIMIT 1?

    10тыс SELECT'ов на таблице в 300тыс строк, при условии что на uid есть индекс должно выполняться за 1-2 секунды на нормальной машине.
    Не вижу необходимости что-либо оптимизировать.
    Можно разве что минимизировать кол-во данных передаваемых по сети и вместо SELECT * использовать SELECT type, lvl, country, isoc так как лишние данные, это лишние задержки.

    БД создана для того чтобы работать, нет смысла её жалеть.

    - Другой вариант, если позволяет память - выбирать все строки из базы одним SELECT'ом и потом фильтровать в приложении.
    - Можно прикрутить memсached для кеширования так как по сути у вас key-value выборка
    - Выбрать другое хранилище (Redis, tarantool) где скорость выборки по ключу будет выше

    upd. Можно несколько SELECT'ов группировать в один запрос через IN
    SELECT ... FROM table WHERE uid IN(uid1, uid2, uidN)

    Этим можно уменьшить суммарное кол-во SELECT'ов, но не факт что в итоге данные получите быстрее.
    Ответ написан
    4 комментария
  • Как организовать базу статистики просмотров товаров?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Посмотрите обсуждение на Сортировка страниц по количеству просмотров за день, неделю, месяц?
    Там есть описание моей реализации, так же возможные проблемы с производительностью и советы.

    В простейшем случае, делаете отдельную таблицу со счётчиком просмотров каждого товара посуточно
    item_id
    date_day
    counter


    то есть получится таблица в которой известно кол-во просмотров за каждый день каждого товара
    данные старше 30 дней стираете, остальное агрегируете по необходимости
    Ответ написан
  • В чем ошибка при обходе дерева?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Проблема в том что если в самой функции делаете echo да ещё и рекурсию, то не нужно результат работы функции помешать внутрь другого echo так как в таком случае сперва отрабатывает функция, и делает echo, а потом уже отрабатывает внешнее echo.

    Чтобы избежать этого, и вставлять функцию как вы хотите, нужно изменить код функции так чтобы вместо echo там был return;

    Исправленный код с echo.
    <?php
    function draw($array)
    {
        foreach($array as $item)
        {
            if(isset($item['CHILD']))
            {
                echo '<li>'.$item['NAME'].'<ul>';
                draw($item['CHILD']);
                echo '</ul></li>';
            }
            else
            {
                echo '<li>'.$item['NAME'].'</li>';
            }
        }
    }
    
    $arr = [
        'CHILD' => [
            '16' => [
                'NAME'  => '1',
                'CHILD' => [
                    '17' => [
                            'NAME' => 'a'
                    ],
    
                    '18' => [
                            'NAME' => 'b'
                    ]
                ]
            ]
        ]
    ];
    
    echo '<ul>';
    draw($arr['CHILD']);
    echo '</ul>';
    Ответ написан
    1 комментарий