自动填写Web表单并返回结果页面

时间:2013-01-07 10:21:10

标签: php javascript webforms automation

这是我第一次在这里发帖。我非常感谢关于这个主题的任何和所有指导。

我正在尝试创建一个自动填充Web表单并提交数据的程序,将生成的页面返回给程序,以便它可以继续“浏览”页面,允许它以递归方式提交更多数据。 / p>

我遇到的主要问题是:

  • “提交”按钮以Javascript编码,因此在发出页面请求时我不知道表单数据的位置。
  • 我想使用Excel表格中的数据填写表单,因此我需要能够从页面外部访问数据。
  • 我需要能够导航生成的页面以继续提交更多数据。

更具体地说,我正在尝试首先登录Practice Mate website,导航到“管理患者”,点击“添加患者”,然后填写正确的表格并提交。 我正在填写数千行长的Excel表格中的表格 对不起,如果不提供用户名和密码,我就不能更清楚了。

我一直在尝试使用Javascript从一个页面发出页面请求,该页面使用PHP从Excel文档中检索信息。我似乎仍然无法使用这种方法。

我为此担任相对新手而道歉。提前谢谢。

3 个答案:

答案 0 :(得分:6)

您可以使用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);
    }

}

答案 1 :(得分:1)

好吧,我认为cURL可以解决问题,{{1}}处理函数足够明确。仍然在文档阅读的开始,但是,预期会有好的结果。好吧,不太清楚结构的PHP灵活性,因为这对cURL意味着很多。希望能找到好运。

答案 2 :(得分:-1)

同时查看我问过的类似问题。这就是我在C#至少为我遇到的网站做的事情。

Submitting a web form using C#