Loading

俄罗斯邮箱Mail.ru的登录及获取邮箱内容(c#实现)

登录网址: https://account.mail.ru/login

***********************注:本文仅作学习交流,如有侵权,请私信删除。

1. 访问登录页面: 获取cookie值 

    private bool GetIndex()
    {
            string url = "https://account.mail.ru/login";
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
            request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
            request.Headers.Add("accept-encoding", "gzip, deflate, br");
            request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
            request.Headers.Add("user-agent", UserAgent);
            HttpResponseMessage response = client.SendAsync(request).Result;

            if (!response.IsSuccessStatusCode)
            {
                Msg = "网络错误";
                return false;
            }
            List<string> setCookie = response.Headers.GetValues("set-cookie").ToList();
            cookies = ToolData.getCookies(setCookie);
            actToken = ToolData.getCookieValue(setCookie, "act");
            return true;
        }

2. 输入账号: 验证账号是否存在

        private bool InputAccount()
        {
            string url = "https://auth.mail.ru/api/v1/pushauth/info";
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Headers.Add("accept", "*/*");
            request.Headers.Add("accept-encoding", "gzip, deflate, br");
            request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
            request.Headers.Add("Host", "auth.mail.ru");
            request.Headers.Add("Origin", "https://account.mail.ru");
            request.Headers.Add("Referer", "https://account.mail.ru/login");
            request.Headers.Add("cookie", cookies);
            request.Headers.Add("user-agent", UserAgent);

            string data = $"email={HttpUtility.UrlEncode(email)}&utm=&htmlencode=false&login={HttpUtility.UrlEncode(email)}";
            request.Content = new StringContent(data);
            request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
            request.Content.Headers.ContentLength = data.Length;

            HttpResponseMessage response = client.SendAsync(request).Result;
            if (response.IsSuccessStatusCode)
            {
                string content = response.Content.ReadAsStringAsync().Result;
                JObject json = JObject.Parse(content);
                if (Convert.ToBoolean(json.SelectToken("body.exists")))
                {
                    return InputPwd();
                }
            }

            Msg = "该账号不存在";
            return false;
        }

3. 输入账号和密码: 确认账号和密码是否正确

        private bool InputPwd()
        {
            string url = "https://auth.mail.ru/cgi-bin/auth";
            HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false });
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
            request.Headers.Add("accept-encoding", "gzip, deflate, br");
            request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
            request.Headers.Add("Host", "auth.mail.ru");
            request.Headers.Add("Origin", "https://account.mail.ru");
            request.Headers.Add("Referer", "https://account.mail.ru/login");
            request.Headers.Add("cookie", cookies);
            request.Headers.Add("user-agent", UserAgent);
            string data = $"Login={HttpUtility.UrlEncode(email)}&Password={HttpUtility.UrlEncode(password)}&saveauth=1&new_auth_form=1&FromAccount=opener%3Daccount%26twoSteps%3D1&act_token={actToken}&page=https%3A%2F%2Fe.mail.ru%2Fmessages%2Finbox%3Fauthid%3Dk2aksknq.t1%26back%3D1%26dwhsplit%3Ds3319.n1s%26from%3Daccount&back=1&lang=ru_RU";
            request.Content = new StringContent(data);
            request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
            request.Content.Headers.ContentLength = data.Length;
            HttpResponseMessage response = client.SendAsync(request).Result;
            if (response.StatusCode == HttpStatusCode.Redirect)
            {
                if (response.Headers.TryGetValues("set-cookie", out var setCookies))
                {
                    cookies = ToolData.UpdateCookie(cookies, setCookies.ToList());
                    Uri location = response.Headers.Location;
                    return Redirect(location);
                }
            }
            Msg = "邮箱密码错误";
            return false;
        }

4. 第三步登录成功, 会进行重定向, 需要禁止重定向

        private bool Redirect(Uri location)
        {
            //Debug.WriteLine("Redirect start... ");
            using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false }))
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, location.AbsoluteUri);
                request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                request.Headers.Add("accept-encoding", "gzip, deflate, br");
                request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
                request.Headers.Add("Host", "e.mail.ru");
                request.Headers.Add("Referer", refere);
                request.Headers.Add("cookie", cookies);
                request.Headers.Add("user-agent", UserAgent);
                HttpResponseMessage response = client.SendAsync(request).Result;
                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    Uri locationUrl = response.Headers.Location;
                    return Redirect1(locationUrl);
                }

            }
            Msg = "登录跳转1失败";
            return false;
        }

        private bool Redirect1(Uri location)
        {
            using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false }))
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, location.AbsoluteUri);
                request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                request.Headers.Add("accept-encoding", "gzip, deflate, br");
                request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
                request.Headers.Add("Host", "auth.mail.ru");
                request.Headers.Add("Referer", refere);
                request.Headers.Add("cookie", cookies);
                request.Headers.Add("user-agent", UserAgent);
                HttpResponseMessage response = client.SendAsync(request).Result;
                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    if (response.Headers.TryGetValues("set-cookie", out var setCookies))
                    {
                        cookies = ToolData.UpdateCookie(cookies, setCookies.ToList());
                        Uri locationUrl = response.Headers.Location;
                        return Redirect2(locationUrl);
                    }
                }
            }
            Msg = "登录跳转2失败";
            return false;
        }

        private bool Redirect2(Uri location)
        {
            using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false }))
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, location.AbsoluteUri);
                request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                request.Headers.Add("accept-encoding", "gzip, deflate, br");
                request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
                request.Headers.Add("Host", "e.mail.ru");
                request.Headers.Add("Referer", refere);
                request.Headers.Add("cookie", cookies);
                request.Headers.Add("user-agent", UserAgent);
                HttpResponseMessage response = client.SendAsync(request).Result;
                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    if (response.Headers.TryGetValues("set-cookie", out var setCookies))
                    {
                        cookies = ToolData.UpdateCookie(cookies, setCookies.ToList());
                        Uri locationUrl = response.Headers.Location;
                        return Redirect3(locationUrl);
                    }
                }
            }
            Msg = "登录跳转3失败";
            return false;
        }

         private bool Redirect3(Uri location)
        {
            using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false }))
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, location.AbsoluteUri);
                request.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                request.Headers.Add("accept-encoding", "gzip, deflate, br");
                request.Headers.Add("accept-language", "zh-CN,zh;q=0.9");
                request.Headers.Add("Host", "e.mail.ru");
                request.Headers.Add("Referer", refere);
                request.Headers.Add("cookie", cookies);
                request.Headers.Add("user-agent", UserAgent);
                HttpResponseMessage response = client.SendAsync(request).Result;
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    if (response.Headers.TryGetValues("set-cookie", out var setCookies))
                    {
                        cookies = ToolData.UpdateCookie(cookies, setCookies.ToList());
                        return GetToken();
                    }
                }
            }
            Msg = "登录跳转4失败";
            return false;
        }

5. 访问邮箱列表需要登录 token ,这一步进行获取 token 值

        private bool GetToken()
        {
            HttpWebRequest request = WebRequest.CreateHttp("https://e.mail.ru/messages/inbox?authid=k2but1oq.4d&back=1&from=login&back=1") as HttpWebRequest;
            request.Method = "GET";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
            request.Host = "e.mail.ru";
            request.Referer = "https://account.mail.ru/login";
            request.Headers.Add("cookie", cookies);
            request.UserAgent = UserAgent;
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    string content = sr.ReadToEnd();
                    string patter = @"patron.updateToken\(""([\w\W]+)""\); ";
                    Regex re = new Regex(patter);
                    token = re.Match(content).Groups[1].Value.Substring(0, re.Match(content).Groups[1].Value.IndexOf('"'));
                    GetEmails();
                    return true;
                }
            }
            Msg = "登录获取token失败";
            return false;

        }

6. 终于到了获取邮箱列表的时候了.收集邮箱, (本文不做收集处理)

    private bool GetEmails()
        {
            Random random = new Random();
            var r = random.NextDouble() + "" + random.Next(0, 9);
            string url = $"https://e.mail.ru/api/v1/threads/status/smart?ajax_call=1&x-email={HttpUtility.UrlEncode(email)}&tarball=e.mail.ru-f-delta-fmail-4701-shkinev-1571995944.tgz&tab-time={ToolData.GetTempSpan()}&o_ss=AQ%3D%3D.s&o_v=107&email={HttpUtility.UrlEncode(email)}&sort=%7B%22type%22%3A%22date%22%2C%22order%22%3A%22desc%22%7D&offset=0&limit=26&folder=0&htmlencoded=false&last_modified=-1&filters=%7B%7D&nolog=0&sortby=D&rnd={r}&api=1&token=" + token;
            HttpWebRequest request = WebRequest.CreateHttp(url) as HttpWebRequest;
            request.Method = "GET";
            request.Accept = "text/plain, */*; q=0.01";
            request.Host = "e.mail.ru";
            request.Referer = "https://e.mail.ru/messages/inbox?authid=k2ci1wkw.cqs&back=1&from=login&back=1";
            request.Headers.Add("cookie", cookies);
            request.UserAgent = UserAgent;
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    string content = sr.ReadToEnd();
                    JObject jobject = JObject.Parse(content);
                    JArray jArray = jobject.SelectToken("body.threads") as JArray;
                    foreach (var item in jArray)
                    {
                        string subject = item.SelectToken("subject").ToString();
                        string emailid = item.SelectToken("id").ToString();
                    }
                }
            }
            Msg = "访问获取邮箱列表出错";
            return false;
        }

7. 最后一步. 拿着邮箱id访问邮箱内容

    private bool GetFileContent()
        {
            string url = $"https://e.mail.ru/api/v1/threads/thread?ajax_call=1&x-email={HttpUtility.UrlEncode(email)}&tarball=e.mail.ru-f-delta-fmail-4701-shkinev-1571995944.tgz&tab-time={ToolData.GetTempSpan()}o_ss=AQ%3D%3D.s&o_v=107&email={HttpUtility.UrlEncode(email)}&offset=0&limit=50&htmlencoded=false&id={HttpUtility.UrlEncode(emailid)}&cache=false&api=1&token=" + token;
            HttpWebRequest request = WebRequest.CreateHttp(url) as HttpWebRequest;
            request.Method = "GET";
            request.Accept = "text/plain, */*; q=0.01";
            request.Host = "e.mail.ru";
            request.Referer = $"https://e.mail.ru/thread/{emailid}/";
            request.Headers.Add("cookie", cookies);
            request.UserAgent = UserAgent;
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    string content = sr.ReadToEnd();
                    return true;
                }
            }
            Msg = "访问邮箱内容出错";
            return false;
        }

写在最后: 1. 本文不做中间网络数据的分析. 需要源代码的可以私聊我.

                 2. 博主欢迎大家转载本文, 但需要声明出处.

                 3. 访问国外网站需要***(你懂的).

posted @ 2019-11-03 21:42  sealoyal  阅读(5882)  评论(0)    收藏  举报