2016-01-20 11 views
6

Ich versuche, Nachricht mit benutzerdefinierten Tastatur zu erstellen. So sende ich Anfrage mitTelegram Bot benutzerdefinierte Tastatur in С #

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

Aber es funktioniert nicht.

Ich habe versucht, alle Content-Types:

  1. application/x-www-form-urlencoded (erstellen Nachricht mit Standard Tastatur)
  2. application/json (create-Nachricht mit Standardtastatur)
  3. multipart/form-data (gar nicht arbeiten, trotz this Post)

ich habe auch versucht Nachricht verschiedene Möglichkeiten, um 2 zu senden. Wats falsch mit diesem Code?

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(); 
    } 

} 
} 
+0

Welche Fehler haben Sie bekommen ? Möglicherweise sollten Sie try-catch-Blocks zu Ihrem Code hinzufügen, um eine detaillierte Fehlermeldung zu erhalten. –

+0

Es gibt keine Fehler, aber es gibt keine benutzerdefinierte Tastatur auch http://f6.s.qip.ru/echeYY9.png scheint, dass Telegramm ignorieren reply_markup Parameter. – Grisha

+0

Also welche Antwort bekommen Sie? Ich denke, die erste Frage ist, gibt es ein Kommunikationsproblem oder ein Kommandoproblem. –

Antwort

5

Verwenden Sie den folgenden anstelle von URI-Nachricht zu senden:

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); 


AKTUALISIERT
Mit der neueren Version von 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); 
+0

Danke, für Ihre Antwort! Welchen Rahmen verwenden Sie? – Grisha

+0

@Grisha, Just in' Nuget' Typ ' Install-Paket Telegramm.Bot' –

+0

@SiyavashHamdi: http://StackOverflow.com/Questions/39884961/Create-dynamic-keyboard-telegram-Bot-in-C-sharp-Mrroundrobin-api –

Verwandte Themen