在 bash 脚本中使用 cURL 进行 Javascript 登录
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10634330/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Javascript login using cURL in bash script
提问by sineil
I am trying to write a bash script in which I need to login to a website which uses javascript in its form. I have never used cURL so any help would be appreciated. I know I need to use cookies and I have the http headers, but I don't know what I need to do with these.
我正在尝试编写一个 bash 脚本,我需要在其中登录到一个使用 javascript 形式的网站。我从未使用过 cURL,因此将不胜感激。我知道我需要使用 cookie 并且我有 http 标头,但我不知道我需要用这些来做什么。
The headers are
标题是
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
Any help or pointing me in the right direction would be appreciated. Thanks
任何帮助或将我指向正确的方向将不胜感激。谢谢
回答by Shiplu Mokaddim
From the request header it can be easily seen that you are sending some post data. But you didn't provide it. I give you a simple example on how a http request can be converted to curl command.
从请求头可以很容易地看出您正在发送一些发布数据。但是你没有提供。我给你一个简单的例子,说明如何将 http 请求转换为 curl 命令。
Suppose you have this request where you are posting 2 form variables var1and var2get POSTed to http://www.example.com/form.url. The request would look like this,
假设您有此请求,您要在其中发布 2 个表单变量var1并var2发布到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
When its converted to curl its like,
当它转换成卷曲时,
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'
Note:
笔记:
This way you can add as much as header you want. But its better you add only the headers which is necessary. Because
curlwill pass most headers for you (e.g.Host,User-Agent,Content-Type,Acceptetc).If you want to manage cookie add a file
cookie.txtin the current directory and-b cookie.txt -c cookie.txtcommand switches to curl. Means,-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)-dswitch stands for the data string that will be passed in the request body.-d/--data <data> HTTP POST data (H)
通过这种方式,您可以添加任意数量的标题。但最好只添加必要的标题。由于
curl将通过最头为你(如Host,User-Agent,Content-Type,Accept等)。如果要管理 cookie
cookie.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)-dswitch 代表将在请求正文中传递的数据字符串。-d/--data <data> HTTP POST data (H)
Now I hope you can build your command.
现在我希望你能建立你的命令。
回答by David W.
In http, there are two ways of sending data to a URL:
在 http 中,有两种向 URL 发送数据的方式:
- POST
- GET
- 邮政
- 得到
In GET, the data is sent as part of the URL. You may see a URL that looks like this:
在GET 中,数据作为 URL 的一部分发送。您可能会看到如下所示的 URL:
http://foo.com/bar/barfoo/script.js?param1=this¶m2=that¶m3=the_other
This URL is sending data to a JavaScript at http://foo.com/bar/barfoo/script.js. It is sending to this script the following parameters:
此 URL 将数据发送到位于 的 JavaScript http://foo.com/bar/barfoo/script.js。它正在向该脚本发送以下参数:
param1=thisparam2=thatparam3=the_other
param1=thisparam2=thatparam3=the_other
In a POSToperation, the data is sent differently and is not encoded in the URL itself. THis happens a lot when using web forms (like what you are trying to do). You can use the --formparameter in curlto pass POST data much like you word in a HTTP form.
在POST操作中,数据的发送方式不同,并且不会在 URL 本身中进行编码。使用 Web 表单时经常会发生这种情况(就像您尝试执行的操作)。您可以使用--form参数 incurl来传递 POST 数据,就像您在 HTTP 表单中使用 word 一样。
From the CURL manage:
从 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 "[email protected];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
Hope this helps a bit.
希望这个对你有帮助。

