Загрузка...

Отправка файлов в телеграм на базе .Net 4.0 - Без использования библиотек.

Тема в разделе C# создана пользователем r3xq1 4 май 2021. 601 просмотр

  1. r3xq1
    r3xq1 Автор темы 4 май 2021 https://t.me/DarkSoft_Extra 119 27 июл 2018
    Создаём класс: MultipartFormBuilder.cs

    Код
    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

    Код
    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

    Код
    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); // Для получения ответа...
    }
    }
    }
    Дополнительную информацию по отправке данных можете посмотреть тут
     
  2. Ljopv91rdewr
    Ljopv91rdewr 4 май 2021 449 4 май 2019
    ты просто мастер все усложнять, видимо миллион классов и кода для тебя это не говнокод
    --- Сообщение объединено с предыдущим 4 май 2021
    а ты спиздил с гита XD
     
  3. r3xq1
    r3xq1 Автор темы 4 май 2021 https://t.me/DarkSoft_Extra 119 27 июл 2018
    Возьми да напиши проще, в чём проблема? Это лишь пример, код можно и упростить по желанию. И я мастер всё упрощать :cool_bun:
     
    1. Ljopv91rdewr
      r3xq1, прасти пажалуста я нуб(
  4. CoderVir
    бляд. Много кода. Способы проще есть. Через обычный HttpWebClient
     
  5. r3xq1
    r3xq1 Автор темы 5 май 2021 https://t.me/DarkSoft_Extra 119 27 июл 2018
    .Net 4.0 Алло. Естественно можно проще сделать на других платформах.
     
  6. Abraxuy
    Abraxuy 6 май 2021 Пишу софт -> zelenka.guru/threads/2251063 16 11 апр 2019
    1. r3xq1 Автор темы
      Abraxuy, ещё один "умник", в коде ссылка даже есть на эти классы, специально для таких оставил. алло!
  7. gpt
    все капец капец капец капец капец стока кода стока кода а зачем
     
Загрузка...
Top