1

WWW::Scripter モジュールを使用して Java Web サイトにログインしようとしています。WWW::Mechanize モジュールを使用すると問題なく動作しますが、認証されると、サイトには呼び出す必要のある JavaScript 関数が含まれているため、Scripter が必要になります。

大量のトラブルシューティングを行った後、click() イベントから送信されたパケットの違いは Content-Type 変数であることがわかりました。
Mechanize には Content-Type: application/x-www-form-urlencoded\r\n がありますが、Scripter には Content-Type: application/x-www-form-urlencoded; があります。charset="ISO-8859-1"\r\n (これは WireShark を使用して表示されます)

これは、私がウェブサイトから受け取っているエラーを説明しています:

エラー メッセージ: "ISO-8859-1" エラー スタック トレース: java.nio.charset.IllegalCharsetNameException: "ISO-8859-1" at java.nio.charset.Charset.checkName(Charset.java:305) at java.nio .charset.Charset.lookup(Charset.java:439) at java.nio.charset.Charset.forName(Charset.java(Inlined Compiled Code))

    at java.lang.StringCoding$DecoderCache.makeDecoder(StringCoding.java(Com

java.security.AccessController.doPrivileged1(Native Method) で java.security.AccessController.doPrivileged(AccessController.java(コンパイルされたコード) で java.lang.StringCoding$1.run(StringCoding.java(Compiled Code)) で)) java.lang.StringCoding$DecoderCache.getDecoder(StringCoding.java(Compiled Code)) で java.lang.StringCoding.getDecoder(StringCoding.java(Inlined Compiled Code)) で java.lang.StringCoding.decode(StringCoding) .java(Compiled Code)) at java.lang.String.(String.java(Compiled Code)) at java.lang.String.(String.java(Inlined Compiled Code)) at com.ibm.ws.webcontainer.servlet com.ibm.ws.webcontainer.srt.SRTServletRequest.parseParameters(SRTServ letRequest.java(コンパイル済みコード)) com.ibm.ws.webcontainer.srt.SRTServletRequest.getParameterNames(SRTSe rvletRequest.java(コンパイル済みコード)) javax.servlet.ServletRequestWrapper.getParameterNames(ServletRequestW rapper.java(コンパイル済みコード)) org .apache.struts.util.RequestUtils.populate(RequestUtils.java(コンパイル済みコード)) at org.apache.struts.action.RequestProcessor.processPopulate(RequestProc essor.java(コンパイル済みコード)) at org.apache.struts.action .RequestProcessor.process(RequestProcessor.java(コンパイル済みコード)) at org.apache.struts.action.ActionServlet.process(ActionServlet.java(組み込みコンパイル済みコード)) at org.apache.struts.action.ActionServlet.doPost( ActionServlet.java(コンパイル済みコード)) を javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code )) at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code )) at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java(コンパイル済みコード)) at com. ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(Strict LifecycleServlet.java(インラインコンパイルコード)) at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code)) at com.ibm .ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(コンパイル済みコード)) com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(インライン コンパイル済みコード)) com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java) (コンパイル済みコード)) com.infostream.web.filters.HibernateSessionFilter.doFilter(HibernateSessionFilter.java(コンパイル済みコード)) com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterI nstanceWrapper.java(コンパイル済みコード)) ) com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(コンパイル済みコード)) com.infostream.web.filters.IdentificationFilter.doFilter(Identificati onFilter.java(コンパイル済みコード)) com. ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java(コンパイル済みコード)) com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(コンパイル済みコード)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDi spatch(WebAppRequestDispatcher.java(コンパイル済みコード)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(コンパイル済みコード)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebApp RequestDispatcher.java(コンパイル済みコード) )) com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.jav a(コンパイル済みコード)) com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebApp Invoker.java(コンパイル済みコード)) com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(コンパイル済みコード)) com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java(コンパイル済みコード)) com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor. java(コンパイル済みコード)) com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSE Listener.java(コンパイル済みコード)) com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.ja va(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード)) com. ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(コンパイル済みコード))CacheableInvocationContext.invoke(CacheableInvocationContext.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher. service(OSE Listener.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(コンパイル済みコード)) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection. ja va(コンパイル済みコード)) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード)) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(コンパイル済みコード) )CacheableInvocationContext.invoke(CacheableInvocationContext.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher. service(OSE Listener.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(コンパイル済みコード)) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection. ja va(コンパイル済みコード)) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード)) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(コンパイル済みコード) )dispatchByURI(ServletRequestProcessor.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSE Listener.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest( HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード) ) ) com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(コンパイル済みコード))dispatchByURI(ServletRequestProcessor.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSE Listener.java(コンパイル済みコード)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest( HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード) ) ) com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(コンパイル済みコード))http.HttpConnection.readAndHandleRequest(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.util.ThreadPool$Worker.run (ThreadPool.java(コンパイル済みコード))http.HttpConnection.readAndHandleRequest(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(コンパイル済みコード)) com.ibm.ws.util.ThreadPool$Worker.run (ThreadPool.java(コンパイル済みコード))

ログインをテストするために使用しているコードは次のとおりです。

#!/usr/bin/perl -w

use WWW::Scripter;

my $urlLogin = "XXX";

my $viper = WWW::Scripter->new();

$viper->use_plugin('JavaScript');

$viper->get($urlLogin);

$viper->form_name('loginForm');

$viper->field(username => "xxx");
$viper->field(password => "xxx");

$viper->click();

前に述べたように、WWW::Scripter の代わりに WWW::Mechanize を使用すると、これは問題なく動作します。

POSTされているパケットのContent-Typeのcharsetフィールドを削除するために私ができることを誰でも提案できますか?

4

1 に答える 1

0

この質問を PerlMonks に相互投稿したところ、彼らがあなたの質問に回答したようです。

CPAN のモジュール コメントに次のように表示されています。

最高の JavaScript 対応 Web 自動化は WWW::Mechanize::Firefox だと思います。これを使用するには、マシンに Firefox をインストールし、アドオンを追加する必要があります。Perl スクリプトは、Firefox を使用して、このアドオンを介して JavaScript でページをレンダリングします。ページが Firefox で動作する場合、それを台無しにする可能性があります。

よろしく、

于 2012-10-03T07:08:27.243 に答える