3

我正在尝试编写一个 bash 脚本,我需要在其中登录到一个使用 javascript 形式的网站。我从未使用过 cURL,因此将不胜感激。我知道我需要使用 cookie 并且我有 http 标头,但我不知道我需要用这些做什么。

标题是

Response Headers

Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length  0
Content-Type    text/html;charset=UTF-8
Date    Thu, 17 May 2012 11:25:15 GMT
Expires Tue, 01 Jan 1980 00:00:00 GMT
Last-Modified   Thu, 17 May 2012 11:25:16 GMT
Pragma  no-cache
Server  Apache-Coyote/1.1
X-Powered-By    Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA  date=200807181417)/JBossWeb-2.0

Request Headers    
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie  SMLOGOUT=true; JSESSIONID=8D5757001A594D5CBB07C9250D1CB2B7; JSESSIONIDSSO=A0569CD1D6C981989F0FE691E9AFC314
Host    https:/example.com
Referer https://example.com
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
X-WCF-Fragment  true

任何帮助或指出我正确的方向将不胜感激。谢谢

4

3 回答 3

3

从请求标头可以很容易地看出您正在发送一些发布数据。但是你没有提供。我给你一个简单的例子,说明如何将 http 请求转换为 curl 命令。

假设您有这个请求,您在其中发布 2 个表单变量var1var2发布到http://www.example.com/form.url. 请求看起来像这样,

POST /form.url HTTP/1.1
Host: www.example.com
Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

var1=val1&var2=val2

当它转换成卷曲的样子时,

curl -d 'var1=val1&var2=val2' \
--header 'Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
--header 'Accept-Encoding gzip, deflate' \
--header 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
'http://www.example.com/form.url'

笔记:

  1. 这样,您可以添加尽可能多的标题。但最好只添加必要的标题。因为curl将为您传递大多数标题(例如Host,,,User-AgentContent-TypeAccept

  2. 如果你想管理 cookiecookie.txt在当前目录中添加一个文件, -b cookie.txt -c cookie.txt命令切换到 curl。方法,

    -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)
    -c/--cookie-jar <file> Write cookies to this file after operation (H) 
    
  3. -dswitch 代表将在请求正文中传递的数据字符串。

    -d/--data <data>   HTTP POST data (H)
    

现在我希望你能建立你的命令。

于 2012-05-17T15:04:25.317 回答
2

在 http 中,有两种方式向 URL 发送数据:

  • 邮政
  • 得到

GET中,数据作为 URL 的一部分发送。您可能会看到如下所示的 URL:

http://foo.com/bar/barfoo/script.js?param1=this&param2=that&param3=the_other

此 URL 正在向位于 的 JavaScript 发送数据http://foo.com/bar/barfoo/script.js。它向该脚本发送以下参数:

  • param1=this
  • param2=that
  • param3=the_other

POST操作中,数据以不同方式发送,并且未在 URL 本身中编码。这种情况在使用网络表单时经常发生(比如你正在尝试做的事情)。您可以使用--form参数 incurl来传递 POST 数据,就像您在 HTTP 表单中使用的词一样。

从 CURL 管理:

-F/--form <name=content>
    (HTTP) This lets curl emulate a filled-in form in which a user has
    pressed the submit  button.  This  causes  curl  to  POST  data using
    the Content-Type multipart/form-data according to RFC 2388. This
    enables uploading of binary files etc. To force the 'content' part to
    be  a  file, prefix the file name with an @ sign. To just get the
    content part from a file, prefix the file name with the symbol <. The
    difference between @ and <  is  then  that  @  makes  a  file  get
    attached  in  the  post as a file upload, while the < makes a text
    field and just get the contents for that text field from a file.


Example, to send your password file to the server, where 'password' is the
name of  the  form- field to which /etc/passwd will be the input:

    curl -F password=@/etc/passwd www.mypasswords.com

To  read content from stdin instead of a file, use - as the filename. This
goes for both @ and < constructs.

You can also tell curl what Content-Type to use by using 'type=', in a
manner similar to:

    curl -F "web=@index.html;type=text/html" url.com

  or

    curl -F "name=daniel;type=text/foo" url.com

You can also explicitly change the name field of a file upload part by
setting filename=, like this:

    curl -F "file=@localfile;filename=nameinpost" url.com

希望这个对你有帮助。

于 2012-05-17T15:29:35.950 回答
1

抱歉,curl 不支持 javascript。

考虑

  • 手动破译 javascript 并在 perl/ruby/python 脚本中复制行为
  • 使用
于 2012-05-17T11:04:05.967 回答