背景

任何事情都有一个原由,本篇内容也不例外。如标题所示,关于判断登录的QQ是否已经加入指定的QQ群的问题。为什么是之二?因为之前已经写过一次相关内容了。既然曾经已经写过一次为什么还要写第二次?因为今天早上收到了一个邮件通知,这个是博客评论通知,有人评论就以邮件形式告知。评论内容是这样的:c#那个QQ群验证已经无法使用了能更新下吗。如下图所示:

没有错,就如我回复的一样,示例程序的代码的确不可以用了,不过思路依然可以使用。

分析

其实没有什么好分析的,思路与上次一样。只是上次验证的地址(http://qun.qzone.qq.com)无效了,可能是下线了吧!不过QQ也有关于群里管理的网站(https://qun.qq.com/),这个网站依然可以实现这样的操作。实现比较简单,访问网址https://qun.qq.com/member.html并登录,然后通过正则表达式匹配就行了!

此次还是与上次有些变化的,网页登录竟然取消了账号与密码登录,只能手机扫码或者选择已经登录的账号。也许是为了安全考虑吧,不过这也不重要了!

实现

这里使用Microsoft .net的Windows Form实现示例,使用WebBrowser(其实也可以使用CefSharp、WebView2等控件)控件加载网址https://qun.qq.com/member.html登录成功后,有使用正则匹配指定的群号来完成操作。

代码大致如下:

using System;

using System.Text.RegularExpressions;

using System.Windows.Forms;

namespace QQGroupVerification

{

public partial class QQVerificationLogin : Form

{

public QQVerificationLogin()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

webBrowser1.Navigate("https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=715030901&daid=73&hide_close_icon=1&pt_no_auth=1&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html%23");

webBrowser1.ScriptErrorsSuppressed=true;

webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;

}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

{

if (webBrowser1.ReadyState == WebBrowserReadyState.Complete&&webBrowser1.Url.ToString().StartsWith("https://qun.qq.com"))

{

webBrowser1.Hide();

string webPageString = webBrowser1.Document.Body.InnerHtml;

webPageString = Regex.Replace(webPageString, @"[\s\S]+?", "", RegexOptions.IgnoreCase);

var match = Regex.Match(webPageString, @"[\s\S]+?[\s\S]+(?=

if (match == null|| !match.Success)

{

return;

}

string groupid =this.textBox1.Text;// "这里是你的QQ群ID";

if (Regex.IsMatch(match.Value, $"data-id=\"{groupid}\""))

{

MessageBox.Show("验证成功");

CloseChrome();

ProgramMain form2 = new ProgramMain();

form2.Show();

}

else

{

MessageBox.Show("请加指定交流群入本群");

CloseChrome();

Application.Exit();

}

}

bool isBusy = webBrowser1.IsBusy;

}

public void CloseChrome()

{

if (webBrowser1 != null)

{

webBrowser1.Dispose();

}

}

}

}

此次代码与上次相比主要是多了两个正则,为什么要多这两个正则?新的QQ群管理网站用了前后端分离用了一些模板,这些模板可能会干扰接下来的操作。所以,第一个正则表达式替换掉所有JavaScript模板相关代码,替换为空字符串。第二个正则用来获取QQ群里列表区域所有文本内容,接下来才是判断返回信息中是否包含指定的QQ群。

预览

另一种方式

这一种方式是使用Windows Api查找窗体句柄,要打开指定的群,找到了窗体就认为加入了群。不过这个方法是不精准的,这个通过查找窗体的标题。知道要验证QQ群的名称,随便建一个临时群修改名称为要验证QQ群名称就可以过掉验证。

实现

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

namespace QQGroupVerificationByWindowsApi

{

public class WindownApiVerification

{

[DllImport("user32.dll", EntryPoint = "FindWindow")]

private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);

///

/// 找到句柄

///

/// 类名

///

public static IntPtr GetHandle(string IpClassName, string IpWindowName)

{

return FindWindow(IpClassName, IpWindowName);

}

///

/// 判断是否打开了某指定的QQ群

///

/// 参数是群名

///

public static bool IsInQQGroup(string qqGroupName)

{

IntPtr result = GetHandle("TXGuiFoundation", qqGroupName);

if (result == IntPtr.Zero)

{

return false;

}

return true;

}

}

}

使用方式如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace QQGroupVerificationByWindowsApi

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

string qqGroup = textBox1.Text;

if(string.IsNullOrWhiteSpace(qqGroup))

{

MessageBox.Show("请输入需要验证的QQ群的名称","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

return;

}

var result=WindownApiVerification.IsInQQGroup(qqGroup);

if (result)

{

MessageBox.Show("存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

return;

}

MessageBox.Show("不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

预览

示例下载

判断登录的QQ是否已经加入指定的QQ群

总结

以上就是关于判断QQ是否加入指定QQ群的简单判断,使用哪种方式就看个人想法了!其实还有其他的一些方法,例如:内存、网络等。不过就不再进行深入了解了,实现其他的方式现在也没有意义。无论哪种方式都可以被绕过,有时候不必太过执着。

警告:本章内容仅供学习交流,请勿使用非法用途。有任何非法行为均需自行承担!!!!

转载请注明:清风亦平凡 » 判断登录的QQ是否已经加入指定的QQ群之二

喜欢 (9)or分享 (0)

支付宝扫码打赏

微信打赏