Ответ 1
Служба входа в Google предназначена для конкретной службы, которую вы используете (документы Google против Google Analytics и Карты Google и т.д.). Указанная служба (lh2) относится к Google Picasa.
К сожалению, похоже, что для OpenId эквивалентный код (по крайней мере, не тот, который я мог найти!)
Страница, которую вы возвращаете из Google, должна содержать форму входа. Если вы посмотрите на это, можно будет создать вызов curl для входа в систему; который затем должен перенаправить вас обратно в SO (или любую страницу openID, к которой вы хотите войти) войти в систему.
Оказалось, что делать это немного сложно, потому что вам нужно разобрать некоторые поля формы, чтобы отправить их обратно в Google, а также потому, что Google не отправляет прямой HTTP-перенаправление, а HTML-документ с тегом <meta http-equiv="redirect" ...>
. И, конечно же, вы должны включить файлы cookie. Но все это возможно в script с использованием 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 - "[email protected]" <<EOF
@[email protected];
\$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 http://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
, я предполагаю, что моя версия будет работать для вас, но вам, возможно, потребуется ее настроить.)