本文由网友
蓝创精英团队投稿,欢迎转载、分享オリジナル:Blue Creation Elite Team
原文へのリンク:https//kesshei.blog.csdn.net/article/details/124955177
目的:目的
私は常にWeChatのグループ機能を実現したいが、実現していない、理由の1つは違法を恐れている、WeChatインターフェイスBarabaraをクラックしたため、特定の会社を覚えている、その後、被告。多くの罰金を科す。
この時点で、RPA技術に基づいていれば、WeChatには影響しないだろうと思いました。結局のところ、私はコンピュータの操作をシミュレートしているだけで、WeChat会社は私の行動が違法であることを認識しませんでした。
この動作は安全な方法に基づいた技術かもしれません
そこで私はそれを試してみましたインターネット上の情報も参考にしてインスピレーションを与えました
FlaUIとは何か?
FlaUIは、Windows Vistaから導入されたMicrosoftのUIAutomation技術に基づく新しいUI自動テスト技術です。最新のWindows SDKでは、UIAとMSAAのようなUI自動化技術をサポートする他のコンポーネントがWindows Automation APIと呼ばれています。
UIAは、UI自動化のための新しいインターフェイスとパターンを定義します。TreeWalker/FindAllは、UI要素のトラバーサルと条件付きクエリをサポートしています。Name、 ID、Type、ClassName、Location、 VisibilityなどのUI要素のプロパティを読み書きするUIAプロパティを定義します。UI要素の振る舞いを定義するUIAパターン(Select、Expand、Resize、 Check、Valueなど)。UIA Eventインターフェイスも導入され、新しいウィンドウが開くイベントなどのイベントが発生した後にテストプログラムに通知できるようになりました。
現在、FlaUIはUIA2とUIA3の2つの技術を使用しています。 私はUIA3を使用します。
2.利用ステップ
1. NuGetパッケージの導入
Install-Package FlaUI.UIA3 -Version 3.2.0
2.特定の人にメッセージを送信する簡単な方法を実装する
コードは以下の通り(例)。
Process[] processes = Process.GetProcessesByName("WeChat");
if (processes.Count() != 1)
{
Console.WriteLine("微信未启动或启动多个微信");
}
else
{
//1.附加到微信进程
using (var app = Application.Attach(processes.First().Id))
{
using (var automation = new UIA3Automation())
{
//2.获取主界面
var mainWindow = app.GetMainWindow(automation);
Console.WriteLine("获取主界面");
//3.切换到通讯录
var elements = mainWindow.FindAll(FlaUI.Core.Definitions.TreeScope.Subtree, TrueCondition.Default);
var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("通讯录"));
addressBook.DrawHighlight(System.Drawing.Color.Red);
var path = Debug.GetXPathToElement(addressBook);
Console.WriteLine("点击通讯录");
addressBook.Click();
//4.搜索
string target = "文件传输助手";
var searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("搜索")).AsTextBox();
searchTextBox.Click();
Keyboard.Type(target);
Keyboard.Type(VirtualKeyShort.RETURN);
Console.WriteLine("搜索目标对象");
//5.切换到对话框
Thread.Sleep(500);
var searchList = mainWindow.FindFirstDescendant(cf => cf.ByName("搜索结果"));
if (searchList != null)
{
var searchItem = searchList.FindAllDescendants().FirstOrDefault(cf => cf.Name == target && cf.ControlType == FlaUI.Core.Definitions.ControlType.ListItem);
searchItem?.DrawHighlight(System.Drawing.Color.Red);
searchItem?.AsListBoxItem().Click();
}
else
{
Console.WriteLine("没有搜索到内容");
}
Thread.Sleep(500);
//6.输入文本
string sendMsg = "这个是我微信的输入信息:" + DateTime.Now.ToString();
var msgInput = mainWindow.FindFirstDescendant(cf => cf.ByName("输入")).AsTextBox();
msgInput?.Click();
System.Windows.Forms.Clipboard.SetText(sendMsg);
Keyboard.TypeSimultaneously(new[] { VirtualKeyShort.CONTROL, VirtualKeyShort.KEY_V });
var sendBtn = mainWindow.FindFirstDescendant(cf => cf.ByName("sendBtn"));
sendBtn?.DrawHighlight(System.Drawing.Color.Red);
sendBtn?.Click();
}
}
}
コードはコメント付きで分かりやすい。
特定の人を検索し、特定の情報を送信します。解決した。
図の効果は以下の通りです

3.取得セッションリストの実装一括送信メッセージ
コードは以下の通り(例)。
Process[] processes = Process.GetProcessesByName("WeChat");
if (processes.Count() != 1)
{
Console.WriteLine("微信未启动或启动多个微信");
}
else
{
//1.附加到微信进程
using (var app = Application.Attach(processes.First().Id))
{
using (var automation = new UIA3Automation())
{
//2.获取主界面
var mainWindow = app.GetMainWindow(automation);
Console.WriteLine("获取主界面");
//3.切换到聊天目录
var elements = mainWindow.FindAll(TreeScope.Subtree, TrueCondition.Default);
var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("聊天"));
addressBook.DrawHighlight(System.Drawing.Color.Red);
var path = Debug.GetXPathToElement(addressBook);
addressBook.Click();
Console.WriteLine("切换到聊天");
Thread.Sleep(2000);
//4.获取聊天列表
//只发前六个
var count = 0;
var searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("会话")).AsListBoxItem();
while (searchTextBox != null)
{
var list = searchTextBox.FindAllChildren();
foreach (var item in list)
{
count++;
var name = item.Name;
item.Click();
var type = item.ControlType;
item.DrawHighlight(System.Drawing.Color.Red);
var MsgSend = mainWindow.FindFirstDescendant(cf => cf.ByName("输入")).AsTextBox();
var MsgSendButton = mainWindow.FindFirstDescendant(cf => cf.ByName("sendBtn"));
if (MsgSend != null && MsgSendButton != null)
{
MsgSend.Click();
System.Windows.Forms.Clipboard.SetText($"群发消息,请忽略:{DateTime.Now}");
Keyboard.TypeSimultaneously(new[] { VirtualKeyShort.CONTROL, VirtualKeyShort.KEY_V });
MsgSendButton.Click();
Console.WriteLine($"发送信息:{name}");
Thread.Sleep(500);
}
if (count == 6)
{
break;
}
}
if (count == 6)
{
break;
}
for (int i = 0; i < list.Length; i++)
{
searchTextBox.Focus();
Keyboard.Press(VirtualKeyShort.DOWN);
Thread.Sleep(100);
}
searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("会话")).AsListBoxItem();
Thread.Sleep(2000);
}
}
}
}
このコードは最初の6人に配布され、セッションに送信ボタンがない場合は送信されません。
図の効果は以下の通りです

数回録音した..。最後に、誰かが私を削除しました。
4. FlaUIがページ情報を取得する方法
FlaUinspectツールを開く

XPathアドレスは以下から確認できます。


このFlaUinspectプロジェクトはWPFプロジェクトであり、ソースコードを見てデバッグの波を追跡することができます。
ここでは、必要なコンテンツを2つの方法で取得できます。
最初のものは、以下のように、同じページの一意の名前で取得されます。
var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("聊天"));
2つ目は
上の図2のXPathアドレスで必要なコントロールを見つけることができます。
var infoData = automationElement.FindAllByXPath("/Pane/Pane[1]");
まとめまとめまとめ
一般的に、この技術はまだ非常に便利ですが、QQの低レベルの自己描画技術とQTの使用のために、JAVAレベルのアプリケーションは実現できないはずです。Microsoftの技術製品Win FromやWPFなどを対象としています。
一般的に、使用時の難易度が低下します。
例えば、このWeChatメッセージを送信するには、機能がありますが、例えば、指定された人、グループ、タイミング、タグ送信、完了した、個人のために、役割も良いです。
MAY 30,2022に変更
他のユーザーが動作しないソリューション。
このエラーを報告する場合。

可以通过,下载 https://github.com/FlaUI/FlaUI 源码,直接引用,不通过 nuget 解决这个问题。
一時的には何が原因でもない。