C#製作qq羣採集器qq羣成員提取,原理利用webbrowser滾輪HtmlAgilityPack解析實現

C#製作qq羣採集器qq羣成員提取,原理利用webbrowser滾輪HtmlAgilityPack解析實現

  1. 項目簡介
  2. 項目運行效果截圖 .
  3. 項目製作
  4. 總結待完善功能說明

1.簡介

簡單實現QQ羣成員提取,支持單個羣提取和所有羣提取,項目工具採用vs2013由於工具習慣了vs2013所以採用vs2013工具開發,後臺採用C#語言開發,WinFrom界面佈局,原理是利用webbrowser登錄網頁QQ羣管理界面,利用HtmlAgilityPack解析採集QQ羣成員,並且將QQ羣成員數據寫入到文本文件.txt,實現導出到本地C盤

2. 項目運行效果截圖

  • 項目運行第一步點擊登錄QQ
    -在這裏插入圖片描述
  • 第二步輸入羣號採集或者點擊左邊加載的羣號採集
  • 第三步看到結果提示成功導出到C盤可以打開看一下了

plZ3VvZ3Vv,size_16,color_FFFFFF,t_70)![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191217191639742.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tla2V6ZXplZ3VvZ3Vv,size_16,color_FFFFFF,t_70)
在這裏插入圖片描述

3.項目製作

1.打開vs2013點擊新建WinForm應用窗體,窗體名稱爲QunChenYuanTiQu,新建兩個model類qunliebiao.cs
RowData.cs

在這裏插入圖片描述
2.窗體佈局使用label,textbox,button,webbrowser,datagridview,timer,timer是用來定時從webbrowser中獲取登錄QQ後Q羣數據加載到DataGridView控件顯示
在這裏插入圖片描述

3.登錄QQ代碼

  登錄button事件代碼
  timer1.Start();
  webBrowser1.Url = new Uri("http://qun.qq.com/member.html");
定時器timer代碼
if ( webBrowser1.DocumentText != "")
            {
                string htmltext = webBrowser1.Document.Body.OuterHtml;
                HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
                htmlDoc.LoadHtml(htmltext);
                HtmlAgilityPack.HtmlNodeCollection node = htmlDoc.DocumentNode.SelectNodes("//div[@class='my-all-group']/ul/li");//"//div[@class='slideBannerA homeSlideAD1']"
              
                if(node!=null){
                    List<qunliebiao> qunlie = new List<qunliebiao>();
                    foreach (HtmlNode htmlNode in node)
                    {
                        qunliebiao qun = new qunliebiao();
                        qunlie.Add(qun);
                        qun.QunName = htmlNode.InnerText;
                        qun.QunNumber = htmlNode.GetAttributeValue("data-id", "");
                    }
                  dataGridView1.DataSource = qunlie;
                  dataGridView1.Columns[0].HeaderCell.Value = "羣名稱";
                  dataGridView1.Columns[1].HeaderCell.Value = "羣號";
                  timer1.Stop();
                }
                else{}
            }
            else  { 
            }
          

3上面可以完成登錄QQ後採集Q羣號和羣名稱,下面我們完成採集Q羣成員Qq號代碼

  string htmltext = webBrowser1.Document.Body.OuterHtml;
                HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
                htmlDoc.LoadHtml(htmltext);

                HtmlAgilityPack.HtmlNodeCollection node = htmlDoc.DocumentNode.SelectNodes("//div[@class='my-all-group']/ul/li");//"//div[@class='slideBannerA homeSlideAD1']"

                if (node != null)
                {
                    foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("li"))
                    {
                        string strHref = item.GetAttribute("data-id");
                        if (!string.IsNullOrEmpty(strHref) && strHref==textBox1.Text.ToString().Trim())
                        {
                            //item.ScrollIntoView(true);
                            item.Focus();
                            //item.SetAttribute("selected", "true");
                            //點擊輸入的QQ羣
                            item.InvokeMember("Click");
                            //開始採集
                            outDataQun();
                        }
                    }
                }
            }
     bool gund = true;
            while (gund)
            {
                string htmlt = webBrowser1.Document.Body.OuterHtml;
                HtmlAgilityPack.HtmlDocument htmlD = new HtmlAgilityPack.HtmlDocument();
                htmlD.LoadHtml(htmlt);
                //獲取總共有多少條數據groupMemberNum
                HtmlAgilityPack.HtmlNode g = htmlD.GetElementbyId("groupMemberNum");
                int num = int.Parse(g.InnerText.Trim());
                //循環滾動加載
                System.Windows.Forms.HtmlDocument document = this.webBrowser1.Document;
                Delay(10);//系統延遲秒
                document.Window.ScrollTo(0, webBrowser1.Document.Body.ScrollRectangle.Height);
                Delay(1000);//系統延遲秒
                document.Window.ScrollTo(0, 50);
                //獲取加載數據條目
                string htmll = webBrowser1.Document.Body.OuterHtml;
                HtmlAgilityPack.HtmlDocument htmlDl = new HtmlAgilityPack.HtmlDocument();
                htmlDl.LoadHtml(htmll);
                HtmlAgilityPack.HtmlNode nodel = htmlDl.GetElementbyId("groupMember");
                var trNodesl = nodel.SelectNodes("tbody/tr");
                trNodesl.RemoveAt(0);
              
                foreach (var trNode in trNodesl)
                {
                    var tdNode = trNode.SelectNodes("td");
                    //獲取加載後的數據
                    int tdl = int.Parse(tdNode[1].InnerText.Trim());
                   
                    //MessageBox.Show(tdl.ToString());
                    //Console.WriteLine("時間"+ DateTime.Now.ToShortDateString());
                   
                    //判斷加載數據是否是總數條,是就停止滾動,不是就繼續滾動
                    if (tdl >= num)
                    {
                        //MessageBox.Show(tdl.ToString());

                        document.Window.ScrollTo(0, webBrowser1.Document.Body.ScrollRectangle.Height);
                        outDataQQ();
                        //結束循環判斷
                        gund = false;
                        break;
                    }
                }
            }
 
            string htmltext = webBrowser1.Document.Body.OuterHtml;
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(htmltext);

            HtmlAgilityPack.HtmlNode node = htmlDoc.GetElementbyId("groupMember");
            var trNodes = node.SelectNodes("tbody/tr");
            if (trNodes != null)
            {

                //load = false;
                trNodes.RemoveAt(0);
                List<RowData> rows = new List<RowData>();
                //Regex rg = new Regex("");
                HtmlAgilityPack.HtmlNode n = htmlDoc.GetElementbyId("groupTit");
                string path = "C:\\" + n.InnerText.Trim() + ".txt";
                if (File.Exists(path))
                {
                    File.Delete(path);
                    FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.Write);//創建寫入文件 
                    StreamWriter sw = new StreamWriter(fs1);
                    foreach (var trNode in trNodes)
                    {
                        var tdNode = trNode.SelectNodes("td");
                        RowData row = new RowData();
                        rows.Add(row);

                        row.QunBanHao = tdNode[1].InnerText;
                        row.QunChenYuan = tdNode[2].InnerText;
                        row.QunMingPian = tdNode[3].InnerText;
                        row.QunQqHao = tdNode[4].InnerText;
                        row.QunSex = tdNode[5].InnerText;
                        row.QunQLing = tdNode[6].InnerText;
                        row.QunRunTimer = tdNode[7].InnerText;
                        row.QunDengJi = tdNode[8].InnerText;
                        row.QunZuiFaYan = tdNode[9].InnerText;

                    }

                    for (int i = 0; i < rows.Count; i++)
                    {
                        sw.WriteLine(rows[i].QunBanHao.Trim() + "," + rows[i].QunChenYuan.Trim() + ":" + rows[i].QunMingPian.Trim() +
                            "[ " + rows[i].QunQqHao.Trim() + " ]" + rows[i].QunSex.Trim() + "#" + rows[i].QunQLing.Trim() +
                            "$" + rows[i].QunRunTimer.Trim() + "%" + rows[i].QunDengJi.Trim() + "&" + rows[i].QunZuiFaYan.Trim());//開始寫入值
                    }
                    sw.Close();
                    fs1.Close();
                    label3.Text = "成功導出到C盤";
                }
                else
                {
                    FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.Write);//創建寫入文件 
                    StreamWriter sw = new StreamWriter(fs1);
                    foreach (var trNode in trNodes)
                    {
                        var tdNode = trNode.SelectNodes("td");
                        RowData row = new RowData();
                        rows.Add(row);

                        row.QunBanHao = tdNode[1].InnerText;
                        row.QunChenYuan = tdNode[2].InnerText;
                        row.QunMingPian = tdNode[3].InnerText;
                        row.QunQqHao = tdNode[4].InnerText;
                        row.QunSex = tdNode[5].InnerText;
                        row.QunQLing = tdNode[6].InnerText;
                        row.QunRunTimer = tdNode[7].InnerText;
                        row.QunDengJi = tdNode[8].InnerText;
                        row.QunZuiFaYan = tdNode[9].InnerText;

                    }

                    for (int i = 0; i < rows.Count; i++)
                    {
                        sw.WriteLine(rows[i].QunBanHao.Trim() + "," + rows[i].QunChenYuan.Trim() + ":" + rows[i].QunMingPian.Trim() +
                            "[ " + rows[i].QunQqHao.Trim() + " ]" + rows[i].QunSex.Trim() + "#" + rows[i].QunQLing.Trim() +
                            "$" + rows[i].QunRunTimer.Trim() + "%" + rows[i].QunDengJi.Trim() + "&" + rows[i].QunZuiFaYan.Trim());//開始寫入值


                      
                    } sw.Close();
                    fs1.Close();
                    label3.Text = "成功導出到C盤";
                }
            }

4總結待完善功能說明

這裏面的代碼詳細說比較費時間如果有需要我會在代碼中註釋,主要點食解析需要引入HtmlAgilityPack.dll,總的來說實現了QQ羣成員提取,後面也可以增加一些羣管理,增加成員,批量刪除成員,設置管理員,本來我想要引入程序,當WebBrowser在加載提取的時候無聊可以看一下有趣的內容,利用WebBrowser實現看的到效果,但是性能來說相對比較慢,1千多人的羣成員大概需要幾分鐘才能提取完成,利用C#WinFrom製作自己的軟件方便管理有興趣可以加羣交流本人Q1139721002,另外只是網頁QQ已經停止維護了,項目下載地址https://download.csdn.net/download/kekezezeguoguo/12037055

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章