DotNetNuke, PHP, имитация удаленной обратной передачи с помощью curl

У меня есть страница в DNN, например: http://nolimitswebdesign.com.dnnmax.com/test/tabid/57/ctl/Edit/mid/374/Default.aspx

Мне нужно отправить запрос на эту страницу с помощью PHP+Curl, который изменяет содержимое текстовой области и сохраняет его (как если бы кто-то изменил его вручную и нажал кнопку обновления на этой странице). Сомневаюсь, что с DNN это невозможно. Пожалуйста, порекомендуйте.


person Shoaibi    schedule 09.10.2010    source источник


Ответы (1)


Вот как бы я подошел к проблеме: один и тот же общий метод будет работать на любом веб-сайте. В этом контексте DNN — это просто обычный веб-сайт ASP.Net. Сначала посмотрите на javascript, который запускается при нажатии кнопки «Обновить»:

__doPostBack('dnn$ctr374$EditHTML$cmdUpdate','')

Найдите метод __doPostBack:

function __doPostBack(eventTarget, eventArgument) {
  if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
    theForm.__EVENTTARGET.value = eventTarget;
    theForm.__EVENTARGUMENT.value = eventArgument;
    theForm.submit();
  }
}

Это стандартный метод doPostBack(), используемый во многих формах ASP.Net. Из этого видно, что вы хотите заполнить скрытые поля __EVENTTARGET и __EVENTARGUEMENT соответствующими значениями из вызова метода и отправить форму.

Конечно, вам также необходимо заполнить данные, которые вы действительно хотите сохранить, в поле ввода для текстового поля. Вероятно, это будет проще сделать, если вы используете базовый режим текстового поля модуля HTML, тогда вам просто нужно установить значение текстовой области, а не выяснять, куда вставить значение в fckEditor, и техника будет по-прежнему работают, если сайт настроен на использование провайдера Telerik вместо провайдера fck.

Одна вещь, на которую следует обратить внимание, это то, что имя элемента управления может время от времени меняться, поэтому вам нужно быть уверенным, что вы читаете правильные идентификаторы для цели события, а textarea не просто жестко кодирует что-то.

person ScottS    schedule 10.10.2010
comment
Ссылка в конце комментария содержит полный исходный код, я считаю, что сделал все проверки, которые вы предложили, пожалуйста, проверьте и оставьте отзыв: dotnetnuke.com/Community/Forums/tabid/795/forumid/201/threadid/ - person Shoaibi; 11.10.2010
comment
@Shoaibi, быстрый взгляд на код по ссылке в целом кажется мне правильным (осторожно, нет опыта работы с PHP). Я не вижу ничего, чтобы сохранить файл cookie для входа, это может быть проблемой. Отсортировав файлы cookie, я бы использовал заголовки Live HTTP, чтобы перехватить все значения из сообщения вручную и заставить скрипт работать с этими значениями. Затем я бы отредактировал значения, которые вы хотите изменить. - person ScottS; 12.10.2010
comment
Я могу редактировать текст внутри textarea без входа в систему, действительно ли мне нужно сохранять куки? - person Shoaibi; 12.10.2010
comment
Если мне нужно поддерживать файлы cookie, как мне это получить, потому что ответ, возвращаемый GET curl, представляет собой простой html и не содержит никаких данных файлов cookie - person Shoaibi; 12.10.2010
comment
Была возможность добавить код обратной передачи javascript к целевому URL-адресу в POST-запросе curl, не помню, где я это видел... - person Shoaibi; 12.10.2010
comment
Даже без логина DNN выдает куки. Вероятно (не обязательно) это необходимо. См. electrictoolbox.com/php-curl-cookies для получения дополнительной информации завиток. Когда взаимодействие с веб-сайтом усложняется, я предпочитаю автоматизировать браузер с помощью селена, а не писать сценарии с помощью curl/httpwebrequest и т. д. - person ScottS; 12.10.2010
comment
Хм, я не могу использовать селен, потому что этот скрипт должен работать в cron и работать с сотнями URL-адресов. Попытался обновить код, включив cookie: pastebin.com/P62rTFhg, но это тоже не работает... Один Дополнительный вопрос, как мне отладить его на части DNN, если я захочу? - person Shoaibi; 12.10.2010
comment
@Shoaibi, вы можете получить исходный код и символы DNN из codeplex, а затем подключить отладчик из Visual Studio. Это может быть сложно, особенно если вы не знаете, какой код вызывает проблему. Лучшим выбором может быть прокси (например, fiddler), который позволяет вам отслеживать все, что происходит между браузером и сервером, а затем использовать это в вашем скрипте. Вам нужно проверить операции получения и отправки, если скрипт получает и отправляет так же, как и браузер, все должно работать. - person ScottS; 13.10.2010