qq空间登陆 cookie_c#协议登录空间解析

项目背景:

近期有朋友想让我帮他实现一个自动登录qq空间,并实现自动点赞,评论,留言之类的功能。正好闲来无事,研究一下实现方法。

实现方法:

要实现此功能其实很简单,无非就是登录成功后获取到cookie,然后通过get、post方式请求功能接口。

大致思路:

  1. get方式请求获取登录二维码接口,并拿到二维码图片(这里为什么要选择用二维码方式登录呢,因为扫码方式最简单,账号密码登录时会有滑块验证,有时还会有设备锁验证)
  2. 每隔1秒或2秒调用接口来监听二维码状态
  3. 当监听到登录成功后取出cookie,此时响应里有一个url,我们把它取出来并跳转到这个路径(需要禁止重定向)

好了,介绍完毕,下面来实际操作吧

新建一个winform程序,在窗体上放一个PictureBox控件用来展示二维码

4ea2c537f244b7675fe3e0f853393d42.png

在窗体加载事件中,我们来获取二维码

private void Form1_Load(object sender, EventArgs e){      //1、GET方式请求二维码图片            HttpWebRequest request = HttpWebRequest.CreateHttp("https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=0.6676227813796067&daid=5&pt_3rd_aid=0");      request.Method = RequestMethod.GET;      request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36";      //2、得到响应消息      WebResponse response = request.GetResponse();      //3、拿到响应消息中的头部信息中的Set-Cookie值(用于计算ptqrtoken)      WebHeaderCollection headerCollection = response.Headers;      Cookie.cookie1 = headerCollection.Get("set-cookie");      //4、拿到二维码图片,然后把这个图片展示在窗体中      Stream stream = response.GetResponseStream();      Image image = Image.FromStream(stream);      //5、展示在窗体中      login_qrcode.Image = image;    //异步监听二维码状态            Task task = new Task(() =>            {                while (true)                {                    if (ListenLoginStatus())                    {                        break;                    }                    Thread.Sleep(1000);                }            });            task.Start();}

二维码获取成功后,需要监听二维码状态(共四个状态:二维码未失效、扫描未确定登录、已确定登录、二维码已失效)

用户扫描窗体上的二维码图片,并确认登录后,就停止监听二维码并得到登录成功的cookie,拿到cookie后,就可以进行一系列的操作了,比如。。。再比如。。。自己想去吧

///         /// 监听二维码状态 登录成功返回true        ///         public bool ListenLoginStatus()        {            //1、计算出必要的参数ptqrtoken            ///    这里的cookie1值是获取二维码接口响应体中的set-cookie            string ptqrtoken = ptqrtoken(Cookie.cookie1.Split(';')[0].Split('=')[1]);            //2、请求二维码状态            string url = "https://ssl.ptlogin2.qq.com/ptqrlogin";            url += "?u1=https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone";            url += "&ptqrtoken=" + ptqrtoken;            url += "&ptredirect=0";            url += "&h=1";            url += "&t=1";            url += "&g=1";            url += "&from_ui=1";            url += "&ptlang=2052";            url += "&action=0-0-" + DateUtil.GetTimeStamp2();   // 获取当前时间戳(毫秒级)            url += "&js_ver=20021917";            url += "&js_type=1";            url += "&login_sig=";            url += "&pt_uistyle=40";            url += "&aid=549000912";            url += "&daid=5";            HttpWebRequest request = HttpWebRequest.CreateHttp(url);            request.Method = RequestMethod.GET;            request.Headers.Add("cookie", Cookie.cookie1);            WebResponse response = request.GetResponse();            string result = "";            using (Stream stream = response.GetResponseStream())            {                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                    result = reader.ReadToEnd().ToString();            }            if (!(result.Contains("http") && result.Contains("登录成功")))                return false;            //登录成功后,取出用户昵称            string[] arrayResult = result.Replace("ptuiCB(", "").TrimEnd(')').Split(',');            UserNickName = arrayResult[arrayResult.Length - 1].Trim().Trim(''');            //登录成功后,取出cookie            Cookie.cookie2 = response.Headers.Get("set-cookie");            //扫码登录成功后,会返回一个路径,跳转到这个路径后,取出cookie            url = arrayResult[2].Trim().Trim(''');            request = HttpWebRequest.CreateHttp(url);            request.Method = RequestMethod.GET;            //必须禁用重定向,否则会自动重定向到别的网址,就无法取到cookie            request.AllowAutoRedirect = false;            response = request.GetResponse();            Cookie.cookie3 = response.Headers.Get("set-cookie");            //取出登录成功的qq号码            string[] _a = url.Split('&');            foreach (string item in _a)            {                if (item.IndexOf("uin=") == 0)                {                    UserQqNumber = item.Replace("uin=", "");                    break;                }            }            //访问个人中心            request = HttpWebRequest.CreateHttp("https://user.qzone.qq.com/" + UserQqNumber);            request.Method = RequestMethod.GET;            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36";            //p_skey用于计算g_tk            string p_skey = "";            string[] arrayCookie = Cookie.cookie3.Replace(";,", ";").TrimEnd(';').Split(';');            foreach (string item in arrayCookie)            {                if (item.IndexOf("uin=") == 0)                    Cookie.cookie4 += item + "; ";                if (item.IndexOf("skey=") == 0)                    Cookie.cookie4 += item + "; ";                if (item.IndexOf("p_uin=") == 0)                    Cookie.cookie4 += item + "; ";                if (item.IndexOf("p_skey=") == 0)                {                    Cookie.cookie4 += item + "; ";                    if (!(item.IndexOf("p_skey_forbid") == 0) && !item.Equals("p_skey="))                        p_skey = item.Replace("p_skey=", "");                }            }            if (!string.IsNullOrWhiteSpace(Cookie.cookie4))                Cookie.cookie4 = Cookie.cookie4.Trim().TrimEnd(';');            request.Headers.Add(Header.cookie, Cookie.cookie4);            response = request.GetResponse();                        return true;        }        ///         /// 计算ptqrtoken        /// 用于监听二维码状态        ///         public string ptqrtoken(string qrsign)        {            int e = 0;            for (int i = 0; i < qrsign.Length; ++i)            {                e += (e << 5) + (int)(char)(qrsign[i]);            }            return e+ "";        }

这边文章到这里就结束了,主要介绍了如何实现通过扫描二维码来登录qq空间,后续的别的操作(点赞评论)下次再说

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值