写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

时间:2023-03-09 06:36:47
写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

1、HttpUtil工具类,用于模拟用户登录以及爬取网页:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading; namespace Utils
{
/// <summary>
/// Http上传下载文件
/// </summary>
public class HttpUtil
{
#region cookie设置
private static CookieContainer m_Cookie = new CookieContainer(); public static void SetHttpCookie(CookieContainer cookie)
{
m_Cookie = cookie;
}
#endregion #region HttpDownloadFile 下载文件
public static MemoryStream HttpDownloadFile(string url)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.CookieContainer = m_Cookie; //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream(); //创建写入流
MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[];
int size = responseStream.Read(bArr, , (int)bArr.Length);
while (size > )
{
stream.Write(bArr, , size);
size = responseStream.Read(bArr, , (int)bArr.Length);
}
stream.Seek(, SeekOrigin.Begin);
responseStream.Close();
return stream;
}
#endregion #region HttpUploadFile 上传文件
/// <summary>
/// Http上传文件
/// </summary>
public static string HttpUploadFile(string url, byte[] bArr, string fileName)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
request.ContentType = "text/plain;charset=utf-8";
request.CookieContainer = m_Cookie; Stream postStream = request.GetRequestStream();
postStream.Write(bArr, , bArr.Length);
postStream.Close(); //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream instream = response.GetResponseStream();
StreamReader sr = new StreamReader(instream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
}
#endregion #region HttpPost
/// <summary>
/// HttpPost
/// </summary>
public static string HttpPost(string url, string data)
{
byte[] bArr = ASCIIEncoding.UTF8.GetBytes(data); // 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = m_Cookie;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bArr.Length;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"; Stream postStream = request.GetRequestStream();
postStream.Write(bArr, , bArr.Length);
postStream.Close(); //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//返回结果网页(html)代码
MemoryStream memoryStream = new MemoryStream();
bArr = new byte[];
int size = responseStream.Read(bArr, , (int)bArr.Length);
while (size > )
{
memoryStream.Write(bArr, , size);
size = responseStream.Read(bArr, , (int)bArr.Length);
Thread.Sleep();
}
string content = Encoding.UTF8.GetString(memoryStream.ToArray());
return content;
}
#endregion #region HttpPost
/// <summary>
/// HttpPost
/// </summary>
public static string HttpPost(string url)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = m_Cookie;
request.Method = "POST";
request.ContentType = "text/plain;charset=utf-8";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"; //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//返回结果网页(html)代码
MemoryStream memoryStream = new MemoryStream();
byte[] bArr = new byte[];
int size = responseStream.Read(bArr, , (int)bArr.Length);
while (size > )
{
memoryStream.Write(bArr, , size);
size = responseStream.Read(bArr, , (int)bArr.Length);
Thread.Sleep();
}
string content = Encoding.UTF8.GetString(memoryStream.ToArray());
return content;
}
#endregion #region HttpGet
/// <summary>
/// HttpGet
/// </summary>
public static string HttpGet(string url)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = m_Cookie;
request.Method = "GET";
request.ContentType = "text/plain;charset=utf-8";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"; //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//返回结果网页(html)代码
MemoryStream memoryStream = new MemoryStream();
byte[] bArr = new byte[];
int size = responseStream.Read(bArr, , (int)bArr.Length);
while (size > )
{
memoryStream.Write(bArr, , size);
size = responseStream.Read(bArr, , (int)bArr.Length);
Thread.Sleep();
}
string content = Encoding.UTF8.GetString(memoryStream.ToArray());
return content;
}
#endregion }
}

2、Windows服务代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using Utils; namespace BugMonitor
{
public partial class BugMonitorService : ServiceBase
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int WTSGetActiveConsoleSessionId(); [DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSSendMessage(
IntPtr hServer,
int SessionId,
String pTitle,
int TitleLength,
String pMessage,
int MessageLength,
int Style,
int Timeout,
out int pResponse,
bool bWait); public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero; private System.Timers.Timer timer;
private static List<int> idList = new List<int>(); private string loginUrl = ConfigurationManager.AppSettings["loginUrl"];
private string listUrl = ConfigurationManager.AppSettings["bugListUrl"];
private string userLogin = ConfigurationManager.AppSettings["userName"];
private string userPassword = ConfigurationManager.AppSettings["userPassword"];
private Regex regTr = new Regex(@"<tr class=""listTableLine(?:(?!</tr>)[\s\S])*</tr>", RegexOptions.IgnoreCase);
private Regex regTd = new Regex(@"<td align=""left"">((?:(?!</td>)[\s\S])*)</td>", RegexOptions.IgnoreCase);
private int pageSize = Convert.ToInt32(ConfigurationManager.AppSettings["pageSize"]);
private double interval = Convert.ToDouble(ConfigurationManager.AppSettings["interval"]);
private string projectId = ConfigurationManager.AppSettings["projectId"]; public BugMonitorService()
{
InitializeComponent();
} public static void ShowMessageBox(string message, string title)
{
int resp = ;
WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE,
WTSGetActiveConsoleSessionId(),
title, title.Length,
message, message.Length,
, , out resp, false);
} protected override void OnStart(string[] args)
{
LogUtil.path = Application.StartupPath + "\\log"; timer = new System.Timers.Timer(interval * * );
timer.Elapsed += new System.Timers.ElapsedEventHandler(Action);
timer.Start(); LogUtil.Log("服务启动成功");
} protected override void OnStop()
{
if (timer != null)
{
timer.Stop();
timer.Close();
timer.Dispose();
timer = null;
} LogUtil.Log("服务停止成功"); Thread.Sleep(); //等待一会,待日志写入文件
} public void Start()
{
OnStart(null);
} public void Action(object sender, ElapsedEventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
try
{
int bugCount = ;
string loginResult = HttpUtil.HttpPost(loginUrl, string.Format("uer={0}&userPassword={1}&submit=%E7%99%BB%E5%BD%95&userLogin={0}&uer=", userLogin, userPassword)); string result = HttpUtil.HttpPost(listUrl, string.Format("projectId={0}&perListDPF={1}&sortFieldDPF=bugCode&sortSequenceDPF=1&bugStatus=1", projectId, pageSize));
ProcessBug(result, ref bugCount);
result = HttpUtil.HttpPost(listUrl, string.Format("projectId={0}&perListDPF={1}&sortFieldDPF=bugCode&sortSequenceDPF=1&bugStatus=3", projectId, pageSize));
ProcessBug(result, ref bugCount); if (bugCount > )
{
ShowMessageBox(string.Format("您有 {0} 个新BUG", bugCount), "提醒");
}
else
{
LogUtil.Log("没有新BUG");
}
}
catch (Exception ex)
{
LogUtil.LogError(ex.Message + "\r\n" + ex.StackTrace);
}
});
}
catch (Exception ex)
{
LogUtil.LogError(ex.Message + "\r\n" + ex.StackTrace);
}
} private void ProcessBug(string bugListPageHtml, ref int bugCount)
{
MatchCollection mcTr = regTr.Matches(bugListPageHtml);
foreach (Match mTr in mcTr)
{
MatchCollection mcTd = regTd.Matches(mTr.Value);
if (mcTd.Count > )
{
int id = Convert.ToInt32(mcTd[].Groups[].Value.Trim());
string strStatus = mcTd[].Value.ToLower();
if (!idList.Exists(a => a == id))
{
if (strStatus.IndexOf("已激活") > || strStatus.IndexOf("重新打开") > )
{
idList.Add(id);
bugCount++;
LogUtil.Log(string.Format("发现新的BUG,BUG编号:{0}", id));
}
}
}
}
}
}
}