4

ここに投稿するのはこれが初めてです。この件に関するすべてのガイダンスに感謝します。

Webフォームに自動的に入力してデータを送信し、結果のページをプログラムに返して、ページを引き続き「閲覧」し、再帰的にさらに多くのデータを送信できるようにするプログラムを作成しようとしています。

私が抱えている主な問題は次のとおりです。

  • 「送信」ボタンは Javascript でコーディングされているため、ページ リクエストを行うときにフォーム データがどこに行くのかわかりません。
  • Excel テーブルのデータを使用してフォームに入力したいので、ページの外部からデータにアクセスできる必要があります。
  • さらに多くのデータを送信し続けるには、結果のページをナビゲートできる必要があります。

より具体的には、最初にPractice Mate Web サイトにログインし、 [患者の管理] に移動し、[患者の追加] をクリックして、適切なフォームに入力して送信しようとしています。何千行もある Excel テーブルからフォームに入力しています。
申し訳ありませんが、ユーザー名とパスワードを提供しないと、これについて明確にすることはできません。

私がやろうとしているのは、Javascript を使用して、PHP を使用して Excel ドキュメントから情報を取得するページからページ リクエストを作成することです。ただし、この方法ではまだ何も動作しないようです。

比較的初心者で申し訳ありません。前もって感謝します。

4

2 に答える 2

7

PHP cURLを使用して、フォームを参照して Web サイトに送信できますが、Web サイトのセットアップ方法によって異なります。ほとんどの場合、ボットを防止するためのセキュリティ チェックが実施されており、すべてを正しく機能させるのは難しい場合があります。

少し時間をかけて、このログイン スクリプトを思いつきました。有効なユーザー名とパスワードがないと、成功したことを確認できませんが、必要なことは実行する必要があります。この短い例では、最初にページを参照して 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);
    }

}
于 2013-01-07T10:29:47.913 に答える