在这个数字化时代,远程控制和数据管理变得越来越重要。本文将介绍如何创建一个可以通过Telegram Bot控制的远程文件浏览器程序。这个程序将允许用户通过Telegram发送命令,控制目标设备上的文件系统,并接收响应。
目标是创建两个主要的程序:BotServiceApp(Bot程序)和RemoteFolderExplorer(远程文件夹浏览器程序)。Bot程序将运行在目标设备上,负责执行从控制计算机发送的命令,并提供一个界面来显示和分析数据流量。RemoteFolderExplorer程序将运行在控制计算机上,负责发送命令、接收响应,并在用户界面上显示它们。
为了更好地理解这两个程序是如何工作的,可以想象一下在设备上使用RemoteFolderExplorer程序探索特定文件夹的场景。程序将创建一个新的命令实例(一个类,其中包含一组变量),这个类将被转换成JSON格式,然后通过Telegram服务器发送给Bot。Bot程序接收到命令后,会再次将其转换成相同的类类型,然后执行命令。执行完毕后,程序将创建一个响应,将其转换成JSON格式,并发送回设备。最后,响应将在控制计算机上的RemoteFolderExplorer程序的用户界面上被翻译、分析并显示。
为了使程序工作,需要三样东西:
第一步:打开Telegram应用,在搜索栏中输入@Botfather,然后点击搜索列表中的第一个Bot。
第二步:点击Botfather后,一个新的窗口将在Telegram中打开。在这个窗口中,输入/start命令,然后所有可用的命令列表将会出现。
第三步:点击/newbot命令。BotFather会询问Bot的名称。选择Bot的名称并输入到输入框中。然后BotFather会再次询问Bot的用户名,所以输入用户名到输入框中,并记住名称必须以Bot这个词结尾。
Telegram API是一个库,它允许完全控制Telegram账户,从发送消息到接收消息,再到控制Bot。要获得控制Telegram账户的授权,必须按照以下步骤操作:
在获得了控制Bot(token)和控制Telegram账户(ID和hash)所需的信息后,可以开始编程自己的程序集。
将从编程RemoteFolderExplorer程序开始,它将发送命令,从目标计算机接收响应,并在设备上以易于理解的方式显示数据。
首先,需要在项目中安装必要的库。以下是使程序工作所需的库:
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package WTelegramClient -Version 3.5.3
NuGet\Install-Package Newtonsoft.Json -Version 13.0.3
现在可以开始编程了。首先,需要连接到Telegram服务器。以下代码将负责与Telegram建立连接:
C#
WTelegram.Client _client;
private async void Connect(int ApiID, string ApiHash, string Phone) {
_client = new WTelegram.Client(ApiID, ApiHash);
await DoLogin(Phone);
}
在上面的代码中,定义了一个新的Client类的实例,输入Telegram哈希和ID,然后尝试使用号码登录Telegram服务器。
C#
private async Task DoLogin(string loginInfo) {
string what = await _client.Login(loginInfo);
if (what != null) {
Log.Debug(what + "\n", "is required to connect with telegram Server");
return;
} else {
Log.Info("Successfully connected with telegram Server");
}
}
对于DoLogin方法,尝试使用客户端实例的登录方法连接到Telegram服务器。如果已经有一个有效的会话文件,该方法将返回null,将成功连接到TelegramAPI,否则该方法将返回缺失或所需字段的名称(最常见的值将是确认码),这个代码将在输入API ID和hash后作为Telegram消息收到。
C#
await DoLogin(Confirm_Code);
在获得确认码后,将再次使用DoLogin方法输入确认码,然后将成功连接到Telegram API。
重要的是要注意,在成功连接到Telegram后,不需要再次输入确认码,因为库将创建一个会话文件,以便在输入ID、hash和号码后自动连接到Telegram。
所以现在,已经连接到Telegram API,准备好开始了。下一步将是创建一个线程,组织传入的响应和传出的请求。类似下面的东西将完成这项工作:
public delegate void SetSignalWaitingForFile(CommandInfo Info);
public delegate void SetSignalFileIsNowAvailable(bool Error, CommandInfo Info);
public class WaitingForFileThread {
private object syncRoot = new object();
public CommandInfo CommandInfo { get; set; }
public bool SignalSet { get; set; }
public bool Error { get; set; }
public Client _client { get; set; }
public IPeerInfo TargetUser { get; set; }
public event SetSignalWaitingForFile SetSignalWaitingForFile;
public event SetSignalFileIsNowAvailable SetSignalFileIsNowAvailable;
public void StartWaitingAsync() {
lock (this.syncRoot)
ThreadPool.QueueUserWorkItem(_ => ThreadProc());
}
public void Set(bool _Error) {
lock (this.syncRoot) {
if (!this.SignalSet) {
this.SignalSet = true;
this.Error = _Error;
}
}
}
async void ThreadProc() {
Error = false;
this.SignalSet = false;
SetSignalWaitingForFile(CommandInfo);
string jsontxt = JsonConvert.SerializeObject(CommandInfo);
await _client.SendMessageAsync(TargetUser.ToInputPeer(), jsontxt);
while (!this.SignalSet) {}
if (!Error)
SetSignalFileIsNowAvailable(false, this.CommandInfo);
else
SetSignalFileIsNowAvailable(true, this.CommandInfo);
}
}
这个类将把命令转换成JSON并发送给Telegram Bot,以便稍后由目标设备进行审查。这个类还将创建一个线程,等待目标设备的响应,并在收到预期响应后触发一个事件。这个事件将负责处理响应并在应用程序上显示它。
正如已经解释的,对于Bot,创建了一个单独的程序,以便可以在目标PC上运行它。
首先,需要在项目中安装必要的库。以下是使程序工作所需的库:
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package Telegram.Bot -Version 19.0.0
NuGet\Install-Package Newtonsoft.Json -Version 13.0.3
NuGet\Install-Package System.Management -Version 7.0.2
NuGet\Install-Package SharpAESCrypt.dll -Version 1.3.4
现在可以开始编程了。首先,需要连接到Telegram服务器。下面的代码将负责连接到Telegram:
C#
async Task HandleUpdateAsync(ITelegramBotClient Client,
Update update, CancellationToken cancellationToken) {
var chatId = update.Message.Chat.Id;
try {
string msg = update.Message.Text;
if (msg == "Hi ")
await BotClient.SendTextMessageAsync(chatId, "Hello World ");
}
catch (Exception exc) {
await BotClient.SendTextMessageAsync(chatId, exc.Message);
}
}
C#
Task HandlePollingErrorAsync(ITelegramBotClient botClient,
Exception exception, CancellationToken cancellationToken) {
return Task.CompletedTask;
}
C#
.
.
.
BotClient = new TelegramBotClient(tocken_tb.Text);
var receiverOptions = new ReceiverOptions {
AllowedUpdates = Array.Empty()
};
BotClient.ReceiveAsync(
updateHandler: HandleUpdateAsync,
pollingErrorHandler: HandlePollingErrorAsync,
receiverOptions: receiverOptions,
cancellationToken: CTS.Token
);
.
.
.
在程序的结构中,大量依赖于命令模式。这将大大组织代码,并节省大量的工作。
注意:在RemoteFolderExplorer程序中,禁用了加密和解密按钮。尽管它们是完全功能的,但有时它们会触发错误,所以请自行决定是否启用它们。