Board logo

标题: [网络连接] curl命令模拟论坛登录的语句如何写? [打印本页]

作者: namejm    时间: 2010-3-4 00:25     标题: curl命令模拟论坛登录的语句如何写?

  想用curl抓一些站点的数据,可惜这些站点不向游客开放,需要用到账户密码验证问答之类的东西,满世界搜索curl的教程,只找到了3个参数和账号密码有关的,分别是通过cookie文件、账号密码或提交表单的方式,介绍如下:

  1、通过cookie文件:
  -c/--cookie-jar <file name> 和 -b/--cookie <name=data>
  这是两个操作cookie的选项,很多服务器是需要cookie信息的。用前一个选项可以指定一个文件,将其他文件中的cookie或者从服务器得到的cookie写到文件中;后一个选项则用来向服务器发送cookie信息,可以用"name=data"的形式,也可以直接跟一个保存cookie的文件名。

  我用-c获取了cookie文件,然后用-b提交该cookie文件中的信息,结果,下载到的站点页面显示我还没有登录。此路不通。

  2、通过提交账号密码:
  -u/--user <user:password> 和 -U/--proxy-user <user:password>
  登录某些页面或ftp需要先进行认证,输入用户名和密码。curl的这个选项可以直接处理这类操作,用指定的账号和密码进行登录认证。
  后面的选项指定代理的用户名和密码,这样便可以直接用这个代理访问网页了,如  curl -U user:password -x 201.36.208.19:3128 http://curl.haxx.se/

  可以很明显地看出,-u参数只适用于只需要账号和密码登录的站点,对付还需要通过验证问答登录的论坛,照样没撤。

  3、通过提交表单:
  -d/--data <data>
  该选项用来以POST方式向http服务器发送特定数据,最常用的就是提交表单。如 curl -d "user=username&password=111" http://www.login.com,表示用账号username和密码111向站点发送登录申请。其中多个数据段可以用"&"进行连接一起发送;如果数据前面加上符号"@",则数据来源为后面指定的文件,如 curl -d [email=password=@D:\pw.txt]password=@D:\pw.txt[/email] http://www.login.com

  仔细查看了该参数的帮助信息,发现提交表单的方式是最适合论坛登录的情况,只可惜,教程中没有更详细的介绍,不知道当存在账号、密码、验证问答等必填字段的时候,该如何书写语句。

  以登录本论坛为例,账号:namejm,密码:123,安全提问:最后一个选项,答案:456,其余选项为默认设置,如何写出用这些信息登录本论坛的curl语句?暂时不考虑验证码的因素。
作者: Spring    时间: 2010-3-4 14:08

尝试登陆本论坛没有成功。
下面是我试验过的:

1.  建立一个静态 HTML 文件,仅包含一个提交表单,能成功登陆,内容如下:
  1. <form method="post" name="loging" action="http://www.bathome.net/logging.php?action=login&amp;">
  2. <input type="hidden" name="formhash" value="3951ecb8" />
  3. <input type="hidden" name="referer" value="index.php" />
  4. 用户名<input type="text" id="username" name="username"/>
  5. 密码<input type="password" id="password" name="password"/>
  6. 安全提问
  7. <select id="questionid" name="questionid">
  8. <option value="0">无安全提问</option>
  9. <option value="1">母亲的名字</option>
  10. <option value="2">爷爷的名字</option>
  11. <option value="3">父亲出生的城市</option>
  12. <option value="4">您其中一位老师的名字</option>
  13. <option value="5">您个人计算机的型号</option>
  14. <option value="6">您最喜欢的餐馆名称</option>
  15. <option value="7">驾驶执照的最后四位数字</option>
  16. </select>
  17. 回答<input type="text" id="answer" name="answer"/> 如果您设置了安全提问,请回答正确的答案
  18. 登录有效期
  19. <label><input type="radio" name="cookietime" value="315360000" checked="checked" /> 永久</label>
  20. <label><input class="radio" type="radio" name="cookietime" value="2592000" /> 一个月</label>
  21. <label><input class="radio" type="radio" name="cookietime" value="86400"/> 一天</label>
  22. <label><input class="radio" type="radio" name="cookietime" value="3600"/> 一小时</label>
  23. <label><input class="radio" type="radio" name="cookietime" value="0"/> 浏览器进程</label>
  24. <button class="submit" type="submit" name="loginsubmit" value="true" tabindex="100">提交</button></td>
  25. </form>
复制代码
说明有些字段不要也是可以登录的。

2. 自己做了个 jsp 页面,尝试用用CURL命令
  1. curl -d "formhash=3951ecb8&referer=index.php&loginfield=username&username=namejm&password=123&questionid=7&answer=456&cookietime=315360000&loginmode=&styleid=" "http://127.0.0.1:8090/test/posttest.jsp"
复制代码
返回结果显示服务器已经正确接收到所有提交信息,并且网址字符串中未包含发送的信息,说明的确是 post 发送的,由此可见 curl 的 -d 命令是有效的。

3. 尝试使用
  1. curl -F formhash=3951ecb8 -F referer=index.php -F loginfield=username -F username=namejm -F password=123 -F questionid=7 -F answer=456 -F cookietime=315360000 "http://www.bathome.net/logging.php?action=login&"
复制代码
或者
  1. curl -d "formhash=3951ecb8&referer=index.php&loginfield=username&username=namejm&password=123&questionid=7&answer=456&cookietime=315360000&loginmode=&styleid=" "http://www.bathome.net/logging.php?action=login&amp;"
复制代码
结果未知,因为curl返回的总是那个一摸一样登录页面的代码,甚至不会显示密码错误等信息;
但是可以确定的是,我传的是永久保持登录(cookietime=315360000),但我打开浏览器发现并未登录。
(实际试验的时候都是用的我自己的用户名密码,没有验证问题。)

4. 试了一下用 cookie ,但是不知道怎么用,反正这个
  1. curl -b "C:\Documents and Settings\issuser\Cookies\issuser@www.bathome[2].txt" "http://www.bathome.net/attachment.php?aid=2261"
复制代码
没成功。


综上可知,不知道问题出在哪里,我的命令没写对?
另外,我机器上有两个浏览器,如果IE保存了密码,IE能自动登录,但是另外那个也不是能登录的,可能curl也自己存放信息?


如果用脚本应该比较容易实现。
作者: inittab    时间: 2010-3-4 17:17

可以的。本站为例:
先取得含帐号的cookie :
  1. curl -c cookie.txt -d "username=inittab&password=******&loginsubmit=true" "http://www.bathome.net/logging.php?action=login"
复制代码
"username=inittab&password=******&loginsubmit=true" 此部分从登录页面源代码分析后取得,inittab是我的号,******是我的密码,换成你的。
然后使用获取的cookie 下载文件,保存为aa.rar
  1. curl -b cookie.txt -o aa.rar "http://www.bathome.net/attachment.php?aid=2261"
复制代码

[ 本帖最后由 inittab 于 2010-3-4 17:24 编辑 ]
作者: Spring    时间: 2010-3-4 17:46

楼上真实厉害啊!
居然连提交按钮都带值实在是怪异,害苦我了。。。

这个 cookie 跟浏览器生成的 cookie 互不兼容 ?
作者: inittab    时间: 2010-3-4 18:18

过奖了,我不是内部人士。
比较了一下这个cookie 跟ie生成的cookie 确实不一样。
作者: airwenlee    时间: 2011-12-2 15:41

用这个方法可以模拟登录,可是怎么模拟签到不可以呢?
作者: BAT1    时间: 2011-12-2 16:16

回复 6# airwenlee


    也许软件的作者是拿圆珠笔签到的,所以他没有开发签到的功能.
作者: powerbat    时间: 2011-12-2 22:23

咱们论坛不是那些变态论坛,没必要签到。你今年注册一个账号,就算一年不登录,明年照样能发帖。
作者: BAT1    时间: 2011-12-2 22:44

回复 8# powerbat


    那我现在注册个帐号留起来,等一百年后给我孙子用。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2