Автоматическое заполнение веб-форм и возврат полученной страницы


Это моя первая публикация здесь. Я очень признателен за любые рекомендации по этому вопросу.

Я пытаюсь создать программу, которая автоматически заполняет веб-формы и отправляет данные, возвращая полученную страницу программе, чтобы она могла продолжать "просматривать" страницу, позволяя ей рекурсивно отправлять еще больше данных.

Основные проблемы, с которыми я сталкиваюсь:

  • Кнопка "отправить" закодирована на Javascript, поэтому я не знаю, куда отправляются данные формы, когда выполнение запроса страницы.
  • Я хочу заполнить формы, используя данные из таблицы Excel, поэтому мне нужно иметь доступ к данным извне страницы.
  • Мне нужно иметь возможность перемещаться по результирующей странице, чтобы продолжать предоставлять больше данных.

Более конкретно, я пытаюсь сначала войти на веб-сайт Practice Mate, перейти к разделу "Управление пациентами", нажать "Добавить пациентов", заполнить соответствующие формы и отправить. Я заполняю формы из таблицы Excel тысяч длинных рядов.
Извините, я не могу быть более ясным в этом вопросе, не указав имя пользователя и пароль.

Что я пытался сделать, так это использовать Javascript для выполнения запросов страниц со страницы, которая извлекает информацию из документа Excel с помощью PHP. Однако я все еще не могу заставить что-либо работать с этим методом.

Я прошу прощения за то, что был относительным новичком в этом. Заранее спасибо.

Author: Baozi, 2013-01-07

2 answers

Вы можете использовать PHP cURL для просмотра и отправки форм на веб-сайты, но это зависит от того, как настроен веб-сайт. В большинстве из них установлены проверки безопасности для предотвращения ботов, и может быть сложно заставить все работать правильно.

Я потратил немного времени и придумал этот сценарий входа в систему. Без действительного имени пользователя и пароля я не могу проверить, что это успешно, но должен делать то, что вам нужно. Этот краткий пример сначала переходит на страницу, чтобы установить любые файлы cookie и очистить __VIEWSTATE значение, необходимое для отправки формы. Затем он отправляет форму, используя имя пользователя/пароль, которые вы указали.

<?php

// Login information
$username = 'test';
$password = 'mypass';
$utcoffset = '-6';
$cookiefile = '/writable/directory/for/cookies.txt';

$client = new Client($cookiefile);

// Retrieve page first to store cookies 
$page = $client -> get("https://pm.officeally.com/pm/login.aspx");
// scrape __VIEWSTATE value
$start = strpos($page, '__VIEWSTATE" value="') + 20;
$end = strpos($page, '"', $start);
$viewstate = substr($page, $start, $end - $start);

// Do our actual login
$form_data = array(
    '__LASTFOCUS' => '', 
    '__EVENTTARGET' => '',
    '__EVENTARGUMENT' => '',
    '__VIEWSTATE' => $viewstate,
    'hdnUtcOffset' => $utcoffset,
    'Login1$UserName' => $username,
    'Login1$Password' => $password,
    'Login1$LoginButton' => 'Log In'
);
$page = $client -> get("https://pm.officeally.com/pm/login.aspx", $form_data);

// cURL wrapper class    
class Login {
    private $_cookiefile;

    public function __construct($cookiefile) {
        if (!is_writable($cookiefile)) {
            throw new Exception('Cannot write cookiefile: ' . $cookiefile);
        }
        $this -> _cookiefile = $cookiefile;
    }

    public function get($url, $referer = 'http://www.google.com', $data = false) {
        // Setup cURL
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_REFERER, $referer);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $this -> _cookiefile);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $this -> _cookiefile);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 10);

        // Is there data to post
        if (!empty($data)) {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        }

        return curl_exec($ch);
    }

}
 6
Author: Pastor Bones, 2013-01-08 06:48:31

Также проверьте вопрос, который я задал, который похож. Вот как это сделать на C#, по крайней мере, для веб-сайта, с которым я столкнулся.

Отправка веб-формы с использованием C#

 -1
Author: newrev426, 2017-05-23 10:29:21