我想在c#2013中用我的机器人向频道发送消息和照片,但我';获取远程服务器时返回错误:(400)请求错误
我想在c#2013年用我的机器人向频道发送消息和照片。 信息和照片应放在一个盒子里发送。照片在上面的消息 我可以成功向频道发送消息,但存在两个问题:我想在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
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);