我有一个登录GarminConnect.com的代码,但是garmin选择改变他们的登录过程,所以我的代码不再工作了,我不知道如何让它再次工作。
我通常不是在开发web通信应用程序,所以对我来说,如何让它再次工作对我来说没有太大的意义。
这就是我现在所拥有的:
public class SessionService
{
    private const string SignInUrl = @"https://connect.garmin.com/en-US/signin";
    private const string DashboardUrl = @"http://connect.garmin.com/dashboard";
    public Session Session { get; private set; }
    public bool SignIn(string userName, string password)
    {
        try
        {
            Session = new Session();
            GetSignInPage(Session.Cookies);
            var signInResponse = PostSignInRequest(Session.Cookies, userName, password);
            if (IsDashboardUri(signInResponse.ResponseUri))
                return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Error signing in. {0}", ex.Message);
        }
        return false;
    }
    public void SignOut()
    {
        var request = HttpUtils.CreateRequest(BuildSignOutUrl(), Session.Cookies);
        request.GetResponse();
    }
    private static string BuildSignOutUrl()
    {
        var queryString = HttpUtils.CreateQueryString();
        queryString.Add("actionMethod", "page/home/dashboard.xhtml:identity.logout");
        queryString.Add("cid", "");
        return String.Format("{0}?{1}", DashboardUrl, queryString);
    }
    private static void GetSignInPage(CookieContainer cookies)
    {
        var request = HttpUtils.CreateRequest(DashboardUrl, cookies);
        request.GetResponse();
    }
    private static HttpWebResponse PostSignInRequest(CookieContainer cookies, string userName, string password)
    {
        var formBinaryData = BuildSignInFormData(userName, password);
        var request = HttpUtils.CreateRequest(SignInUrl, cookies);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.WriteBinary(formBinaryData);
        return (HttpWebResponse)request.GetResponse();
    }
    private static byte[] BuildSignInFormData(string userName, string password)
    {
        var formParams = HttpUtils.CreateQueryString();
        formParams.Add("login", "login");
        formParams.Add("login:loginUsernameField", userName);
        formParams.Add("login:password", password);
        formParams.Add("login:signInButton", "Sign In");
        formParams.Add("javax.faces.ViewState", "j_id1");
        return Encoding.UTF8.GetBytes(formParams.ToString());
    }
    private static bool IsDashboardUri(Uri uri)
    {
        return uri.ToString().StartsWith(DashboardUrl);
    }
}我希望有人能给我指出正确的方向,告诉我如何让它工作。
发布于 2014-03-15 08:10:04
Garmin似乎正在通过JS呈现iframe。我怀疑做一个基本的表单post将会处理这个问题,因为Javascript需要运行来构建DOM元素。您应该联系Garmin来使用他们的API。
https://stackoverflow.com/questions/22416325
复制相似问题