我想在c#2013中用我的机器人向频道发送消息和照片,但我';获取远程服务器时返回错误:(400)请求错误

我想在c#2013中用我的机器人向频道发送消息和照片,但我';获取远程服务器时返回错误:(400)请求错误,c#,api,telegram-bot,C#,Api,Telegram Bot,我想在c#2013年用我的机器人向频道发送消息和照片。 信息和照片应放在一个盒子里发送。照片在上面的消息 我可以成功向频道发送消息,但存在两个问题: 发送照片时,此错误显示: 远程服务器返回错误:(400)请求错误 我无法在一次发送中同时发送文字和照片 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usi

我想在c#2013年用我的机器人向频道发送消息和照片。 信息和照片应放在一个盒子里发送。照片在上面的消息

我可以成功向频道发送消息,但存在两个问题:

  • 发送照片时,此错误显示:
  • 远程服务器返回错误:(400)请求错误

  • 我无法在一次发送中同时发送文字和照片
  • 代码:

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Windows.Forms;
        using Telegram.Bot;
        using Telegram.Bot.Types;
        using System.Net;
    
        namespace SendTxt-Photo
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }
             string  Token = "adasdsadsadsadasds";
              string  channel_id = "@BestLaptop";
    
                private void Form1_Load(object sender, EventArgs e)
                {
    
                }
    
    
      private void button1_Click(object sender, EventArgs e)
            {
    
             using (var stream = File.Open(@"image/1.jpg", FileMode.Open))
              {
               WebRequest req = WebRequest.Create("https://api.telegram.org/bot" + Token + "/sendMessage?chat_id=" + channel_id + "&text=" + textbox1.text);
                           req.UseDefaultCredentials = true;
              WebRequest req1 = WebRequest.Create("https://api.telegram.org/bot" + Token + "/sendPhoto?chat_id=" + channel_id + "&Photo=" + stream );
                           req.UseDefaultCredentials = true;
                           req1.UseDefaultCredentials = true;
    
                            var result = req.GetResponse();
                            req.Abort();
    
                             var result1 = req1.GetResponse();
                            req1.Abort();
    
    
                    }
    
                }
            }
        }
    

    首先您必须知道您发送的是
    …&photo=Sistem.IO.FileStream
    。这是错误请求的根本原因。请看一下调试

    在第二个中可以看到,在
    sendPhoto
    方法中提供了三种类型的
    photo
    参数:

    将文件id作为字符串传递以发送电报服务器上存在的照片(推荐),将HTTP URL作为字符串传递给电报以从Internet获取照片,或使用多部分/表单数据上载新照片

    因此,在您的案例中需要使用
    multipart/formdata
    。它可以通过使用这样的示例来简化(代码由生成,尚未测试):

    在第三个位置您不能在一条消息中发送文字上方的照片。要在一条消息中发送文本和照片,请使用
    sendPhoto
    方法的
    caption
    参数。它提供200个符号长度


    PS为什么不使用nuget软件包?

    首先您必须知道您发送的是
    …&photo=Sistem.IO.FileStream
    。这是错误请求的根本原因。请看一下调试

    在第二个中可以看到,在
    sendPhoto
    方法中提供了三种类型的
    photo
    参数:

    将文件id作为字符串传递以发送电报服务器上存在的照片(推荐),将HTTP URL作为字符串传递给电报以从Internet获取照片,或使用多部分/表单数据上载新照片

    因此,在您的案例中需要使用
    multipart/formdata
    。它可以通过使用这样的示例来简化(代码由生成,尚未测试):

    在第三个位置您不能在一条消息中发送文字上方的照片。要在一条消息中发送文本和照片,请使用
    sendPhoto
    方法的
    caption
    参数。它提供200个符号长度


    PS为什么不使用nuget软件包?

    此功能可帮助上传文件:

            public static string UploadFilesToRemoteUrl(HttpWebRequest request, string[] files, NameValueCollection formFields = null)
        {
            string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
    
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.Method = "POST";
            request.KeepAlive = true;
    
            Stream memStream = new System.IO.MemoryStream();
    
            var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                    boundary + "\r\n");
            var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                        boundary + "--");
    
    
            string formdataTemplate = "\r\n--" + boundary +
                                        "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
    
            if (formFields != null)
            {
                foreach (string key in formFields.Keys)
                {
                    string formitem = string.Format(formdataTemplate, key, formFields[key]);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                    memStream.Write(formitembytes, 0, formitembytes.Length);
                }
            }
    
            string headerTemplate =
                "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
                "Content-Type: application/octet-stream\r\n\r\n";
    
            for (int i = 0; i < files.Length; i++)
            {
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                var header = string.Format(headerTemplate, "photo", files[i]);
                var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
    
                memStream.Write(headerbytes, 0, headerbytes.Length);
    
                using (var fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
                {
                    var buffer = new byte[1024];
                    var bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        memStream.Write(buffer, 0, bytesRead);
                    }
                }
            }
    
            memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            request.ContentLength = memStream.Length;
    
            using (Stream requestStream = request.GetRequestStream())
            {
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            }
    
            using (var response = request.GetResponse())
            {
                Stream stream2 = response.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                return reader2.ReadToEnd();
            }
        }
    

    此功能用于帮助上载文件:

            public static string UploadFilesToRemoteUrl(HttpWebRequest request, string[] files, NameValueCollection formFields = null)
        {
            string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
    
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.Method = "POST";
            request.KeepAlive = true;
    
            Stream memStream = new System.IO.MemoryStream();
    
            var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                    boundary + "\r\n");
            var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                        boundary + "--");
    
    
            string formdataTemplate = "\r\n--" + boundary +
                                        "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
    
            if (formFields != null)
            {
                foreach (string key in formFields.Keys)
                {
                    string formitem = string.Format(formdataTemplate, key, formFields[key]);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                    memStream.Write(formitembytes, 0, formitembytes.Length);
                }
            }
    
            string headerTemplate =
                "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
                "Content-Type: application/octet-stream\r\n\r\n";
    
            for (int i = 0; i < files.Length; i++)
            {
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                var header = string.Format(headerTemplate, "photo", files[i]);
                var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
    
                memStream.Write(headerbytes, 0, headerbytes.Length);
    
                using (var fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
                {
                    var buffer = new byte[1024];
                    var bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        memStream.Write(buffer, 0, bytesRead);
                    }
                }
            }
    
            memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            request.ContentLength = memStream.Length;
    
            using (Stream requestStream = request.GetRequestStream())
            {
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            }
    
            using (var response = request.GetResponse())
            {
                Stream stream2 = response.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                return reader2.ReadToEnd();
            }
        }
    

    我可以成功上传pic,但不使用本地pic。若要将照片作为文件发送,您需要使用多部分/表格数据以通过浏览器上载文件的常用方式发布数据。我可以成功上传pic,但不使用本地pic。若要将照片作为文件发送,您需要使用多部分/表格数据以文件的常用方式发布数据通过浏览器上传。dear@anatol:使用电报。bot nuget程序包:d。请回答此链接中的问题,thansk@anatol:dear@anatol:使用电报。bot nuget程序包:d。请回答此链接中的问题,thansk@anatol:
                    string filePath = msg.GetParam("photo");
                string URL = "https://api.telegram.org/bot" + msg.GetParam("bot_id") + "/sendPhoto";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
                WebProxy myProxy = new WebProxy(msg.GetParam("proxy"));
                myProxy.UseDefaultCredentials = true;
                request.Proxy = myProxy;
    
                string[] variable_name = {filePath};
                NameValueCollection form = new NameValueCollection();
                form["chat_id"] = msg.GetParam("chat_id");
                form["caption"] = msg.GetParam("caption");
                UploadFilesToRemoteUrl(request, variable_name, form);