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

HttpClient 使用 Cookie

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

            CookieContainer cookies = new CookieContainer();

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

虽然已经有Cookie,但是还缺少一些请求需要带的头,因为浏览器是会告诉网站,需要的Accept,为了假装这是一个浏览器,所以就需要添加AcceptAccept-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做出数据,提供的类型有StringContentFormUrlEncodedContent等。

其中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. SEO中HTML标签权重列表

    网上流传很久的一份资料<SEO中HTML标签权重>,这里做一份备份. HTML标签权重分值排列 内部链接文字:10分 标题title:10分 域名:7分 H1,H2字号标题:5分 每段首句 ...

  2. iOS -NSOperation并发编程

    http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...

  3. 2019-9-2-C#判断文件是否被混淆

    title author date CreateTime categories C#判断文件是否被混淆 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:2 ...

  4. 转: PHP的"::"、"->"和"=>"的区别

    来自:http://blog.csdn.net/wgw335363240/article/details/20453379 1."::" 运算法 该运算符是调用一个类中的静态成员的 ...

  5. nested exception is org.hibernate.MappingException解决方案

    1.可能是因为映射文件( Order.hbm.xm)配置的class路径出错 <hibernate-mapping> <class name="com.web.bean.O ...

  6. 【django后端分离】mysql原生查询命令后,RawQueryset类型的自定义序列化返回json格式

    1:设置mysql原生分页 # 监控系统首页显示分页 def MyPagination(limitid,offsetid): limitid =str(limitid) offsetid =str(o ...

  7. day38 12-Spring的Bean的属性的注入:名称空间p

    xmlns="http://www.springframework.org/schema/beans"是默认的名称空间. xmlns:xsi="http://www.w3 ...

  8. PHP核心编程-图像操作

    一 图像操作环境: 1.    开启GD2图像处理并检测 在php.ini开启GD库 2.    画布坐标系说明 二. 图像基本操作(步骤) 1.    创建图像 创建画布(图像资源) 创建的方法: ...

  9. RabbitMQ默认端口

    4369 (epmd), 25672 (Erlang distribution)5672, 5671 (AMQP 0-9-1 without and with TLS)15672 (if manage ...

  10. iOS 微信支付如果遇到跳转只有一个确定请看这里

    http://www.cocoachina.com/bbs/read.php?tid-321546.html 今天在联调微信支付,不得不说,和它比起来,阿里的支付sdk真的是太好用了.果然和后端同学在 ...