在要求输入邮箱的文本域,请填写真实的邮件地址。非真实邮件地址,将收不到回复信息。

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

C# 清风 1334℃ 6评论

背景

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

关于C#QQ群验证的评论回复图

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

分析

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

QQ群管理

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

实现

这里使用Microsoft .netWindows Form实现示例,使用WebBrowser(其实也可以使用CefSharpWebView2等控件)控件加载网址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群。

预览

判断登录的QQ是否已经加入指定的QQ群之二-第2张图片
判断登录的QQ是否已经加入指定的QQ群之二-第3张图片

另一种方式

这一种方式是使用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群之二-第4张图片

示例下载

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

总结

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

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



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

喜欢 (8)or分享 (0)
支付宝扫码打赏 支付宝扫码打赏 微信打赏 微信打赏
头像
发表我的评论
取消评论

CAPTCHA Image
Reload Image
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(6)个小伙伴在吐槽
  1. 头像
    我是第一次玩C#想玩玩 如果Q群验证成功了 验证窗口让他自己关闭 其他窗口不关闭呢
    会飞的鱼2022-09-25 23:15 回复
    • 头像
      您好,验证成功后是可以关闭的。不过这样分情况,如果验证的窗口不是主窗口,也就是启动窗口。可以直接关闭。如果验证窗口是主窗口就只能隐藏,然后再调出其他接口!
      清风2022-09-26 10:43 回复
      • 头像
        但是我隐藏不掉主窗体啊 能不能发个代码我看下咋隐藏的
        dl会飞的鱼2022-09-26 13:00 回复
        • 头像
          当前的窗体隐藏比较简单! this.Hide();
          清风2022-09-26 14:10 回复
          • 头像
            就是说 我主窗口是验证窗口,验证成功后跳出来窗口2了 主窗口就隐藏掉 我中午百度看了 但是都没隐藏掉 不知道为啥
            会飞的鱼2022-09-26 15:33
          • 头像
            隐藏窗体是应该是不会有问题的。可能你代码实现有问题吧!这种比较基础的一些内容,你可以通过QQ找一些技术交流群,问问题比较方便!。
            清风2022-09-26 17:50