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

Формы через метод GET

Как известно, формы можно отправлять методом GET, а можно методом POST.

Формы, отправляемые методом GET легко имитировать и без всяких ухищрений - можно просто к URL страницы прибавить GET параметры.

Например: пусть у нас дана страница site.ru и на ней форма с полями name и message. В этом случае форму можно отправить так: site.ru?name=Имя&message=Сообщение.

Такое сработает только если форма отправляется методом GET (<form method="GET"> или <form> - вообще без атрибута). Если форма отправляется через POST <form method="POST"> - тоже может сработать, если внутри сайта данные из формы получаются через $_REQUEST, а не через $_POST.

Формы через метод POST

Однако, чаще всего формы отправляются методом POST.

В этом случае в curl_setopt следует сделать настройку CURLOPT_POSTFIELDS и передать ей массив полей и их значений для отправки на север:

curl_setopt($curl, CURLOPT_POSTFIELDS, ['field1'=>'value1', 'field2'=>'value2',]);

Можно также передавать не массив, а строку (строится так же, как и GET запрос):

curl_setopt($curl, CURLOPT_POSTFIELDS, 'field1=value1&field2=value2');

Подводные камни

Отправка формы может не сработать по некоторым причинам. Например, в форме есть скрытое поле <input type="hidden">, на которое вы не обратили внимание или дополнительные поля добавляются с помощью JavaScript.

В общем мораль всего этого такова: чтобы точно понять, какие поля формы отправляются на сервер - отправьте форму вручную и, используя отладчик браузера, посмотрите какие поля отправляются.

....

Отправка файлов через CURL

TODO http://zudochkin.ru/2011/03/uploading-files-using-curl-php/ http://easy-code.ru/lesson/advanced-curl-php - тут отправка файлов есть Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1¶2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом. С версии PHP 5.5.0, префикс @ устарел и файлы можно отправлять с помощью CURLFile. Префикс @ можно отключить, чтобы можно было передавать значения, начинающиеся с @, задав опцию CURLOPT_SAFE_UPLOAD в значение TRUE. http://php.net/manual/en/class.curlfile.php