C#中的Telegram Bot自定义键盘

时间:2016-01-20 12:05:44

标签: c# bots telegram telegram-bot

我尝试使用自定义键盘创建消息。所以我发送请求

reply_markup = {"keyboard":[["1"],["2"]],"resize_keyboard":"True","one_time_keyboard":"True"}

但是,它不起作用。

我尝试了所有内容类型:

  1. application / x-www-form-urlencoded(默认创建消息 键盘)
  2. application / json(使用默认键盘创建消息)
  3. multipart / form-data(尽管this Post
  4. ,但根本不起作用

    我还试图通过两种不同的方式发送消息。这段代码错误吗?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Net;
    
    namespace DutyReminder
    {
    class Program
    {
        static void Main(string[] args)
        {
    
            string message = "message";
            string message1 = "message1";
            string botid = "165749848:AAGtjn42bajF-WxdKosTF07sLwJPYlqiDZE";
            string chatid = "38651047";
    
            Sender.send("", "https://api.telegram.org/bot" + botid + "/sendmessage?chat_id=" + chatid + "&text=" + message + "&reply_markup={\"keyboard\":[[\"1\"],[\"2\"]],\"resize_keyboard\":\"True\",\"one_time_keyboard\":\"True\"}");
            Sender.HttpPost("https://api.telegram.org/bot" + botid + "/sendmessage?chat_id=" + chatid + "&text=" + message1 + "&reply_markup={\"keyboard\":[[\"1\"],[\"2\"]],\"resize_keyboard\":\"True\",\"one_time_keyboard\":\"True\"}", "");
    
        }
    }
    
    static class Sender
    {
        static public void send(string message, string url)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create(url);
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //string postData = "{\"value1\":\"" + message + "\"}";
            string postData = message;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            //  request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    
    
        static public string HttpPost(string URI, string Parameters)
        {
            System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
          //  req.Proxy = new System.Net.WebProxy(ProxyString, true);
            //Add these, as we're doing a POST
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            //We need to count how many bytes we're sending. Post'ed Faked Forms should be name=value&
            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
            req.ContentLength = bytes.Length;
            System.IO.Stream os = req.GetRequestStream();
            os.Write(bytes, 0, bytes.Length); //Push it out there
            os.Close();
            System.Net.WebResponse resp = req.GetResponse();
            if (resp == null) return null;
            System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
            return sr.ReadToEnd().Trim();
        }
    
    }
    }
    

4 个答案:

答案 0 :(得分:5)

使用以下代码而不是URI消息发送:

var bot = new Api("YourApiToken");
.
.
.

var rmu = new ReplyKeyboardMarkup();

rmu.Keyboard =
    new string[][]
    {
        new string[] {"1-1", "1-2"},
        new string[] {"2"},
        new string[] {"3-1", "3-2" , "3-3" }
    };

await bot.SendTextMessage(update.Message.Chat.Id, msg, false, 0, rmu);


<强>已更新
使用较新版本的API:

var bot = new Api("YourApiToken");
.
.
.

var rkm = new ReplyKeyboardMarkup();

rkm.Keyboard = 
    new KeyboardButton[][]
    {
        new KeyboardButton[]
        {
            new KeyboardButton("1-1"),
            new KeyboardButton("1-2")
        },

        new KeyboardButton[]
        {
            new KeyboardButton("2")
        },

        new KeyboardButton[]
        {
            new KeyboardButton("3-1"),
            new KeyboardButton("3-2"),
            new KeyboardButton("3-3")
        }
    };

await bot.SendTextMessage(update.Message.Chat.Id, msg, false, false, 0, rkm );

答案 1 :(得分:0)

您可以动态创建键盘。

var rkm = new ReplyKeyboardMarkup();
var rows = new List<KeyboardButton[]>();
var cols = new List<KeyboardButton>();
for (var Index = 1; Index < 17; Index++)
{
    cols.Add(new KeyboardButton("" + Index));
    if (Index%4 != 0) continue;
    rows.Add(cols.ToArray());
    cols = new List<KeyboardButton>();
}
rkm.Keyboard = rows.ToArray();


await botClient.SendTextMessageAsync(
    message.Chat.Id,
    "Choose",
    replyMarkup: rkm);

enter image description here

答案 2 :(得分:0)

下面的更新代码

public static class KeyboardHelper
{
        public static ReplyKeyboardMarkup GetKeyboard(List<string> keys)
        {
            var rkm = new ReplyKeyboardMarkup();
            var rows = new List<KeyboardButton[]>();
            var cols = new List<KeyboardButton>();
            foreach (var t in keys)
            {
                cols.Add(new KeyboardButton(t));
                rows.Add(cols.ToArray());
                cols = new List<KeyboardButton>();
            }
            rkm.Keyboard = rows.ToArray();
            return rkm;
        }
}

答案 3 :(得分:0)

List<string> items = new List<string>();

items.Add("A");
items.Add("B");
items.Add("C");
items.Add("D");
items.Add("E");                               
                                  

var rkm = new ReplyKeyboardMarkup();
var rows = new List<KeyboardButton[]>();
var cols = new List<KeyboardButton>();   
for (var Index = 1; Index < items.Count+1; Index++)
{
   cols.Add(new KeyboardButton("" + items[Index-1]));
   if (Index % 4 != 0) continue;
   rows.Add(cols.ToArray());
   cols = new List<KeyboardButton>();

}
    
if (cols.Count > 0) {rows.Add(cols.ToArray());}

rkm.Keyboard = rows.ToArray();
await Bot.SendTextMessageAsync(message.Chat.Id,"Choose",replyMarkup: rkm);