Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±

    Использование функционала PHP в Pawn | Отправка сообщение на почту игрока

    Приветствую, в этом уроке я хотел бы рассказать Вам, как отправлять запросы и как написать PHP скрипт, чтобы можно было использовать функционал PHP, которых нет в Pawn. Для этого нам потребуется инклюд a_http.inc из основной библиотеки SAMP и собственный PHP скрипт в котором будем обрабатывать полученные данный при отправке запросы.



    Разбор a_http.inc:

    В инклюде имеется только одна функция, которая поддерживает отправку запроса на указанный URL адрес, так же получение ответа на отправленный запрос. Функция:

    HTTP(index, type, url[], data[], callback[]);

    Параметры:

    • index - идентификация запроса c помощью которого можно различать ответы на отправленные запросы (как playerid)
    • type - тип запроса, имеется три типа запроса: HTTP_GET | HTTP_POST | HTTP_HEAD
    • url[] - URL адрес в который отправляется запрос, указывать нужно без http:// или https:// (пример google.com или www.google.com)
    • data[] - данные для отправи, используется при запросах типа HTTP_POST
    • callback[] - колбэк для обработки ответа на отправленный запрос

    Возвращает:

    1 - если запрос был отправлен | 0 - при ошибке во время отправки запроса



    Типы запросов:

    HTTP_GET:

    Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.
    Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»
    Ссылка на источник

    HTTP_POST:

    Метод запроса POST предназначен для запроса, при котором веб-сервер принимает данные, заключённые в тело сообщения, для хранения. Он часто используется для загрузки файла или представления заполненной веб-формы.
    В отличие от него, метод HTTP GET предназначен для получения информации от сервера. В рамках GET-запроса некоторые данные могут быть переданы в строке запроса URI, указывающие, например, условия поиска, диапазоны дат, или другую информацию, определяющую запрос. В рамках POST запроса произвольное количество данных любого типа может быть отправлено на сервер в теле сообщения запроса. Поля заголовка в POST-запросе обычно указывают на тип содержимого.
    Ссылка на источник

    HTTP_HEAD:

    Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения.
    Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше — копия ресурса помечается как устаревшая.
    Ссылка на источник



    Как написать PHP скрипт?

    Для этого не надо быть профессианалом в скриптовом языке PHP, достаточно знать несколько функций и основы всех ЯП (if/else)
    Давайте рассмотрим пример отправки писем с кодом подтверждение на электронную почту игроку, используем POST запрос и передадим некоторые данные на PHP скрипт где их обработаем и отправим письмо.

    Отправка письма с кодом подтверждение на почту игрока:

    Нам нужно сначала отправить данные игрока, для этого используем функцию HTTP из a_http.inc:

     Pawn код:
    PHP код:
    #define PHP_SCRIPT_URL "www.your-site.com/location/of/php/script.php"
    #define MAX_PLAYER_MAIL 65 //максимальная длина почты игрока

    public OnPlayerConnect(playerid)
    {
        static const 
    string_content[] = "code=%d&email=%s";

        new
            
    string[sizeof string_content MAX_PLAYER_MAIL],
            
    random_numbers random(8999) + 1000//сгенерируем рандомные числа (4), и сохраним в переменный random_numbers, чтобы передать POST запросом
        
        
    format(stringsizeof stringstring_contentrandom_numbers,
            
    player_email); //вместо player_email укажите переменную, которая хранит адрес эл. почты игрока
        
        
    HTTP(playeridHTTP_POSTPHP_SCRIPT_URLstring"OnPlayerReceiveMessage");
        return 
    1;
    }

    forward OnPlayerReceiveMessage(playeridresponse_coderesponse_message[]);
    public 
    OnPlayerReceiveMessage(playeridresponse_coderesponse_message[])
    {
        if(
    200 != response_code
        {
    //если произошла ошибка во время отправки, то логируем
            
    printf("Произошла ошибка во время отправки сообщения на электронную почут:\n\
                Код ошибки: %d\n\
                Сообщение: %s"
    response_coderesponse_message);
        }

        else
        {
    //если все прошло отлично, то логируем
            
    printf("Сообщения, игроку: %d, отправлена!"playerid);
        }

        return 
    1;


     Разбор кода:
    PHP код:
    #define PHP_SCRIPT_URL "www.your-site.com/location/of/php/script.php" 
    Что это за макрос?

    PHP_SCRIPT_URL - это URL адрес где лежит ваш php скрипт для обработки данных, то есть именно в этот скрипт мы передаем данные.



    PHP код:
    HTTP(playeridHTTP_POSTPHP_SCRIPT_URLstring"OnPlayerReceiveMessage"); 
    • plaeyerid - так иденцефируем запрос, чтобы обработать ответ, об этом уже было сказано выше.
    • HTTP_POST - тип запроса, используем именно этот, так как мы передаем данные на веб-сервер, о типах запросов можете прочитать выше.
    • PHP_SCRIPT_URL - отправляем запрос на URL адрес, который указали выше.
    • string, который равен к code=random_numbers&email=эл_адрес_почты
      Это данные передаваемые через POST запрос на веб сервер:
      • code=random_numbers - это код подтверждение, которого нужно отправить игроку, сгенерирован рандомный код, который хранится в random_numbers.
      • &email=эл_адрес_игрока - указываем электронный адрес игрока, на который будет выслан письмо. Указываем электронный адреc после знакак "=". Почему перед email стоит знак &? Это разделитель переменных POST запросов. То есть мы говорим скрипту, что передается уже другая переменная email. Как было сказано, значение пременного указываем после символа "=".
      То есть в итоге мы получаем: string, в котором хранится code=random_numbers&email=эл_адрес_почты. Кстати, в POST запросе нет ограничение на кол-во переменных передаваемых на веб-сервер, то есть вы можете указывать несколько переменных разделяя их через символ "&".

    • "OnPlayerReceiveMessage" - имя колбэка где идет обработка ответа, его нужно будет создать, можно назвать как угодно (только не перепутайте потом :))




    PHP код:
    forward OnPlayerReceiveMessage(playeridresponse_coderesponse_message[]);
    public 
    OnPlayerReceiveMessage(playeridresponse_coderesponse_message[])
    {
        if(
    200 != response_code
        {
    //если произошла ошибка во время отправки, то логируем
            
    printf("Произошла ошибка во время отправки сообщение на электронную почут:\n\
                Код ошибки: %d\n\
                Сообщение: %s"
    response_coderesponse_message);
        }

        else
        {
    //если все прошло отлично, то логируем
            
    printf("Сообщение, игроку: %d, отправлена!"playerid);
        }

        return 
    1;

    Я думаю тут все понятно, создаем колбэк корого указали в HTTP для обработки ответа веб-сервера. Но у вас может возникнуть почему в успешном случае веб сервер возвращает код ответа, который равен 200. Так, это дефлотный значение для всех веб-серверов, но вы можете возвращать другие значение через php скрипт и в этом колбэке проверять их, то есть таким образом можно создать несколько исходов событий. Еще вы можете отправлять через php скрипт строки и обработать их в этом колбэке, строки ответа будут сохранены в response_message. Таким образом вы сможете сразу отравлять сообщение с ошибкой и выводить их игроку или логировать (и не только сообщение об ощибках, можно отправлять что угодно). *Обратите внимание, запросы типа HEAD не будут возвращать строки, об этом написано чуть выше!


    Давайте теперь напишем php скрипт, я предоставлю вам собственный php скрипт, которого написал сам для своих проектов (но не последнюю версию). Я не силён в php, так что профессионалы в этой сфере, пожалуйста не судите строго (да и основной язык этого форума не является php):

     PHP код:
    PHP код:
    <?php
        http_response_code
    (400);

        
    $IP "ТУТ.УКАЖИТЕ.IP.ВАШЕГО.СЕРВЕРА"
        
        
    if ($IP !== $_SERVER['REMOTE_ADDR']) { //Если запрос отравлен не с вашего сервера то запрещаем доступ
            
    die("Доступ запрещён");
        }
        elseif (
    strlen($_POST['email']) <= 0) {
            die(
    "Не указан электронный адрес!");
        }
        elseif (
    strlen($_POST['code']) <= 0) {
            die(
    "Не указан код подтверждение!");
        }

        
    $mail mb_convert_encoding($_POST['email'], "UTF-8""Windows-1251"); 
        
    $code mb_convert_encoding($_POST['code'], "UTF-8""Windows-1251"); 
        
    $message 'Ваш код подтверждение: '.$code.;
        
    $headers  "From: Имя вашего сервера или проекта\r\n";
        
    $headers .= "MIME-Version: 1.0\r\n";
        
    $headers .= "Content-type: text/html; charset=UTF-8\r\n";  
        
        if(
    mail($mail"Код подтверждение"$message$headers))
            
    http_response_code(200);
        
        die(
    "\0");
    ?>

     Разбор кода:
    Давайте сначала разберем некоторые функции и переменные:
    http_response_code(400); - устанавливаем код возврата на 400, тот самый response_code для колбэка в Pawn. Но почему именно 400 и еще в начале кода? Так мы сообщаем колбэку, что что-то пошло не так в коде и он не выполнился до конца или сообщение не отправился, почему в начале? Потому, что мы еще не знаем выполнится ли код до конца и сразу на всякие случае устанвливаем код возврата на 400, этот код не передастся в колбэк пока мы сами не выйдем из скрипта (то есть не закончим функцию как в Pawn с помощью return,
    но тут мы будем использовать функцию die вместо return, чтобы завершить код).
    Ладно пошли дальше: $_POST['email'] и $_POST['code']. Да да что-то знакомое, верно? Это те самые переменные которых мы передали через POST запрос, именно так мы можем обращаться к ним.

    Вернемя к коду:
    PHP код:
        if ($IP !== $_SERVER['REMOTE_ADDR']) { //Если запрос отравлен не с вашего сервера то запрещаем доступ
            
    die("Доступ запрещён");
        }
        elseif (
    strlen($_POST['email']) <= 0) {
            die(
    "Не указан электронный адрес!");
        }
        elseif (
    strlen($_POST['code']) <= 0) {
            die(
    "Не указан код подтверждение!");
        } 
    Тут мы проверям были ли переданы все нужные нам переменные. Почти идентично с pawn strlen. Если не были указаны, то заканчиваем скрипт с передачей строк в колбэк, через функцию die. То что мы укажем внутри них передадутся в pawn колбэк, да это те самые response_message. Угадайте какой код ответа будет передан? Конечно, же 400, потому что мы указали их в начале и колбэк воспримет эти строки, как строки ошибок и выведит их в лог. Вот почему мы указали код ответа в начале.

    Едем дальше.
    PHP код:
    $email mb_convert_encoding($_POST['email'], "UTF-8""Windows-1251");
    $code mb_convert_encoding($_POST['code'], "UTF-8""Windows-1251"); 
    Тут мы создаем 2 переменных $email и $code, записывая в них значение которых мы передали POST запросом, но меняя кодировку на UTF-8. Как все (наверное) знают, кодировка в samp = Windows-1251 или как еще называют Cyrilic-1251. А у большинство почтовых сервисов кодировка UTF-8, из за чего если пердадим переменные таким образом, как мы их получили, то в письме отобразяться иероглифы. Кстати насчёт кодировки, не забудьте сам скрипт сохранить в кодировке UTF-8!. И еще die передает значение в кодировке UTF-8 из за этого в игре это может отобразиться как иероглифы, эту проблему можно решить используя функцию mb_convert_encoding как это был продемонстрирован выше.

    PHP код:
    $message 'Ваш код подтверждение: '.$code.; 
    Тут тело сообщение, который будет в письме. вместо $code будет тот самый код подтверждение. Почему я вывел тело сообщение в php скрипт, а не передал его через HTTP? Ответ прост, во первых экономие памяти. Во вторых оформление: В php скрипте вы можете оформить свое сообщение который будет отправляться игроку, через html разметку. Но нельзя подключать CSS файлы или указывать style в head. Это не сработает. Сработает только такой трюк: Нужно указывать стиль в самом теге, пример: <div class="test" style="background: black; color: white;">Hello, world!</div>. Примерно так, тестируйте, создавайте свои стили!

    Дальше у нас идёт:
    PHP код:
        $headers  "From: Имя вашего сервера или проекта\r\n"
        
    $headers .= "MIME-Version: 1.0\r\n"
        
    $headers .= "Content-type: text/html; charset=UTF-8\r\n"
    Это дополнительный настройки сообщение, наверное тут всё понятно. Если не понимаете, не советую менять, но не запрещаю эксперементировать)))

    PHP код:
    if(mail($email"Код подтверждение"$message$headers)) 
            
    http_response_code(200); 
    Вот оно, то место для чего было столько заморочек: отправка письма). Тут проверяем, если письмо успешно отправлено, то меняем код возврата на 200, вот тут уже можно менять так как уже все прошло отлично и мы должны сообщить об этом.

    PHP код:
    die("\0"); 
    Заканчиваем скрипт, выходим из него.

    Вот такими манипуляциями можно обращаться к php скрипту, это лишь маленький пример, того что можно сделать. Используя PHP скрипты можно натворить очень много вещей, которых нельзя реальзовать используя лишь язык Pawn. Если вы хотите, я могу предоставить еще один пример использование HTTP + PHP, на котором будет продемонстрирован метод получение времени по указанному локацию и установка этого времни на игровом сервере.



    Спасибо за внимание, пожалуйста оставляйте свои отзывы. Если нашли ошибку в статье, пожалуйста отпишитесь. Если есть идеи, сообщите. Критика приветствуется.

    P.S. Укажу на один фактор ещё раз. Все вышеперечисленные коды являются только ДЕМОНСТРАЦИЕЙ. Эти коды далеко не идеальны. Суть данного урока был лишь показать как можно обращаться к PHP скрипту через Pawn.HTTP, а не как защитить свой PHP скрипт, как указывал Batya_Montes

    Автор: Geebrox
    Запрещено копировать в другие источники без разрешение автора!


    Последний раз редактировалось Geebrox; 14.01.2018 в 12:51. Причина: Добавлен проверка IP отправителя запроса, добавлен форматирование в пример

  2. #2
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    PHP код:
    Если вы хотитея могу предоставить еще один пример использование HTTP PHPна котором будет продемонстрирован метод получение времени по указанному локацию и установка этого времни на игровом сервере
    А на кой черт он нужен ? Вроде бы сайт про pawn, а не php. Способ работы с http показали, а вот писать php скрипты как-то не уместно по жанру форума. Для этого существует огромная куча типизированных форумов/сайтов.

  3. #3
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    PHP код:
    Если вы хотитея могу предоставить еще один пример использование HTTP PHPна котором будет продемонстрирован метод получение времени по указанному локацию и установка этого времни на игровом сервере
    А на кой черт он нужен ? Вроде бы сайт про pawn, а не php. Способ работы с http показали, а вот писать php скрипты как-то не уместно по жанру форума. Для этого существует огромная куча типизированных форумов/сайтов.
    Я указал что "Если хотите", и в этом не участвует только одни ЯП. Там используется Pawn + PHP. Если тебе не интересно, то может другому будет интересно об этом прочитать.
    Последний раз редактировалось Geebrox; 13.01.2018 в 20:52.

  4. #4
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Я указал что "Если хотите", и в это не участвует только одни ЯП. Там используется Pawn + PHP. Если тебе не интересно, то может другому будет интересно об этом прочитать.
    Я бы и врагу не посоветовал использовать код из темы (не обижайся сильно), ибо даже элементарных защит в скрипте нет. Да и не факт что вообще скрипт будет отправлять письма (при кривой настройке веб-сервера), поэтому лучше использовать smtp отправку, да и вероятность попадания в спам у ПС будет минимальная. Поэтому как бы даже если кто-то захочет, то смысла нет, просто напросто сервер положат человеку да и все ;)

  5. #5
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    Я бы и врагу не посоветовал использовать код из темы (не обижайся сильно), ибо даже элементарных защит в скрипте нет. Да и не факт что вообще скрипт будет отправлять письма (при кривой настройке веб-сервера), поэтому лучше использовать smtp отправку, да и вероятность попадания в спам у ПС будет минимальная.
    Я разве говорил, что код идеален? Ты читать не умеешь? Я там предупредил. Причем не рабочий код бы я не выкладывал в эту тему. Уже много лет использую данный код (почти такой же, немного отредактированный), не попадал под спам никогда. Попадание в спам не зависит только от твоего кода, а от хостинга тоже зависит. Никто тебя не заставляет использовать этот код, это лишь ДЕМОНСТРАЦИЯ.

  6. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    В пример на Pawn следовало бы добавить форматирование строки перед вызовом HTTP(). Всё-таки, код подтверждения и текст - не константы.

    Также в скрипт на PHP желательно добавить проверку IP, дабы убедиться, что скрипт вызван сервером, а не злоумышленником. Не уверен, возможен ли здесь спуфинг IP-адреса, но лучше уж такая проверка, чем совсем ничего.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #7
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В пример на Pawn следовало бы добавить форматирование строки перед вызовом HTTP(). Всё-таки, код подтверждения и текст - не константы.

    Также в скрипт на PHP желательно добавить проверку IP, дабы убедиться, что скрипт вызван сервером, а не злоумышленником. Не уверен, возможен ли здесь спуфинг IP-адреса, но лучше уж такая проверка, чем совсем ничего.
    Хорошо добавлю проверку IP. Насчет констант, я же там написал, что можно форматировать, но для примера будем использовать макросы. Добавлю форматирование тоже.

  8. #8
    Аватар для Disinterpreter
    Проверенный

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    88
    Репутация:
    91 ±
    У меня так в МТА человечек один сделал весь свой гейммод на php с удаленными вызовами в игру. Закончилось плачевно тем, что длительность реквестов была слишком огромна в один прекрасный момент.
    Культурный обмен во все времена был одним из важных развлечений. (С) Татикома из "Призрак в доспехах: Синдром одиночки"

  9. #9
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Disinterpreter Посмотреть сообщение
    У меня так в МТА человечек один сделал весь свой гейммод на php с удаленными вызовами в игру. Закончилось плачевно тем, что длительность реквестов была слишком огромна в один прекрасный момент.
    Эм, к чему это? Не понял суть Вашего поста. Но учту для будущего.

  10. #10
    Аватар для Disinterpreter
    Проверенный

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    88
    Репутация:
    91 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Эм, к чему это? Не понял суть Вашего поста. Но учту для будущего.
    К тому, что способ интересный, но далеко не самый лучший.
    Культурный обмен во все времена был одним из важных развлечений. (С) Татикома из "Призрак в доспехах: Синдром одиночки"

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •