Ответы пользователя по тегу PHP
  • Как ускорить рассылку через phpmailer?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    500-1000 секунд это 6-12 минут примерно. Это вообще не тот масштаб, за который имеет смысл волноваться. Рассылается и ладно...
    Ответ написан
    Комментировать
  • Возможно ли создать скрип, который после бронирования клиентом будет отписывать ему в telegram(WP)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Telegram невозможно писать по номеру телефона. Ну, точнее, можно с помощью клиентского API найти пользователя по номеру (если не запрещено его настройками приватности) и от пользовательского же аккаунта ему написать. Но это будет нарушением правил Телеграма, и при сколько-нибудь заметной активности в поиске юзеров по номеру Телеграм банит. Я рекомендую отказаться от этой затеи. Телеграм для этого не предназначен.

    Возможность отправки по номеру телефона для бизнесов есть в Viber, WhatsApp, VK/OK, но это платно и бизнесу нужно будет пройти верификацию. Или использовать SMS, которые по определению работают по номеру телефона.

    Из других идей: можно предлагать пользователю подписаться на специального бота, получить у него некий код, который ввести в поле при бронировании, тогда бронирующий сайт сможет запомнить user_id клиента в Телеграме и сможет посылать ему через бота сообщения (пока тот от бота не отпишется). Тоже не шибко удобное решение.

    Большинство небольших сайтов ограничиваются электронной почтой, это проще всего.
    Ответ написан
  • Как можно получить ключ доступа к api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по всему, их API теперь переехал сюда developers.pho.to
    На это намекает, что вызов API https://photolab.me/api/feed/best перенаправляет на https://photolabsocialapi.pho.to/api/v1/feed/best
    Ответ написан
    Комментировать
  • Telegram: как передать текст в callback?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Общий принцип - нужно запомнить, что для данного конкретного chat_id изменилось состояние, и следующее событие именно в этом chat_id надо обработать иначе, не по умолчанию.

    Во многих библиотеках для этого есть поддержка FSM (FSM - Finite State Machine - конечный автомат). В php-библиотеках я не очень разбираюсь, но можно поискать в сторону "название библиотеки FSM", либо в библиотеке уже есть своё решение этой задачи, либо кто-то уже наверняка над этим задумывался раньше, так что можно найти примеры подобного. В конце концов, написать самому под свои задачи.
    Ответ написан
  • Как настроить передачу с формы на заказчика т.г?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Токен не даёт полного доступа к аккаунту, только возможность отправлять/принимать сообщения от имени бота. Так что это вполне нормально передавать токен бота для интеграции. В конце концов, владелец бота может через BotFather поменять токен и тем самым быстро отключить ранее выданный.
    Ответ написан
    3 комментария
  • Как реализовать Mutual TLS?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сначала немного теории.

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

    Обычно мы привыкли, что в SSL только серверная сторона доказывает свою подлинность. Идея mTLS в том, что обе стороны должны предоставить свой публичный сертификат, подписанный CA. Тогда если сервер доверяет CA, он будет доверять и клиентскому сертификату.

    Но публичный ключ не имеет смысла без приватного. А в куске кода в вопросе он вообще не встречается.

    Итак, что нам нужно для установления сессии?

    1. Сертификат CA - kbs_ca.crt (скорее всего, можно склеить оба CA - промежуточный и корневой - в один файл);
    2. Приватный ключ клиента, который он будет использовать для шифрования - private.key;
    3. Соответствующий приватному публичный ключ-сертификат, который клиент будет сообщать серверу - public.cer.

    Я ввёл в гугл "php curl mtls" и в первой же ссылке есть пример кода: https://smallstep.com/hello-mtls/doc/client/php

    В примере, конечно, нет пароля от ключа, но справка подсказывает, что это опция CURLOPT_SSLKEYPASSWD.
    Ответ написан
  • Как сделать что-бы бот отправлял сообщение в групповой но, не в лс?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Распространённая ошибка: в качестве chat_id используется id пользователя. Естественно, получателем будет пользователь, а не группа.

    Правильно вместо этого:

    $chat_id = $data['message']['from']['id'];

    использовать это:

    $chat_id = $data['message']['chat']['id'];
    Ответ написан
    Комментировать
  • Пытаюсь запросить данные из MySQL через PHP. Где ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В чём глубокий смысл перезатирать $link результатом запроса?

    $link = mysqli_query($link, "SELECT * FROM 'table-name' WHERE USER_ID = 1620");


    Я уж не говорю о том, что дефис в имени таблицы это чересчур...
    Ответ написан
    Комментировать
  • Как получить фото с помощью телеграм бот api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Они там поленились документацию написать. Но нетрудно понять, что следует использовать метод downloadFile https://github.com/TelegramBot/Api/blob/master/src...
    Ответ написан
    Комментировать
  • Как выполнить еще одну команду в docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это считается не docker-way (правильнее в отдельном контейнере запустить отдельный обработчик очереди), но можно так:

    одна команда & другая команда

    Можно также сделать скрипт, который всё как надо запустит, и использовать его в качестве cmd. Можно также внедрить в контейнер микросистему управления сервисами типа runit.

    Почему считается, что плохо так делать? Если php-fpm упадёт, то весь контейнер упадёт и может перезапуститься автоматом. А если упадёт второй сервис, то контейнер будет работать как ни в чём не бывало.
    Ответ написан
    Комментировать
  • Как авторизовать пользователя на сайте через бот Вайбера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Update: как обсудили с автором, скорее всего тут речь об использовании deep linking. Пользователь идёт по ссылке, где в context передаётся какой-то идентификатор или хеш, затем делится с ботом своим номером телефона, и авторизация пройдена.

    Предыдущий ответ оставляю, так как он тоже может оказаться полезен:

    Viber Bot (в девичестве Viber Public Account) не позволяет отправку сообщений по номеру телефона. Для этого надо использовать Viber Business Messages (в девичестве Viber Service Messages) через партнёров Viber.

    Обычная практика в этой сфере - посылать сообщение через Viber, затем по таймауту высылать запасную СМС. Это называют модным словом "каскад". Можно для повышения надёжности включать в каскад также WhatsApp (и другие каналы с отправкой по номеру телефона, например, mail.ru notify). Но можно просто при проверке номера пользователя предлагать ему самому выбрать из списка предпочтительный канал для проверки (если не сработает - пользователь попробует другой канал самостоятельно).

    Нужно быть готовым к тому, что стоимость отправки в Viber/WA по номеру телефона стоит дороже, чем СМС. Хотя сообщение на мессенджеры принято тарифицировать только при успешной доставке (недоставленные бесплатны), есть также обязательный ежемесячный платёж (для Viber это требование самого Viber, для WhatsApp большинство поставщиков продают минимальный пакет хотя бы на 5-10 тыс. рублей, а те, кто не берут абонентку, для покрытия своих расходов тарифицируют даже бесплатные сообщения).
    Ответ написан
  • Что нужно установить и сделать, чтобы начать пользоваться?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самый простой способ - использовать perl. У него есть специальные ключи, которые автоматизируют выполнение из командной строки, цикл и печать в конце цикла. В результате команде можно передать просто регулярку или сделать простой однострочник, применяемый к каждой строке файла.

    Ключ -e заставляет считать первый аргумент кодом, а не именем файла.
    Ключ -n оборачивает этот код в цикл while(<>) { ... }
    Ключ -p добавляет в конец print.

    В результате команда perl -pne 's/foo/bar/' превращается в аналог скрипта такого содержания:

    while(<>) {
      s/foo/bar/;
      print;
    }


    Конечно, как нетрудно догадаться, такой вызов аналогичен вызову sed s/foo/bar/ Таким образом, perl можно использовать почти как sed или awk, только с более богатыми регулярными выражениями и более широкими возможностями программирования.

    Например:

    some_command|perl -pne 's/foo/bar/g; s/lorem (\d+)/\1 ipsum/g' > output.txt
    perl -ne '/([_\w]+)\s*=\s*"(.+)"/ && print "key $1 value $2\n"' /etc/environment
    Ответ написан
    3 комментария
  • Отправка смс через шлюз Yeastar кириллицей?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Передавать кириллицу надо в кодировке UCS-2 (UCS-2BE). Также надо в первые 6 байт (3 символа) поместить в UDH (User Data Header) информацию о склейке. Это такие байты:

    05 00 03 xx yy zz

    Тут:
    xx - уникальный идентификатор (можно выбирать случайное число от 0 до 255).
    yy - общее количество сегментов (n)
    zz - номер сегмента (1...n)

    Также обычно где-то надо передать data_coding сообщения и признак наличия склейки и/или UDH в теле сообщения (в SMPP, например, для этого используется бит 0x40 в esm_class). С Yeastar не сталкивался, не знаю, как конкретно там это устроено.

    Из-за наличия UDH в теле сообщения максимальная длина сегмента уменьшается на 3 символа и ограничена 67 символов.

    См. также
    https://en.wikipedia.org/wiki/Concatenated_SMS
    https://en.wikipedia.org/wiki/User_Data_Header
    Ответ написан
  • Как проверить хэш PHP функции crypt на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В python есть такая же функция в модуле crypt.

    $hash = crypt ($password, $salt);

    from crypt import crypt
    hash = crypt (password, salt)
    Ответ написан
    Комментировать
  • Как в телеграм-боте задать ключ для кнопки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    "Ключи" можно задать только для inline-клавиатуры.
    Ответ написан
    Комментировать
  • Настройка webhook instagram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что параметры называются hub.challenge, а не hub_challenge; hub.verify_token, а не hub_verify_token.

    Upd: как выяснили, php принудительно меняет точку на подчёркивание. Пока обсуждаем в комментариях.
    Ответ написан
  • Почему не выводится результат в inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё прекрасно работает.

    615a38bc692d3060148638.png
    Ответ написан
  • Как перенести куки через nginx?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это вообще-то не к nginx вопрос. Решение о том, какие куки принимать в рассмотрение и передать в запросе к тому или иному домену, принимает браузер, и он должен это делать в соответствии с RFC 6265 (не путать с устаревшими RFC 2109, 2965, там есть отличия).

    Если коротко, то sub.domain.com может поставить куку как на sub.domain.com, так и просто на domain.com (в этом случае она будет также действовать на все поддомены одного уровня с sub.domain.com). Но domain.com не может поставить куку на домен com, потому что в домене должна быть минимум одна точка (такая защита).

    Для экспериментов можно поиграться с куками вот в этой песочнице с субдоменами: https://scripts.cmbuckley.co.uk/cookies.php и посмотреть
    Ответ написан
    Комментировать
  • Как правильно работать с большим количеством данных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    70 Гб - это вообще не гигантский объём. Люди оперируют террабайтами и даже больше. Главная проблема не в объёме таблицы, а в том, чтобы не читать её целиком (full scan) при выполнении запроса. И вот тут главная фигня: одно только условие like '%слово%' в любом случае требует просмотреть каждую строку, значит, будет full scan. Обычные индексы по этому полю строить бесполезно. Есть всякие полнотекстовые, но в общем случае их тоже надо правильно готовить, чтобы работало приемлемо. Решение может зависеть от задачи. Например, если это ключевые слова в виде текстовой строки с пробелами или иными разделителями, то их можно вынести в отдельную таблицу отдельными строками и проиндексировать там, полнотекстовый поиск тут будет излишним.
    Ответ написан
    1 комментарий
  • Как адаптировать код php под FreeBSD?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Просто вынести содержимое блока while(true) { ... } из цикла и убрать sleep, тогда вместо бесконечного цикла скрипт будет делать то же самое всего один раз. После этого скрипт можно гонять через cron.

    Вопрос чисто по php, остальные тэги лишние.
    Ответ написан
    Комментировать