自动填写网络表单并返回结果页面
这是我第一次在这里发帖.我非常感谢有关此主题的所有指导.
This is my first time posting here. I greatly appreciate any and all guidance on this subject.
我正在尝试制作一个自动填写网络表单并提交数据的程序,将生成的页面返回给程序,以便它可以继续浏览"页面,允许它递归地提交更多数据.
I'm trying to make a program that automatically fills in web forms and submits the data, returning the resulting page to the program so it can continue to 'browse' the page, allowing it to recursively submit even more data.
我遇到的主要问题是:
- 提交"按钮是用 Javascript 编码的,所以我不知道在发出页面请求时表单数据去了哪里.
- 我想使用 Excel 表格中的数据填写表单,因此我需要能够从页面外部访问数据.
- 我需要能够浏览结果页面才能继续提交更多数据.
更具体地说,我尝试先登录 Practice Mate 网站,导航到管理患者",点击添加患者",填写正确的表格并提交.我正在从一个长达数千行的 Excel 表格中填写表格.
抱歉,如果不提供用户名和密码,我就无法更清楚地说明这一点.
More specifically, I'm trying to first login to the Practice Mate website, navigate to 'Manage Patients', hit 'Add Patients', and fill in the proper forms and submit.
I'm filling in the forms from an Excel table thousands of rows long.
Sorry I can't be more clear on this without providing a username and password.
我一直在尝试使用 Javascript 从使用 PHP 从 Excel 文档中检索信息的页面发出页面请求.尽管如此,我似乎仍然无法使用这种方法.
What I've been trying to do is use Javascript to make page requests from a page that retrieves information from the Excel document using PHP. I still can't seem to get anything to work with this method though.
我很抱歉在这方面相对新手.提前致谢.
I apologize for being a relative novice at this. Thanks in advance.
推荐答案
您可以使用 PHPcURL 浏览 &向网站提交表单,但这取决于网站的设置方式.大多数都设置了安全检查来防止机器人,并且很难让一切正常工作.
You can use PHP cURL to browse & submit forms to websites, but it does depend on how the website is setup. Most have security checks in place to prevent bots and can be tricky to get everything to work right.
我花了一点时间,想出了这个登录脚本.没有有效的用户名和密码,我无法验证它是否成功,但应该做你需要的.这个简短的示例首先浏览页面以设置任何 cookie 并抓取提交表单所需的 __VIEWSTATE 值.然后使用您提供的用户名/密码提交表单.
I spent a little bit of time and came up with this login script. Without a valid username and password I can't verify that it is successful, but should do what you need. This short example first browses to the page to set any cookies and scrape a __VIEWSTATE value needed to submit the form. It then submits the form using the username/password you provide.
<?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);
}
}
相关文章