1

JsoupとHttpClientを使用して多数のHTMLフォームの投稿を自動化したい。これらのフォームのほとんどには、非表示のフィールド(セッションIDなど)があるか、デフォルト値がありますが、そのままにしておきます。

各フォーム送信を個別にコーディングする(ページから上記の非表示値またはデフォルト値をそれぞれ抽出する)のは非常に面倒なので、特定のフォームのHTTPパラメーターのリストを取得するための汎用メソッドを作成することを考えました。

ただし、入力タグとフィールドタイプはさまざまであり、それぞれに特定の処理(テキスト領域、チェックボックス、ラジオボタン、選択など)が必要な場合があるため、これは簡単なコードではありません。すでに存在する場合は、最初に検索/質問します。

注:JsoupとHttpClientは指定されています。それを変更することはできません。そのため、他の解決策を提案する回答を提供する必要はありません。JsoupDocumentオブジェクトがあり、HttpClientHttpRequestを作成する必要があります。

4

2 に答える 2

3

だから私はそれを書くことになった。私はまだフィールドテストされたもの(そしてうまくいけば他の場所で維持されているもの)と交換したいのですが、それが誰かがここに着陸するのを助ける場合に備えて...

徹底的にテストされておらず、multipar / form-dataのサポートがありませんが、私が試したいくつかの例で機能します。

  public void submit(String formSelector, List<String> params) {
    if (params.size() % 2 != 0) {
      throw new Exception("There must be an even number of params.");
    }

    Element form= $(formSelector).first();

    Set<String> newParams= Sets.newHashSet();
    for (int i=0; i < params.size(); i+= 2) {
      newParams.add(params.get(i));
    }

    List<String> allParams= Lists.newArrayList(params);
    for (Element field: form.select("input, select, textarea")) {
      String name= field.attr("name");
      if (name == null || newParams.contains(name)) continue;
      String type= field.attr("type").toLowerCase();
      if ("checkbox".equals(type) || "radio".equals(type)) {
        if (field.attr("checked") != null) {
          allParams.add(field.attr("name"));
          allParams.add(field.attr("value"));
        }
      }
      else if (! fieldTypesToIgnore.contains(type)) {
        allParams.add(field.attr("name"));
        allParams.add(field.val());
      }
    }

    String action= form.attr("abs:action");
    String method= form.attr("method").toLowerCase();
    // String encType= form.attr("enctype"); -- TODO

    if ("post".equals(method)) {
      post(action, allParams);
    }
    else {
      get(action, allParams);
    }
  }

($、get、postは、私がすでにうそをついているメソッドです...簡単に推測できます)。

于 2012-11-04T19:27:27.320 に答える
0

JsoupにはクラスにformDataメソッドがあります。FormElement単純なケースでは機能しますが、必ずしも必要なことを実行できるとは限らないため、カスタムコードも作成することになりました。

于 2014-06-08T10:48:21.440 に答える