0

一种“新手问题”,部分确认/纠正我的理解:我想实现一些自动化的网站探测,包括。登录时,我不想实际提取任何数据。从早期的工作中,我记得 curl 并且仅用于检查 URL 可用性(评估 HTTP 响应代码,例如 200 与否),这很好用。现在该任务也正在登录 - 但我无法让它工作,并且怀疑这是否能按预期工作。在尝试了一段时间并通过 WWW 搜索后,我找不到明确的答案 - 所以我的希望就在这里 :-)

最初我的想法是使用脚本并将 curl POST 命令放入其中,以防万一cookies选项,例如:

$ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies -F "username=bla&passwd=blub&Submit=Login" http://some.url

(我使用 HTTPfox 来确定 POST 参数,并且我确信它们是正确的)

然后我通过文件 /tmp/tge-HTML.out 搜索它是否包含“注销”作为我已登录的证明(即使没有登录,我在所有测试中总是得到 HTTP 200 与我尝试的各种 URL )。

在其中一种情况下(后面有 Tomcat)我看到,在 Firefox 中登录后,后续 URL 包含 ...&jsessionid=... 当然,我最初不知道 - 所以我尝试了几个例如,在 shell 脚本中调用 curl(命令!)两次,从第一个获取 sessionID 并将其附加到第二个 URL,例如:

 $ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies -F "username=bla&passwd=blub&Submit=Login" http://some.url
 ... extract jsessionid from /tmp/tge-HTML.out ...
 $ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies 
    http://some.url/...?jsessionid=...

但是无论我尝试了什么,我都没有得到任何地方:-| 现在的问题:

  1. 如果我按照上面的示例执行基于 curl 的 POST,我是否(通常?)获得完整的 HTML 页面作为响应,就像我在登录后在常规 Web 浏览器中看到的一样?

    • 在我看来好像是真的,但是应该做一个简单的 POST 并且它应该包含“注销”...
    • 但是,由于我从来没有让这个工作,可能有什么问题?
  2. 如果我必须执行多个 HTTP 请求,那么使用 curl 命令这样的概念是否有效?curl退出时会发生什么?套接字关闭并且 Web 服务器可能关闭会话(并且我的 jsessionid 无效)?

    • 如果这种方法不起作用,基于 libcurl 的概念可能会更好吗?例如 phpcurl(刚刚阅读过但从未尝试过),我将会话保存在我的 php 脚本中,因此连接/会话保持打开等...
    • 可能取决于网站是否使用 cookie?
  3. 有没有更好的想法如何完成最初的想法?理想情况下,它应该很简单,有一些脚本,但没有庞大的监控套件

很可能有很多“取决于...” :-| 此外,可能问题不是 100% 准确,但任何提示都表示赞赏!:-)

Rgds, tge

4

1 回答 1

0

好的,最后我取得了一些进展 - 也许它可以帮助其他人......首先,基于脚本的方法确实有效,至少在服务器端使用 Joomla 的一个测试用例中(我稍后会尝试其他的) )。解决方案的关键是: CURL login by script to a Joomla website

与所描述的方式类似,我从第一个 GET 的响应中提取令牌并将其放入第二个的表单参数中:

rm -f /tmp/tge-cookies
HTTP_CODE=$(./curl -s -w "%{http_code}\\n" -o /tmp/tge-HTML-out.1 -b /tmp/tge-cookies -c /tmp/tge-cookies -L ${URL})
# Eval HTTP_CODE ...
Token=`awk '{ if(match($1, "<input") && match($3, "name=\"[a-z0-9]+\""))
  {
    gsub("name=\"", "", $3);
    gsub("\"", "", $3);
    if(length($3) == 33)
    {
      print $3;
      exit 0;
    }
  } }' /tmp/tge-HTML-out.1`
HTTP_CODE=$(./curl -L -s -w "%{http_code}\\n" -o /tmp/tge-HTML-out.2 -b /tmp/tge-cookies -c /tmp/tge-cookies -d "username=${User}&passwd=${Pass}&option=login&task=login&${Token}=1&remember=yes&Submit=Login" ${URL})
# Eval HTTP_CODE ...
# Eval /tmp/tge-HTML-out.2 whether containing "Logout" ...

第二个区别是使用“-F”不起作用,但“-d”起作用。相当有趣的是 POST 参数与我在 HTTPfox 中看到的不同。

问候 tge

于 2012-04-09T20:21:34.810 回答