目录
介绍
第一个程序是Bot(BotServiceApp),它的任务是实现将从控制计算机发送的命令。它将配备一个界面来显示和分析数据流量。此程序应在目标设备上运行。
程序API(RemoteFolderExplorer)将在控制计算机上运行。该程序的任务是发送命令、接收响应并分析它们,以便在用户界面上显示它们。
为了便于理解工作机制,我制作了下图:
假设我们正在探索设备上资源管理器程序中的特定文件夹。在这里,程序将创建一个新的命令实例(在类中汇总的一组变量),并且该类将被转换为JSON。然后,该命令将通过Telegram服务器发送到Telegram机器人。此时,Bot程序接收命令并将其再次转换为与转换该命令相同的类。然后,该命令将在目标计算机上执行。之后,程序将创建一个响应并将其转换为JSON,并将其发送回我们的设备。最后,它将被翻译和分析,并显示在控制计算机的浏览器程序的用户界面上。
为了让我们的Program工作,我们需要三件事:
- 创建一个以从中发送或接收命令的Telegram Bot
- 我们创建的Bot令牌
- API ID和API Hash,使我们能够将API与服务器连接
在本文中,我们将学习如何获得所有这些。
让我们开始吧。
创建Telegram Bot并获取其Token
第一步
打开你的telegram。在搜索字段中,键入@Botfather,然后单击搜索列表中的第一个Bot,如图所示:
第二步
单击Botfather后,将在Telegram中打开一个新窗口,如下所示:
在此窗口中,在输入字段中输入启动命令,如下所示,然后将出现所有可用命令的列表,如下图所示:
第三步
单击命令/newbot。BotFather现在将询问您Bot的姓名。选择Bot名称并将其放入输入字段中。然后Bot Father会再次询问Bot的用户名,所以将用户名放在输入字段中,不要忘记名称必须以单词Bot结尾。
步骤如下所示:
创建Telegram API
定义:它是一个库,使我们能够完全控制我们的Telegram帐户,从发送消息到接收消息再到控制我们的机器人。
获得控制我们Telegram帐户的授权: 为了能够获得控制您的Telegram帐户的授权,您必须按照以下步骤操作:
- 我们打开以下链接 https://my.telegram.org/apps。我们输入我们的号码,然后单击“下一步”,然后一条消息将到达我们的Telegram帐户,其中包含确认码。然后,我们将代码放入输入字段中,然后单击下一步。
- 我们进入面板创建自己的Telegram应用程序,如下图所示:
现在我们需要填写第一个和第二个字段,指向桌面平台,单击创建应用程序,然后会出现一个新窗口,其中包含我们的ID和hash。
创建资源管理器程序
在我们获得了控制Bot(令牌)和控制我们的Telegram帐户(ID和hash)的必要信息后,我们就可以开始编写我们自己的程序集了。
我们将首先对资源管理器程序进行编程,该程序将发送命令,接收来自目标计算机的响应,并在我们的设备上以易于理解的方式显示数据。
首先,我们需要在项目中安装必要的库。要使我们的程序正常工作,需要以下库:
- WTelegramClient
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package WTelegramClient -Version 3.5.3
- Newtonsoft.Json
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package Newtonsoft.Json -Version 13.0.3
现在我们准备开始编程了。首先,我们需要连接到Telegram服务器。以下代码将负责Telegram与以下人员建立连接:
.
.
.
WTelegram.Client _client;
.
.
private async void Connect(int ApiID, string ApiHash, string Phone) {
_client = new WTelegram.Client(ApiID, ApiHash);
await DoLogin(Phone);
}
在上面的代码中,我们定义了一个新的Client类实例作为输入,我们输入了telegram hash,telegram ID,然后,我们尝试在Telegram服务器中使用我们的号码登录。
private async Task DoLogin(string loginInfo) {
string what = await _client.Login(loginInfo);
if (what != null) {
Log.Debug(what + ", , is required to connect with telegram Server ");
return;
} else {
Log.Info( " successfully connected with telegram Server ");
}
}
对于该DoLogin方法,我们尝试使用客户端实例中的登录方法与Telegram服务器连接。如果我们已经有一个有效的会话文件,该方法将返回null并且我们将成功与Telegram API连接,否则该方法将返回名称,如果缺少或必填字段(最常见的值将是确认代码),并且此代码将在您输入API ID和hash后得到Telegram消息。
await DoLogin(Confirm_Code);
得到确认码后,我们将再次使用该DoLogin方法输入确认码,然后,我们将成功与Telegram API连接。
需要注意的是,在我们成功连接Telegram后,我们不需要再次输入确认码,因为库会在输入我们的ID、hash和我们的号码后创建一个会话文件,用它来自动连接电报。
所以现在,我们已经连接了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,我们创建一个单独的程序,以便我们可以在目标PC上运行它。
首先,我们需要在项目中安装必要的库。
- Telegram.Bot
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package Telegram.Bot -Version 19.0.0
- Newtonsoft.Json
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package Newtonsoft.Json -Version 13.0.3
- System.Management
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package System.Management -Version 7.0.2
- SharpAESCrypt.dll
使用Paket-Manager-Console,输入以下命令:
NuGet\Install-Package SharpAESCrypt.dll -Version 1.3.4
现在我们可以开始编程了。首先,我们需要连接到Telegram服务器。下面的代码负责连接到Telegram。请记住,我们现在使用的是Bot API,而不是Telegram使用的API。
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);
}
}
Task HandlePollingErrorAsync(ITelegramBotClient botClient,
Exception exception, CancellationToken cancellationToken) {
return Task.CompletedTask;
}
.
.
.
BotClient = new TelegramBotClient(tocken_tb.Text);
var receiverOptions = new ReceiverOptions {
AllowedUpdates = Array.Empty <updatetype>()
};
BotClient.ReceiveAsync(
updateHandler: HandleUpdateAsync,
pollingErrorHandler: HandlePollingErrorAsync,
receiverOptions: receiverOptions,
cancellationToken: CTS.Token
);
.
.
. </updatetype>
在程序的结构中,我们严重依赖命令模式。这将极大地组织我们的代码并节省我们大量的工作。
注意:在资源管理器程序中,我禁用了加密和解密按钮。尽管它们功能齐全,但有时它们会触发错误,因此请自行决定是否启用它们。
https://www.codeproject.com/Articles/5367312/Remote-Folder-Explorer-in-Csharp-with-Telegram-API