Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Сеть > curl: при отправке формы в ответе - страница |
Автор: liliputochka 14.1.2010, 12:24 | ||
Народ!!! Помогите пожалуйста! Заполняю поля формы значениями и посылаю на сервер, в результате должен передаваться файл с данными, но вместо этого как результат запроса мне передается страница с формой, причем не заполненой. Что делать? Вот исходник:
|
Автор: Simpliest 14.1.2010, 17:20 |
Что это значит? |
Автор: liliputochka 14.1.2010, 20:45 | ||
Это я стащила с http://ezh-leon.ru/ispolzovanie-curl-chast-2, в частности это:
Если вы считаете что данная строка является решающей, то почему когда первый раз я выполняю curl_exec() мне возвращается страница с незаполненной формой в то время, когда я передаю ей параметры? |
Автор: Simpliest 14.1.2010, 21:31 |
Лично мне некогда разбираться более детально ![]() Но форма может возвращаться пустой, например по причине GET запроса вместо POST У вас там как минимум 2 запроса, и какой из них возвращает пустую форму - вы утаили ![]() Разницу видно? Далее. Насколько я вижу, как минимум на 1й странице надо сначала авторизоваться. И только потом возможно запрашивать данные. Вы же не авторизовались. |
Автор: Simpliest 15.1.2010, 09:26 | ||||
Это не совсем то. Там не Basic Auth, а обычная форма авторизации (во всяком случае по первому адресу) Вам нужно посмотреть на ту форму авторизации и послать на нее параметры таким же способом как тут
После чего сохранить полученные куки и что там еще будет. А уж потом посылать свои данные. P.S. А не проще ли договориться о формате импорта/экспорта с владельцами ресурса? |
Автор: liliputochka 15.1.2010, 10:34 | ||||
Я реализовала по вашему совету: послала в форму аккаунт, логин, пароль; сохранила кукки; зашла на страницу куда должна передавать данные в форму; передаю данные - результат тот же - передается форма с незаполненными полями.
Спасибо за совет!!! Я постараюсь с ними связаться, как вы думаете для реализации этой операции владельцам ресурса много потребуется времени? |
Автор: liliputochka 15.1.2010, 11:17 | ||||
Я прошу прощения за
Появились сдвиги в положительном направлении - передается форма с заполненными полями, только поля: COLUMN 14 , COLUMN 24 , COLUMN 27, COLUMN 28 и COLUMN 29 возвращаются пустыми, хотя в переменной передачи данных значения этих переменных передаю
Может есть какие-нибудь идеи? Еще один вопрос: как можно сделать так чтобы заполненная форма с данными передавалась на сервер (вроде как я нажала на кнопочку Submit). Я передаю в той же форме значение поля "Submit" = 1, но форма на это не реагирует и данные не обрабатываются. |
Автор: liliputochka 15.1.2010, 12:07 | ||
Извените пожалуйста
это полностью моя вина!!! Недоглядела! |
Автор: Simpliest 15.1.2010, 15:41 | ||||||
Зависит от многих "но". В простейшем случае и при не кривых руках это делается за пару-тройку часов. Если делать полноценный Web-сервис на том же SOAP то день-два может уйти.
Вопроса не понял. CURL именно это и реализует. Может стоит почитать описание как работает HTTP? Та форма, что показывается в браузере, при отправке превращается в нечто подобное вашей строке
Плюс масса заголовков. И через CURL всеми этими данными и настройками вы и управляете. |
Автор: liliputochka 15.1.2010, 17:10 | ||||||||
Сейчас программа реализована так: 1. Захожу на страницу $URL5 = "https://cwrelectronics.com/login.php"; посылаю в форму запросом post логин и пароль, сохраняю кукки в файл 2. Захожу на страницу $URL = "http://cwrelectronics.com/b2b/productdownload.php"; пересылаю в форму данные и в конце в строке данных у меня написано
По идее при нажатии на кнопку отправки данных, данные должны пересылаться в файл
Вопрос в том как сделать так чтобы данные формы передались в нужный файл и обработались на сервере и вернули мне результат. Сейчас, пересылая
|
Автор: Simpliest 15.1.2010, 19:36 |
Еще раз объясняю. Никакого события "нажатия кнопки" на сервере нет в помине. По нажатию кнопки БРАУЗЕР отправляет на сервер запрос с данными. Сервер или получает, или не получает POST запрос с правильными или неправильными данными и выдает ответ. Установите Fiddler2. Он позволяет смотреть какой запрос куда ушел, с какими заголовками. Выполните все операции руками. Т.е. зайдите через браузер, авторизуйтесь, введите в форму данные и отправьте. После чего у вас будут образцы запросов и вы сможете сравнить с теми, что отправляете вы. |
Автор: liliputochka 18.1.2010, 18:07 |
Большое вам человеческое спасибо за совет!!! Действительно помогло! Мне не понятным осталось: почему все заголовки пересылаются, а при авторизации меня на сайте данные формы никак не отображаются? Я перестала проходить авторизацию на сайте, и думаю что это связано с тем что неверно определяю значение на поля submit. Но, как я сказала ранее, названия полей и их значения в программе нет. Есть идеи? |
Автор: Simpliest 18.1.2010, 18:09 |
Ничего не понял ![]() Какие данные и где должны отобразиться? |
Автор: liliputochka 19.1.2010, 09:49 | ||
Я запускаю программу Fiddler2, захожу на страницу авторизации. Заполняю поля формы и авторизуюсь на сайте. В программе отображается какие запросы куда пошли, какие в сети были дейтсвия, но данных из заполненной мною формы в программе не отобразились. Затем я перехожу на страницу, где заполняю поля другой формы и нажимаю кнопку submit. В программе отображается какие поля и их значения были переданы на сервер. Дело в том, что я перестала проходить авторизацию. Я предполагаю что это связано с кнопкой submit, т.к. во второй форме нажатие кнопки выглядит как:
Но поля и данные формы авторизации не фиксируются в программе. (Как я и сказала ранее.) Можете что-то подсказать? |
Автор: Simpliest 19.1.2010, 12:42 | ||
Ну, кнопку сделали картинкой. Это не должно влиять.
Так не бывает. Если конечно там рабочая форма. При нажатии submit в браузере в Fiddler появляется строка запроса. Если кликнуть по ней, то справа на вкладке Inspectors можно выбрать Raw там все должно быть. Если этого нет (или при клике по submit не появляется новой строки запроса в Fiddler), то смотрите исходный код страницы с формой. Возможно форма не рабочая (хотя это маловероятно) |
Автор: liliputochka 20.1.2010, 09:13 |
При нажатии на кнопку submit появляется строка: # Result Protocol Host URL Body Caching Content-Type Process Comments Custom 21 200 HTTP CONNECT cwrelectronics.com:443 0 iexplore:5340 На вкладке Inspectors, в разделе Raw: CONNECT cwrelectronics.com:443 HTTP/1.0 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB6.3; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0) Host: cwrelectronics.com:443 Content-Length: 0 Proxy-Connection: Keep-Alive Pragma: no-cache The data sent represents an SSLv2-compatible ClientHello handshake. For your convenience, the data is extracted below. Major Version: 3 Minor Version: 0 Random: 1F E7 0F 2B 36 0E 18 96 FE 63 80 80 00 82 2E 64 SessionID: empty Ciphers: [0005] SSL_RSA_WITH_RC4_128_SHA [000A] SSL_RSA_WITH_3DES_EDE_SHA [0013] SSL_DHE_DSS_WITH_3DES_EDE_SHA [0004] SSL_RSA_WITH_RC4_128_MD5 [10080] SSL2_RC4_128_WITH_MD5 [700C0] SSL2_DES_192_EDE3_WITH_MD5 Если не трудно, объясните что озночают эти записи. Мне бы хотелось узнать как инициировать нажатие кнопки и проверить корректность данных для аунтификации. |
Автор: Simpliest 20.1.2010, 11:30 | ||||||||||||||||
Мммм. Это точно по тем 3 урл, что в начале топика? Откуда взялся SSL?
То же что и выше
Из какой программы(как себя программа называет) инициирован запрос.
Тоже что и выше
Длина тела запроса
соединение не разрывать
запрос не кешировать Версии Понятия не имею Собственно сессия
Поддерживаемые алгоритмы шифрования Банально нажать на нее в браузере. CURL через SSL да с сертификатами работает несколько иначе. Нужно читать мануалы. |
Автор: liliputochka 20.1.2010, 12:07 | ||||
Благодарю за разъяснения. Они очень информативны. Дело все в том, что моя задача с помощью curl автоматизировать следующие действия: 1. Зайти на https://cwrelectronics.com/login.php и ввести аккаунт, логин, пароль, нажать кнопку Login* 2. Зайти на http://cwrelectronics.com/b2b/productdownload.php и заполнить поля формы, нажать кнопочку Submit* 3. Получить txt-файл с данными и сохранить этот файл на локальной машине. *) Обе кнопочки реализованы как картинки. Сейчас у меня результат следующий: 1. Захожу на страницу авторизации передаю данные, авторизуюсь на сайте, сохраняю кукки 2. Захожу на страницу скачивания товаров (там где форма с данными), заполняю форму данными После этого данные не передаются на сервер и файл не передается. Данный результат я получаю крайне редко, хотя в коде ничего не меняю, но я то прохожу авторизацию и заполняю поля формы, то прохожу авторизацию, но поля формы не заполняются, то не прохожу авторизацию ![]()
Могу вам на email переслать полный текст моего кода, чтобы вы могли посмотреть. |
Автор: Simpliest 20.1.2010, 13:36 | ||||||
Т.е. даже когда это делается руками, а не скриптом?
Могу предложить следующее. Каждый чих записывать в файл. Т.е. послали запрос - записали его вместе с HTTP заголовками в файл. Получили ответ - дописали его вместе с HTTP заголовками в файл. И заставить скрипт выполниться несколько раз. Каждый раз отмечая - получилось или нет. Таким образом вы получите дамп информации на все свои успешные и неуспешные попытки. А дальше просто копируем эти дампы в отдельные файлы и сверяем fc success.txt fail.txt >result.txt разница будет в result.txt Собственно ее(разницу) и надо анализировать. Можно еще сделать все руками и аналогичные дампы взять из Fiddler и сравнить все три между собой. Если разница будет, например, только во времени отправки, то проблема не на вашей стороне, а на их.
нет, спасибо не надо. У меня своего хватает ![]() |
Автор: liliputochka 20.1.2010, 14:20 |
Когда эти операции проделываются руками, все работает. Через скрипт - ни разу. У меня просьба, может крайне тупая: объясните что такое HTTP заголовки? Я примерно предполагаю, что это адрес страницы и данные которые я передала с этой страницы, но возможно я ошибаюсь или мое представление не полно. |
Автор: Simpliest 20.1.2010, 14:53 | ||
Тогда надо сделать как я сказал выше - записать в лог работу и скрипта и браузера, а потом сравнивать Вот тут все достаточно подробно рассказано. http://ru.wikipedia.org/wiki/HTTP http://ru.wikipedia.org/wiki/HTTP#.D0.97.D0.B0.D0.B3.D0.BE.D0.BB.D0.BE.D0.B2.D0.BA.D0.B8 |
Автор: liliputochka 22.1.2010, 09:49 |
Вопрос: когда я прохожу авторизацию у меня идет перенаправление со страницы http://cwrelectronics.com/login.php на страницу http://cwrelectronics.com/b2b/index.php Это может влиять как-то на авторизацию? Еще когда я загружаю страницу авторизации, то заголовок "GET /login.php HTTP/1.1", а когда ввожу данные и нажимаю кнопочку submit - заголовок "POST /login.php HTTP/1.1". Это происходит, как я думаю, из-за того, что этот файл и обрабатывает введенные данные. Возможно ли что из-за этого я не могу пройти авторизацию? Поясню: с скрипте идет проверка: если(метод == POST) то передать данные в форму. Может в этом дело? И еще одно: файл http://cwrelectronics.com/b2b/productdownload.php, в котором большая форма передает заголовок "GET /b2b/productdownload.php HTTP/1.1". Заполняя эту форму данными и нажимая кнопку submit данные обрабатываются в файле /b2b/handleproductdownload.php с заголовком "POST /b2b/handleproductdownload.php HTTP/1.1". И в ответе на данный запрос приходит "Content-Disposition: attachment; filename="productdownload.txt"". Возможно ли сразу передавать данные формы во второй файл и как мне принимать файл, который attachment? Буду экспериментировать еще, но пока что значительной разницы в заголовках, полученных работой непосредственно с сайтом http://cwrelectronics.com (прохождением необходимых этапов), и запуском моего скрипта нет. Какие-то идеи есть? |
Автор: Simpliest 22.1.2010, 11:58 | ||||||
В первом случае вы запросили страницу формы. Во втором случае вы отправили данные формы.
Еще раз. В скрипте может стоять проверка если метод POST то мы "получили" данные формы. Уясните наконец для себя - никакой формы на сервере нет! Там есть лишь данные запроса - его метод, строка URI и т.д. и скрипт который находится по этому адресу. Форма и есть только у вас в браузере и все. Вопрос абсолютно не понятен. Данные надо передавать туда, где их ждут. В данном случае по строкам "POST чего-то там" в Fiddler вы видите кто должен это обработать. В curl соответственно вы должны туда же и отправлять при помощи метода POST. http://php.net/curl http://ua2.php.net/manual/en/function.curl-exec.php - в третьем комментарии есть пример получения файла.
|
Автор: liliputochka 25.1.2010, 17:36 | ||
Ура! Ура! Ура! Simpliest вы мне вернули радость жизни! Я реализовала в одном скрипте авторизацию, в другом - скачивание файла. Если запускать поочередно 1.php, затем 2.php, то авторизация проходит успешно и файл скачивается! Но я пыталась реализовать последовательный вызов этих файлов в третьем, в виде:
Файл 1.php - с авторизацией - выполняется без ошибок и предупреждений. Файл 2.php - со скачиванием файла - не выполняется и ошибок не выдает и программа Fiddler2 тоже возвращает код заголовка 200 OK. Я пыталась соединить код 2-х файлов в один, но результат аналогичен выше указанному. Как такое может быть? Ведь если я делаю include, то файл должен подгружаться и выполняться код в файле! |
Автор: Simpliest 25.1.2010, 21:16 | ||||
Должен. И наверняка выполняется. Разберите в чем отличие от
Я говорил вести логи ответов? Вот и посмотрите эти логи в 1м и втором случае. Скорее всего у вас не передается SID после авторизации. Может кука не запоминается или еще что-то. А может стоит забытый банальный die() в 1м скрипте и до 2го дело просто не доходит. Код есть только у вас. Поэтому http://phpfaq.ru/debug можете делать только вы. Без конкретных сообщений об ошибках никто помочь вам не сможет. |
Автор: liliputochka 28.1.2010, 10:21 | ||
Уважаемый Simpliest, вот что я выявила: скрипт 1.php выполняет все curl_setopt(), вроде выполняет curl_exec(), т.к. создает файл cookiefile.txt и на этом свою работу заканчивает. Раньше он ругался на то, что не находил файл favicon.ico. Но я его скачала. В браузер никакой информации по ошибкам не выводится. Заголовки ошибки не выдают, наоборот пишут "HTTP/1.1 200 OK". Последнее что записано в /usr/local/apache/log/error.log:
Может знаете что можно сделать? |
Автор: Simpliest 2.2.2010, 21:02 | ||
Уф. Вроде или таки выполняет? Если выполняет, то какие результаты ожидаются? Получены ли они? Что содержиться в файле cookiefile.txt? То что ожидалось? Это чей лог? Того сайта к которому вы пытаетесь подключиться? Или ваш? Если ваш - то зачем он? Логи я рекомендовал вести для своих данных и ответов. т.е. что-то вида
функцию logtofile естественно надо писать самостоятельно. |
Автор: liliputochka 21.2.2010, 12:14 |
Вопрос решился таким образом: Если процесс авторизации на сайте прошел успешно, сайт перенаправляет на другую страницу. В этот момент мой скрипт с curl обрывает работу. В следствие чего пришлось разделить работу curl на 2 скрипта, один - проходит авторизацию и 2 - скачивает файл информации. Эти файлы надо запускать последовательно, сначала один потом второй. Это положение дел крайне неприятно, но другого решения я не знаю и придумать не могу. Большое спасибо за помощь Simpliest |
Автор: Fortop 21.2.2010, 17:38 | ||
Что значит прерывает? Вы его завершаете? Или он выдает ошибку? Для перенаправления используйте http://ua.php.net/manual/en/function.curl-setopt.php CURLOPT_FOLLOWLOCATION |
Автор: liliputochka 25.2.2010, 15:18 |
Fortop спасибо вам большое! ![]() |
Автор: Fortop 25.2.2010, 15:25 |
Карл Маркс и Фридрих Энгельс - это не муж и жена, а 4ре разных человека. |