技术实现:
- 通过实时监听聊天面板,通过消息主题,时间等关键信息比对,发现如果有信息到达,则进行下一步逻辑处理。
- 有新消息达到,则自动点击新消息的联系人UI对象,切换到与联系人的聊天窗口。
- 获取聊天窗口的最后一条消息对象,如果发现Name中包含[文件]关键字则进行下一步逻辑。
- 消息对象中包括了文件名称,大小,发送人等信息,将他们提取出来。
- 开启一个任务监听微信的文件夹,分析是否完成了下载归档操作。
代码片段:
微信是否产生新消息
var currentChatList = UI_WX_Window.Current.Find("/Pane/Pane[1]/Pane[2]/Pane/Pane/Pane/List");
if (currentChatList == null || currentChatList.ControlType != FlaUI.Core.Definitions.ControlType.List)
{
Thread.Sleep(1000);
continue;
}
var source = currentChatList.FindAllChildren();
var tempMessageSource = new List<WXFileMsgEntity>();
source.ToList().ForEach(item =>
{
if (item.ControlType == FlaUI.Core.Definitions.ControlType.ListItem)
{
var buttonName = item.FindFirstByXPath("/Pane/Button")?.Name;
var time = item.FindFirstByXPath("/Pane/Pane/Pane[1]/Text[2]")?.Name;
var lastMessage = item.FindFirstByXPath("/Pane/Pane/Pane[2]/Text")?.Name;
var count = item.FindFirstByXPath("/Pane/Text")?.Name;
var messageitem = new WXFileMsgEntity { UserName = buttonName, Time = time, CurrentMessage = lastMessage, Count = count };
tempMessageSource.Add(messageitem);
if (historyMessageSource != null)
{
var cnt = historyMessageSource.Count(s =>
s.UserName == messageitem.UserName
&& s.CurrentMessage == messageitem.CurrentMessage
&& s.Time == messageitem.Time);
if (cnt == 0)
{
if (GetFileUsers.Count(ss => ss.Contains(messageitem.UserName)) > 0)
{
//切换窗口
UI_WX_Window.Current.ClickElement(item);
Thread.Sleep(200);
GetFile(messageitem);
}
}
}
}
});
historyMessageSource = tempMessageSource;
Thread.Sleep(1000);
获取文件信息
private void GetFile(WXFileMsgEntity messageitem)
{
var chatHistoryList = UI_WX_Window.Current.Find("/Pane/Pane[2]/Pane/Pane/Pane/Pane/Pane[2]/Pane[1]/Pane/List");//聊天窗口
if (chatHistoryList != null)
{
var source = chatHistoryList.FindAllChildren();
int i = source.Count() - 1;
var currentUI = source[i];
var name = currentUI.Name;
if (name.Contains("[文件]"))
{
var userName = currentUI.FindFirstByXPath("/Pane/Button");
var fileName = currentUI.FindFirstByXPath("/Pane/Pane[1]/Pane/Pane/Pane/Pane/Pane[1]/Pane[1]/Text");
var fileSize = currentUI.FindFirstByXPath("/Pane/Pane[1]/Pane/Pane/Pane/Pane/Pane[1]/Pane[1]/Pane/Text[1]");
if (userName != null && fileName != null && fileSize != null)
{
messageitem.FileName = fileName.Name;
messageitem.FileSize = fileSize.Name;
string absPath = "E:\\AppFiles\\WeChat Files\\WeChat Files\\wxid_bwalm3wpwz8o22\\FileStorage\\File\\" + DateTime.Now.ToString("yyyy-MM");
messageitem.FullFile = absPath + "\\" + messageitem.FileName;
SetMessage(messageitem.UserName + "有新文件传送给你,文件名:" + messageitem.FileName + " 尺寸:" + messageitem.FileSize + " 路径:" + messageitem.FullFile);
fileCheckSource.Add(messageitem);
}
}
}
}
文件是否归档
Thread fileCheck = new Thread(new ThreadStart(() =>
{
while (State == TaskState.Runing)
{
foreach (var item in fileCheckSource)
{
if (item.IsDownLoad == false) {
if (System.IO.File.Exists(item.FullFile))
{
SetMessage(item.UserName + "的文件【"+item.FileName+"】已成功归档本地 " );
item.IsDownLoad=true;
}
}
}
Thread.Sleep(1000);
}
}));
fileCheck.Start();