我正在开发一个项目,我想通过cURL登录到Stack Overflow.
我使用Google作为我的openID提供程序,这意味着我需要先通过其API登录Google.
以下是我到目前为止的代码:
#!/bin/sh . ./params.sh #the script with $username and $password curl --silent https://www.google.com/accounts/ClientLogin \ -d Email=$username -d Passwd=$password \ -d accountType=GOOGLE \ -d source=localhost-test-1 \ -d service=lso \ -o tokens . ./tokens echo $Auth; #$Auth is correct here - I did not get a BadAuth error. endpoint="https://www.google.com/accounts/o8/id"; curl https://stackoverflow.com/users/authenticate \ -d "openid_identifier=$endpoint" \ -w %{redirect_url}> ./google_url google_url=$(cat ./google_url); echo $google_url; echo; echo; echo; curl -L --silent --header "Authorization: GoogleLogin auth=$Auth" $google_url;
在这一点上,我收到一个来自Google的页面,告诉我Stack Overflow需要信息,我必须登录.根据this page,-header … $Auth部分应该作为登录名,并将其重定向到Stack Overflow.
这是我运行这个脚本时得到的形式:
<form id="gaia_universallogin" action="https://www.google.com/accounts/ServiceLoginAuth?service=lso" method="post"> <input type="hidden" name="continue" id="continue" value="https://www.google.com/accounts/o8/ud?st=SOME_KEY" /> <input type="hidden" name="service" id="service" value="lso" /> <input type="hidden" name="dsh" id="dsh" value="SOME_NEG_NUMBER" /> </form>
当我尝试下面的答案我得到以下错误:
Can't call method "attr" on an undefined value at - line 8. curl: (3) <url> malformed --></style>
这是google2.html的输出
<form id="gaia_loginform" action="https://www.google.com/accounts/ServiceLoginAuth?service=lso" method="post" > <input type="hidden" name="continue" id="continue" value="https://www.google.com/accounts/o8/ud?st=RNADOM" /> <input type="hidden" name="service" id="service" value="lso" /> <input type="hidden" name="dsh" id="dsh" value="NEG_NUMEBER" /> <input type="hidden" name="galX" value="ABCD" /> <input type="text" name="Email" id="Email" /> <input type="password" name="Passwd" id="Passwd" > <input type="checkBox" name="PersistentCookie" id="PersistentCookie" value="yes" <input type="hidden" name='rmShown' value="1" /> <input type="submit" class="gaia le button" name="signIn" id="signIn" /> <input type="hidden" name="asts" > </form>
Google登录服务是针对您使用的特定服务(Google文档与Google Analytics(分析)和Google地图等)).您指定的服务(lh2)特定于Google Picasa.
不幸的是,似乎没有OpenID的等效代码(至少不是我可以找到!)
从Google回来的页面应该包含一个登录表单.如果你看这个,应该可以构建卷曲调用来登录;那么应该将您重定向到SO(或您要登录的任何OpenID页面)登录.
事实证明,这样做有点棘手,因为您必须解析出一些表单域才能将其提交回Google,因为Google不会发回直接的HTTP重定向,而是发送带有< ; Meta http-equiv =“redirect”...>标签.当然,您必须启用Cookie.但是这在使用curl的脚本中是可能的 – 以下内容适用于我:
#!/bin/bash # Utility function for parsing values out of an HTML form get_value() { local tagtype="$1" attrname="$2" attrvalue="$3" getattr="$4" perl -MHTML::TreeBuilder - "$@" <<EOF @args=@ARGV; \$h=HTML::TreeBuilder->new; \$h->parse_file("$htmlfile"); while (\$#args > 0) { \$h=\$h->look_down(_tag => shift @args,shift @args => shift @args); } print \$h->attr(shift @args); EOF } # Empty the cookie jar cj="cookiejar" rm -f "$cj" # Attempt to log in to SO. This will redirect to a google URL. endpoint="https://www.google.com/accounts/o8/id" google_url=`curl -L -s -S https://stackoverflow.com/users/authenticate \ -d "openid_identifier=$endpoint" \ -o /dev/null -b "$cj" -c "$cj" \ -w %{url_effective}` echo $google_url echo echo # Retrieve the form from Google htmlfile=googleform.html curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" "$google_url" # Parse out the form fields form_url=`get_value form id gaia_loginform action` fdsh=`get_value form id gaia_loginform input name dsh value` fcontinue=`get_value form id gaia_loginform input name continue value` fservice=`get_value form id gaia_loginform input name service value` fgalX=`get_value form id gaia_loginform input name galX value` frmShown=`get_value form id gaia_loginform input name rmShown value` fsignIn=`get_value form id gaia_loginform input name signIn value` fEmail='INSERT LOGIN EMAIL HERE' fPasswd='INSERT PASSWORD HERE' # Submit the login form htmlfile=google2.html curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" --data-urlencode dsh="$fdsh" \ --data-urlencode continue="$fcontinue" \ --data-urlencode service="$fservice" \ --data-urlencode galX="$fgalX" \ --data-urlencode Email="$fEmail" \ --data-urlencode Passwd="$fPasswd" \ --data-urlencode rmShown="$frmShown" \ --data-urlencode signIn="$fsignIn" \ "$form_url" # Interpret the redirect redirect=`get_value Meta http-equiv refresh content | sed "s/^.*'\(.*\)'.*$/\1/"` # Follow it htmlfile=google3.html curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" "$redirect"
(请注意,我似乎有一个略微不同的卷曲版本,所以我不得不稍微改变-w选项;我猜我的版本会适合你,但你可能需要调整它.)
原文地址:https://www.jb51.cc/bash/386441.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。