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

HttpClient 使用 Cookie

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

            CookieContainer cookies = new CookieContainer();

            HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
HttpClient http = new HttpClient(handler);

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

添加 Accept

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

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

添加 Accept-Encoding

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

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

添加 Accept-Language

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

添加 User-Agent

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 需要在发送的内容进行添加

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

发送数据

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

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

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

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

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

          content=new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("username",account.UserName),
new KeyValuePair<string, string>("password",account.Key),
new KeyValuePair<string, string>("lt",lt),
new KeyValuePair<string, string>("execution",execution),
new KeyValuePair<string, string>("_eventId","submit")
});

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

            content = new MultipartFormDataContent();
((MultipartFormDataContent)content).Headers.Add("name", "file1"); ((MultipartFormDataContent)content).Headers.Add("filename", "20170114120751.png");
var stream = new StreamContent(await File.OpenStreamForReadAsync());
((MultipartFormDataContent)content).Add(stream);

登陆方法

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

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

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

模拟登陆csdn

于是下面就是模拟登陆

  1. 获得账号信息

        AccountCimage account = AppId.AccoutCimage;
  2. cookie

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

        var url = new Uri("https://passport.csdn.net/account/login");
    
        http.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    //http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br");
    http.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "zh-CN,zh;q=0.8");
    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"); handler.UseCookies = true;
    handler.AllowAutoRedirect = true; string str = await http.GetStringAsync(url);
    Regex regex = new Regex(" type=\"hidden\" name=\"lt\" value=\"([\\w|\\-]+)\"");
    var lt = regex.Match(str).Groups[1].Value;
    regex = new Regex("type=\"hidden\" name=\"execution\" value=\"(\\w+)\"");
    var execution = regex.Match(str).Groups[1].Value;
  4. 登陆

        str = $"username={account.UserName}&password={account.Key}&lt={lt}&execution={execution}&_eventId=submit";
    str = str.Replace("@", "%40"); HttpContent content = new StringContent(str, Encoding.UTF8); str = await content.ReadAsStringAsync();
    content=new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
    {
    new KeyValuePair<string, string>("username",account.UserName),//.Replace("@", "%40")),
    new KeyValuePair<string, string>("password",account.Key),
    new KeyValuePair<string, string>("lt",lt),
    new KeyValuePair<string, string>("execution",execution),
    new KeyValuePair<string, string>("_eventId","submit")
    });
    str = await content.ReadAsStringAsync(); str = await (await http.PostAsync(url, content)).Content.ReadAsStringAsync();
  5. 查看登陆

    url = new Uri(“http://write.blog.csdn.net/“);

    str = await http.GetStringAsync(url);

  6. 上传文件

       content = new MultipartFormDataContent();
    ((MultipartFormDataContent)content).Headers.Add("name", "file1"); ((MultipartFormDataContent)content).Headers.Add("filename", "20170114120751.png");
    var stream = new StreamContent(await File.OpenStreamForReadAsync());
    ((MultipartFormDataContent)content).Add(stream);
    str = await ((MultipartFormDataContent)content).ReadAsStringAsync();
    url = new Uri("http://write.blog.csdn.net/article/UploadImgMarkdown?parenthost=write.blog.csdn.net");
    var message = await http.PostAsync(url, content);
    if (message.StatusCode == HttpStatusCode.OK)
    {
    ResponseImage(message);
    } private async void ResponseImage(HttpResponseMessage message)
    {
    using (MemoryStream memoryStream = new MemoryStream())
    {
    int length = 1024;
    byte[] buffer = new byte[length];
    using (GZipStream zip = new GZipStream(await message.Content.ReadAsStreamAsync(), CompressionLevel.Optimal))
    {
    int n;
    while ((n = zip.Read(buffer, 0, length)) > 0)
    {
    memoryStream.Write(buffer, 0, n);
    }
    } using (StreamReader stream = new StreamReader(memoryStream))
    {
    string str = stream.ReadToEnd();
    }
    }
    }

使用 WebView 模拟登陆 csdn

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

          GeekWebView.Navigate(new Uri("http://passport.csdn.net/"));

            GeekWebView.NavigationCompleted += OnNavigationCompleted;

            F = async () =>
{ var functionString = string.Format(@"document.getElementsByName('username')[0].value='{0}';", "lindexi_gd@163.com");
await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString });
functionString = string.Format(@"document.getElementsByName('password')[0].value='{0}';", "密码");
await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString }); functionString = string.Format(@"document.getElementsByClassName('logging')[0].click();");
await GeekWebView.InvokeScriptAsync("eval", new string[] { functionString });
}; private Action F { set; get; } private void OnNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
{
F();
}

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


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

win10 uwp httpClient 登陆CSDN的更多相关文章

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

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

  2. win10 UWP GET Post

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

  3. win10 uwp smms图床

    本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...

  4. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...

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

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

  6. Win10 UWP开发实现Bing翻译

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

  7. Win10 UWP应用发布流程

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

  8. win10 uwp 列表模板选择器

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

  9. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

随机推荐

  1. go语言:获取字符串长度

    go语言字符串底层由字节数组实现,使用UTF-8编码,初始化以后不能被修改 获取字符串长度 一.当字符串中所有字符都是单字节字符时,使用 len 函数获取字符串的长度 package main imp ...

  2. Redis分布式锁的实现及注意事项

    一.前言 分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于Redis的分布式锁: 3. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上 ...

  3. pip安装依赖与生成依赖

    一.安装依赖 从requirements.txt安装依赖库 pip install -r requirements 当提示权限不够时,前面加上sudo#下面就是一个requirements.txt文件 ...

  4. list的基本使用

    转自:https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/10/2631191.html vector :vector和built-in数组类似 ...

  5. linux下对拍

    #!/bin/bash t=0; while true; do let "t = $t + 1" printf $t printf ":\n" ./rand & ...

  6. 用Python的pandas框架操作Excel文件中的数据教程

    用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...

  7. GDSOI2017第三轮模拟4.21 总结

    1 第一题看着就觉得猎奇,于是就想着打暴力就跑. 但是很严重的问题就是... \(D\)和\(B\)打反了,都不知道当时在干什么??? 原本可以拿35. 2 第二题看着就觉得套路,于是想着今天就攻这题 ...

  8. python-null

    很早之前,遇到过一个面试官问的python中有没有null,当时有点紧张,想成了None,就脱口而出是有的.今天遇到了none问题,所以就正好说一下. python中是没有NULL的. Python中 ...

  9. Spring Boot:Boot2.0版本整合Neo4j

    前面介绍了Boot 1.5版本集成Neo4j,Boot 2.0以上版本Neo4j变化较大. 场景还是电影人员关系 Boot 2.0主要变化 GraphRepository在Boot2.0下不支持了,调 ...

  10. DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES

    原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ...