title author date CreateTime categories
win10 uwp httpClient 登陆CSDN
lindexi
2018-08-10 19:16:53 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站。

HttpClient 使用 Cookie

我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登陆,不然登陆成功下次访问网页还是没登陆。

  1. CookieContainer cookies = new CookieContainer();
  2.  
  3. HttpClientHandler handler = new HttpClientHandler();
  4. handler.CookieContainer = cookies;
  5. HttpClient http = new HttpClient(handler);

虽然已经有Cookie,但是还缺少一些请求需要带的头,因为浏览器是会告诉网站,需要的Accept,为了假装这是一个浏览器,所以就需要添加AcceptAccept-Encoding Accept-Language User-Agent

添加 Accept

下面的代码可以添加Accept,这里后面的字符串可以自己使用浏览器查看,复制。

  1. http.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");

添加 Accept-Encoding

  1. http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br");

如果有 gzip 就需要解压,这个现在不太好弄,建议不要加。

添加 Accept-Language

  1. http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "zh-CN,zh;q=0.8");

添加 User-Agent

  1. http.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");

更多User-Agent请看win10 uwp 如何让WebView标识win10手机

ContentType

如果设置 ContentType 需要在发送的内容进行添加

  1. content = new StringContent("{\"loginName\":\"lindexi\",\"password\":\"csdn\",\"autoLogin\":false}")
  2. {
  3. Headers = { ContentType = new MediaTypeHeaderValue("application/json") }
  4. };

发送数据

如果需要使用 Post 或 get 发送数据,那么可以使用HttpContent做出数据,提供的类型有StringContentFormUrlEncodedContent等。

其中StringContent最简单,而FormUrlEncodedContent可以自动转换。

  1. str = $"username={account.UserName}&password={account.Key}&lt={lt}&execution={execution}&_eventId=submit";
  2. str = str.Replace("@", "%40");
  3.  
  4. HttpContent content = new StringContent(str, Encoding.UTF8);

上面代码就是使用 StringContent 可以看到需要自己转换特殊字符,当然一个好的方法是使用 urlencoding 转换。

如果使用FormUrlEncodedContent就不需要做转换

  1. content=new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
  2. {
  3. new KeyValuePair<string, string>("username",account.UserName),
  4. new KeyValuePair<string, string>("password",account.Key),
  5. new KeyValuePair<string, string>("lt",lt),
  6. new KeyValuePair<string, string>("execution",execution),
  7. new KeyValuePair<string, string>("_eventId","submit")
  8. });

如果需要上传文件,那么需要使用MultipartFormDataContent

  1. content = new MultipartFormDataContent();
  2. ((MultipartFormDataContent)content).Headers.Add("name", "file1");
  3.  
  4. ((MultipartFormDataContent)content).Headers.Add("filename", "20170114120751.png");
  5. var stream = new StreamContent(await File.OpenStreamForReadAsync());
  6. ((MultipartFormDataContent)content).Add(stream);

登陆方法

打开 https://passport.csdn.net/account/login 可以看到这个界面

右击查看源代码,可以拿到上传需要使用的两个变量 lt 和 execution

在登陆的时候,使用 post 把账号密码、lt execution 上传就可以登陆

模拟登陆csdn

于是下面就是模拟登陆

  1. 获得账号信息

    1. AccountCimage account = AppId.AccoutCimage;
  2. cookie

    1. CookieContainer cookies = new CookieContainer();
    2. HttpClientHandler handler = new HttpClientHandler();
    3. handler.CookieContainer = cookies;
    4. HttpClient http = new HttpClient(handler);
  3. 获得登陆需要的流水号

    1. var url = new Uri("https://passport.csdn.net/account/login");
    2. http.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    3. //http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br");
    4. http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "zh-CN,zh;q=0.8");
    5. http.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
    6. handler.UseCookies = true;
    7. handler.AllowAutoRedirect = true;
    8. string str = await http.GetStringAsync(url);
    9. Regex regex = new Regex(" type=\"hidden\" name=\"lt\" value=\"([\\w|\\-]+)\"");
    10. var lt = regex.Match(str).Groups[1].Value;
    11. regex = new Regex("type=\"hidden\" name=\"execution\" value=\"(\\w+)\"");
    12. var execution = regex.Match(str).Groups[1].Value;
  4. 登陆

    1. str = $"username={account.UserName}&password={account.Key}&lt={lt}&execution={execution}&_eventId=submit";
    2. str = str.Replace("@", "%40");
    3. HttpContent content = new StringContent(str, Encoding.UTF8);
    4. str = await content.ReadAsStringAsync();
    5. content=new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
    6. {
    7. new KeyValuePair<string, string>("username",account.UserName),//.Replace("@", "%40")),
    8. new KeyValuePair<string, string>("password",account.Key),
    9. new KeyValuePair<string, string>("lt",lt),
    10. new KeyValuePair<string, string>("execution",execution),
    11. new KeyValuePair<string, string>("_eventId","submit")
    12. });
    13. str = await content.ReadAsStringAsync();
    14. str = await (await http.PostAsync(url, content)).Content.ReadAsStringAsync();
  5. 查看登陆

    url = new Uri("http://write.blog.csdn.net/");
    str = await http.GetStringAsync(url);

  6. 上传文件

    1. content = new MultipartFormDataContent();
    2. ((MultipartFormDataContent)content).Headers.Add("name", "file1");
    3. ((MultipartFormDataContent)content).Headers.Add("filename", "20170114120751.png");
    4. var stream = new StreamContent(await File.OpenStreamForReadAsync());
    5. ((MultipartFormDataContent)content).Add(stream);
    6. str = await ((MultipartFormDataContent)content).ReadAsStringAsync();
    7. url = new Uri("http://write.blog.csdn.net/article/UploadImgMarkdown?parenthost=write.blog.csdn.net");
    8. var message = await http.PostAsync(url, content);
    9. if (message.StatusCode == HttpStatusCode.OK)
    10. {
    11. ResponseImage(message);
    12. }
    13. private async void ResponseImage(HttpResponseMessage message)
    14. {
    15. using (MemoryStream memoryStream = new MemoryStream())
    16. {
    17. int length = 1024;
    18. byte[] buffer = new byte[length];
    19. using (GZipStream zip = new GZipStream(await message.Content.ReadAsStreamAsync(), CompressionLevel.Optimal))
    20. {
    21. int n;
    22. while ((n = zip.Read(buffer, 0, length)) > 0)
    23. {
    24. memoryStream.Write(buffer, 0, n);
    25. }
    26. }
    27. using (StreamReader stream = new StreamReader(memoryStream))
    28. {
    29. string str = stream.ReadToEnd();
    30. }
    31. }
    32. }

使用 WebView 模拟登陆 csdn

下面给大家一个叫简单方法模拟登陆csdn

  1. GeekWebView.Navigate(new Uri("http://passport.csdn.net/"));
  2.  
  3. GeekWebView.NavigationCompleted += OnNavigationCompleted;
  4.  
  5. F = async () =>
  6. {
  7.  
  8. var functionString = string.Format(@"document.getElementsByName('username')[0].value='{0}';", "lindexi_gd@163.com");
  9. await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString });
  10. functionString = string.Format(@"document.getElementsByName('password')[0].value='{0}';", "密码");
  11. await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString });
  12.  
  13. functionString = string.Format(@"document.getElementsByClassName('logging')[0].click();");
  14. await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString });
  15. };
  16.  
  17. private Action F { set; get; }
  18.  
  19. private void OnNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
  20. {
  21. F();
  22. }

当然,这时需要修改登陆信息,我上面写的是我的。如果遇到有验证码,那么这个方法是不可使用,因为输入验证码暂时还没法做。

2018-8-10-win10-uwp-httpClient-登陆CSDN的更多相关文章

  1. win10 uwp httpClient 登陆CSDN

    本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站. HttpClient 使用 Cookie 我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登 ...

  2. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  3. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  4. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  5. Win10 UWP应用发布流程

    简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变. 这篇博文记录了我们发布一款Win10 UWP应用的基本流程,希望为 ...

  6. win10 UWP GET Post

    win10 应用应该是要有访问网络,网络现在最多的是使用GET,Post,简单的使用,可以用网络的数据:获得博客的访问量. 在使用网络,我们需要设置Package.appxmanifest 网络请求使 ...

  7. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  8. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

  9. win10 uwp 毛玻璃

    毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...

  10. win10 uwp 读取保存WriteableBitmap 、BitmapImage

    我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...

随机推荐

  1. go语言从例子开始之Example31.定时器

    我们常常需要在后面一个时刻运行 Go 代码,或者在某段时间间隔内重复运行. Go 的内置 定时器 和 打点器 特性让这些很容易实现.我们将先学习定时器,然后再学习打点器. Example: packa ...

  2. [前端自动化]grunt的简单使用

    前言 现在前端自动化已经是家常便饭,各种工具也是层出不穷,grunt.gulp.webpack是应用最广的三种工具,虽然grunt看似已垂垂老矣,但是以前写的很多项目一直用的就是grunt,温故方能知 ...

  3. Sass函数:数字函数-percentage()

    1.percentage() percentage()函数主要是将一个不带单位的数字转换成百分比形式: >> percentage(.2) 20% >> percentage( ...

  4. java ajax返回 Json 的 几种方式

    原文:https://blog.csdn.net/qq_26289533/article/details/78749057 方式 1. : 自写代码转 Json 需要  HttpHttpServlet ...

  5. Yii Ar model 查询

    Ar model 查询 参照表: CREATE TABLE tbl_user ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, username VA ...

  6. ldd3 编写scull尝试

    快速参考: #include <linux/types.h> dev_t dev_t is the type used to represent device numbers within ...

  7. Linux0.11内核源码——内核态进程切换的改进

    本来想自己写的,但是发现了一篇十分优秀的博客 https://www.cnblogs.com/tradoff/p/5734582.html system_call的源码解析:https://blog. ...

  8. flutter页面布局一

    Padding组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器 ...

  9. [CSP-S模拟测试]:画作(BFS+数学)

    题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...

  10. tomcat启动前端项目

    前后端分离项目,前端使用vue,部署启动前端项目可以使用NodeJS,Nginx,Tomcat. *)使用Tomcat部署启动: 1.把vue项目build生成的dist包,放到Tomcat的weba ...