Curl web会话的扩展
这是一个“新手问题”,部分确认/纠正我的理解: 我想实现一些自动网站探测,包括登录,我不想实际提取任何数据。在之前的一份工作中,我记得curl和检查URL可用性(evalttpresponsecode,例如200或不200)的功能很好。 现在任务也在登录中,但我无法让它工作,并且怀疑它是否能按预期工作。经过一段时间的实验和在WWW上的搜索,我找不到一个明确的答案——所以我的希望就在这里:-) 最初,我的想法是使用脚本并将curl POST命令放入其中,以防cookies选项,例如:Curl web会话的扩展,curl,Curl,这是一个“新手问题”,部分确认/纠正我的理解: 我想实现一些自动网站探测,包括登录,我不想实际提取任何数据。在之前的一份工作中,我记得curl和检查URL可用性(evalttpresponsecode,例如200或不200)的功能很好。 现在任务也在登录中,但我无法让它工作,并且怀疑它是否能按预期工作。经过一段时间的实验和在WWW上的搜索,我找不到一个明确的答案——所以我的希望就在这里:-) 最初,我的想法是使用脚本并将curl POST命令放入其中,以防cookies选项,例如: $ curl
$ 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是否包含“Logout”作为我已登录的证明(即使没有登录,我在所有测试中都会使用我尝试过的各种URL获得HTTP 200)
在其中一个例子中(后面有一个Tomcat),我看到在登录Firefox之后,后续的URL包含…&jsessionid=。。。当然,我一开始不知道,所以我尝试了几件事,例如在shell脚本中调用curl(命令!)两次,从第一个URL获取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=...
但无论我怎么努力,我都没有成功:-|
现在问题是:
- 在我看来似乎是真的,但一个简单的帖子应该可以,它应该包含“注销”
- 但是,既然我从来没有让它工作过,那会有什么问题呢
- 如果这种方法不起作用,那么基于libcurl的概念可能会更好?例如,phpcurl(刚刚读过,但从未尝试过),我将会话保存在我的php脚本中,因此连接/会话保持打开状态等
- 可能取决于网站是否使用cookie
tge好的,最后我取得了一些进步——也许这有助于其他人。。。 首先,基于脚本的方法确实有效,至少在服务器端带有Joomla的一个测试用例中有效(稍后我将尝试其他测试用例)。解决方案的关键在于: 与所描述的方法类似,我从第一个GET的响应中提取令牌,并将其放入第二个GET的form参数中:
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" ...
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})
#评估HTTP_代码。。。
令牌=`awk'{if(匹配($1,)