在 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 02:17:51  来源:igfitidea点击:

Javascript login using cURL in bash script

javascriptbashhttpcurllibcurl

提问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 个表单变量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

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:

笔记:

  1. 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).

  2. 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) 
    
  3. -dswitch stands for the data string that will be passed in the request body.

    -d/--data <data>   HTTP POST data (H)
    
  1. 通过这种方式,您可以添加任意数量的标题。但最好只添加必要的标题。由于curl将通过最头为你(如HostUser-AgentContent-TypeAccept等)。

  2. 如果要管理 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) 
    
  3. -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&param2=that&param3=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= this
  • param2= that
  • param3= the_other
  • param1= this
  • param2= that
  • param3= 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.

希望这个对你有帮助。

回答by Michael Slade

Sorry but curl doesn't do javascript.

抱歉,curl 不会执行 javascript。

consider

考虑

  • manually deciphering the javascript and replicating the behavior in a perl/ruby/python script
  • employing selenium
  • 手动破译 javascript 并在 perl/ruby/python 脚本中复制行为
  • 使用