C#製作qq羣採集器qq羣成員提取,原理利用webbrowser滾輪HtmlAgilityPack解析實現
- 項目簡介
- 項目運行效果截圖 .
- 項目製作
- 總結待完善功能說明
1.簡介
簡單實現QQ羣成員提取,支持單個羣提取和所有羣提取,項目工具採用vs2013由於工具習慣了vs2013所以採用vs2013工具開發,後臺採用C#語言開發,WinFrom界面佈局,原理是利用webbrowser登錄網頁QQ羣管理界面,利用HtmlAgilityPack解析採集QQ羣成員,並且將QQ羣成員數據寫入到文本文件.txt,實現導出到本地C盤
2. 項目運行效果截圖
- 項目運行第一步點擊登錄QQ
- - 第二步輸入羣號採集或者點擊左邊加載的羣號採集
- 第三步看到結果提示成功導出到C盤可以打開看一下了
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