csdn协议中流水号的作用(协议登录空间解析)
项目背景:
近期有朋友想让我帮他实现一个自动登录qq空间,并实现自动点赞,评论,留言之类的功能。正好闲来无事,研究一下实现方法。
实现方法:
要实现此功能其实很简单,无非就是登录成功后获取到Cookie,然后通过get、post方式请求功能接口。
大致思路:
- get方式请求获取登录二维码接口,并拿到二维码图片(这里为什么要选择用二维码方式登录呢,因为扫码方式最简单,账号密码登录时会有滑块验证,有时还会有设备锁验证)
- 每隔1秒或2秒调用接口来监听二维码状态
- 当监听到登录成功后取出cookie,此时响应里有一个url,我们把它取出来并跳转到这个路径(需要禁止重定向)
好了,介绍完毕,下面来实际操作吧
新建一个winform程序,在窗体上放一个PictureBox控件用来展示二维码
在窗体加载事件中,我们来获取二维码
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后,就可以进行一系列的操作了,比如。。。再比如。。。自己想去吧
/// <summary>
/// 监听二维码状态 登录成功返回true
/// </summary>
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;
}
/// <summary>
/// 计算ptqrtoken
/// 用于监听二维码状态
/// </summary>
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空间,后续的别的操作(点赞评论)下次再说
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com