背景
任何事情都有一个原由,本篇内容也不例外。如标题所示,关于判断登录的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, @"<script\s?type=""text/template""\s+?id=.+?>[\s\S]+?</script>", "", RegexOptions.IgnoreCase);
var match = Regex.Match(webPageString, @"<div\sclass=.?body-content.?>[\s\S]+?<div\sclass=.?member-body.?>[\s\S]+(?=<div\s+?class=""foot\sbtn-footer"")", RegexOptions.IgnoreCase);
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);
/// <summary>
/// 找到句柄
/// </summary>
/// <param name="IpClassName">类名</param>
/// <returns></returns>
public static IntPtr GetHandle(string IpClassName, string IpWindowName)
{
return FindWindow(IpClassName, IpWindowName);
}
/// <summary>
/// 判断是否打开了某指定的QQ群
/// </summary>
/// <param name="qqGroupName">参数是群名</param>
/// <returns></returns>
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群之二
this.Hide();
QQ
找一些技术交流群,问问题比较方便!。