ساخت ربات تلگرامی با #C
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: چهار دقیقه

 با رشد دنیای تکنولوژی، وسائل هوشمند همراه نیز به سرعت پیشرفته‌تر شدند. در این میان با گسترش زیرساخت اینترنت، رشد شبکه‌های اجتماعی نیز چشمگیر بوده است. یکی از بهترین این‌ها، شبکه‌های تلگرام می‌باشد که با بهره گیری از سرورهای ابری، امنیت و سرعت را برای کاربران به ارمغان آورده است.
چندی پیش موسسان تلگرام با معرفی API‌های کاربردی، به توسعه کنندگان اجازه دادند که با بهره گیری از بستر این شبکه، اقدام به تولید اینترفیسی به اسم بات کنند که با دریافت دستورات سفارشی، عملیات خاصی را انجام دهد.
در واقع تلگرام و متدهای ارائه شده، یک راه ارتباطی بین کاربران و برنامه‌های تولید شده را ایجاد کردند که با قدری ذوق و سلیقه، شاهد بات‌های جالب و کاربردی هستیم.
در این مقاله سعی شده طرز تهیه یک بات با زبان #C توضیح داده شود.
در ابتدا شما باید توسط یکی از بات‌های اصلی تلگرام اقدام به ثبت نام کاربری و تنظیمات بات مورد نظر خودتان نمایید. بات مورد نظر @BotFather می‌باشد که با شروع مکالمه می‌توان با فرستادن دستورات مختلف تنظیمات مختلفی را انجام داد. با شروع مکالمه با بات مورد نظر با دستور /start دستورات زیر قابل انجام می‌باشد:

 You can control me by sending these commands :

/ newbot - create a new bot

/ token - generate authorization token

/ revoke - revoke bot access token

/ setname - change a bot's name

/ setdescription - change bot description

/ setabouttext - change bot about info

/ setuserpic - change bot profile photo

/ setcommands - change bot commands list

/ setjoingroups - can your bot be added to groups ?

/ setprivacy - what messages does your bot see in groups ?

/ deletebot - delete a bot

/ cancel - cancel the current operation
با انجام دستور /newbot در ابتدا نام بات و یوزنیم (دقت کنید یوزرنیم می‌بایست حتما به کلمه‌ی bot ختم شود) را تنظیم کنید.
بعد از تایید نام و یوزر نیم، به شما یک توکن اختصاص داده می‌شود که توسط آن شما شناسایی می‌شوید.
در اینجا شما می‌توانید تنظیمات اضافه‌تری مانند عکس برای پروفایل و غیره را نیز تنظیم کنید.
در مرحله‌ی بعد می‌توانید در همین قسمت دستورات مورد نظر را جهت بات خود تنظیم کنید. برای این کار باید دستور /setcommands را وارد کنید و دستور مورد نظر خود را به فرمت command1 – Description وارد کنید.
مرحله‌ی بعد، تنظیمات برنامه‌ی شما جهت دریافت دستورات وارد شده و انجام عملیات مورد نظر و تولید و ارسال خروجی مورد نظر است.

دریافت دستورات به دو طریق انجام می‌شود:
1. توسط دستور getUpdates می‌توان تمامی کامندهای دریافتی را از سرور تلگرام دریافت کرد و با انجام پروسس‌های لازم، خروجی را به کاربر مورد نظر ارسال کرد.
2. توسط تابع webhook از تلگرام درخواست کرد در صورت دریافت دستور جدید به بات، این دستور را به یک آدرس خاص ارسال کرد.

قابل توجه است که می‌توان فقط از یکی از دو روش فوق استفاده کرد. همچنین در روش دوم حتما سرور مورد نظر باید گواهی ssl تایید شده داشته باشد.
کد زیر دریافت کامندهای یک بات به روش اول می‌باشد :
public class mydata
    {
        public result[] result;
    }
    public class result
    {
        public int update_id { get; set; }
        public message message { get; set; }
    }
    public class message
    {
        public int message_id { get; set; }
        public message_from from { get; set; }
        public message_chat chat { get; set; }
        public int date { get; set; }
        public string text { get; set; }
    }
    public class message_from
    {
        public int ind { get; set; }
        public string first_name { get; set; }
        public string username { get; set; }
    }
    public class message_chat
    {
        public int id { get; set; }
        public string first_name { get; set; }
        public string username { get; set; }
    }
 
public  Void GetUpdates()
        {
 
            WebRequest req = WebRequest.Create("https://api.telegram.org/bot" + yourToken + "/getUpdates");
            req.UseDefaultCredentials = true;
            WebResponse resp = req.GetResponse();
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            sr.Close();
            var jobject = Newtonsoft.Json.Linq.JObject.Parse(s);
            mydata gg = JsonConvert.DeserializeObject<mydata>(jobject.ToString());
            List<result> results = new List<result>();
            foreach (result rs in gg.result)
            {
                results.Add(rs); 
                SendMessage(rs.message.chat.id.ToString(), "hello"+" "+"Dear"+rs.message.chat.first_name); 
            }             
        }
و توسط تابع زیر می‌توان به کاربری که به بات کامند ارسال کرد، پاسخ داد:
public static void SendMessage(string chat_id, string message)
        {
            WebRequest req = WebRequest.Create("https://api.telegram.org/bot" + youToken + "/sendMessage?chat_id=" + chat_id + "&text=" + message);
            req.UseDefaultCredentials = true;
 
            var result = req.GetResponse();
            req.Abort();
        }

لازم به ذکر است خروجی توابع بات‌های تلگرام با فرمت JSON می‌باشد که با نصب پکیج NewTonsoft می‌توان آن را به لیست تبدیل کرد.
rs.message.chat.id، آی دی فردی است که به بات تلگرامی ما مسیج ارسال کرده است.
rs.message.chat.first_name نام فردی است که به بات تلگرام مسیج ارسال کرده است.
همچنین می‌توان در جواب کامند بات، علاوه بر متن، صدا و تصویر را نیز ارسال نمود .

در این لینک و این لینک می‌توان توضیحات بیشتری را در این زمینه مطالعه کرد.
در انتها خوشحال می‌شوم ذوق‌ها و ایده‌های شما را در ساخت بات‌ها با آیدی @iekhtiari مشاهده کنم.
  • #
    ‫۹ سال و ۲ ماه قبل، سه‌شنبه ۶ مرداد ۱۳۹۴، ساعت ۱۷:۵۸
    من نمیدونم chat_id  چی هست . همه کارها رو انجام دادم و با زبان پی اچ پی نوشتم .
    اما در چت آی دی همش به مشکل میخورم
    لینکی که ارسال میکنم  :
    https://api.telegram.org/bot72988154:AAFRbBFec9guVnt8Hq0STMFNyfnKQrPZNwk/sendMessage?text=message&chat_id=72988154%27

    و خطای دریافتی :

    {"ok":false,"error_code":403,"description":"Error: Bot can't send messages to bot"}  
      چت آی دی باید چی باشه؟
    • #
      ‫۹ سال و ۲ ماه قبل، سه‌شنبه ۶ مرداد ۱۳۹۴، ساعت ۲۳:۴۲
      chat_id شناسه گروه یا کاربر است.
      به این لینک (jadibot ) مراجعه کنید.
      • #
        ‫۹ سال و ۲ ماه قبل، چهارشنبه ۷ مرداد ۱۳۹۴، ساعت ۰۲:۱۸
        اینو متوجه شدم .. اما چه شکلی میشه پیدا کرد؟
        فزض کنید من 10 شماره دارم میخوام براشون مثل تبلیغات اس ام اسی پیام بدم .. چجوری این امکان هست؟
        فکر کنم از متودهای خود تلگرام باید بشه
        • #
          ‫۹ سال و ۲ ماه قبل، چهارشنبه ۷ مرداد ۱۳۹۴، ساعت ۰۵:۳۴
          این شناسه رو باید از قبل بدونید، میتونید از پیغامهایی که قبلا براتون ارسال شده استخراج کنید. تو مستندات Bot API من چیزی برا استخراج این شماره ندیدم.
  • #
    ‫۹ سال و ۲ ماه قبل، چهارشنبه ۱۴ مرداد ۱۳۹۴، ساعت ۱۵:۵۱
    سلام؛ ممنون از مطلب خوبتون. چرا متود /getUpdates  هر بار که صدا زده میشه تمام پیغام‌ها را بر میگردونه ؟ چی کار میشه کرد که پیغام‌های پاسخ داده نشده را بیاره ؟  
    • #
      ‫۹ سال و ۱ ماه قبل، جمعه ۳۰ مرداد ۱۳۹۴، ساعت ۲۲:۰۵
      سلام؛ یک ورودی به نام offset داره که از پیامهای قبلی می‌گیری و بهش تو دفعه بعد که خواستی getupdate کنی پاس میدین

  • #
    ‫۹ سال و ۲ ماه قبل، چهارشنبه ۱۴ مرداد ۱۳۹۴، ساعت ۱۷:۴۳
    چطور میشه ارسال عکس داشت؟ من هر چقدر تلاش کردم پیغام
    Additional information: The remote server returned an error: (502) Bad Gateway.
    رو میده
    ممنون میشم راهنماییم کنید
    یاعلی
  • #
    ‫۹ سال و ۱ ماه قبل، شنبه ۲۴ مرداد ۱۳۹۴، ساعت ۱۶:۴۴
    سلام
    چگونه با استفاده از متود Send Documeny فایل از کامپیوتر خودم دانلود کنم ؟

    • #
      ‫۹ سال و ۱ ماه قبل، شنبه ۳۱ مرداد ۱۳۹۴، ساعت ۱۹:۳۲
      من الان یه مشکلی که دارم اینه که وقتی با متود send document فایل را برای شخص می‌فرستم اگر حجم فایل بالا باشه در برخی مواقع با خطا روبرو میشم چی کار باید بکنم ؛ خطا در خط زیر اتفاق می‌افته 
        using (var client = new HttpClient()) 
      ....
      ....
      using (var response = await client.SendAsync(httpMessage).ConfigureAwait(false))
      • #
        ‫۹ سال و ۱ ماه قبل، شنبه ۳۱ مرداد ۱۳۹۴، ساعت ۱۹:۵۴
        یکی از خاصیت‌های HttpClient تایم آوت هست (TimeOut).
        • #
          ‫۹ سال و ۱ ماه قبل، یکشنبه ۱ شهریور ۱۳۹۴، ساعت ۱۴:۰۰
          سلام من قبلا این 2 خط را اضافه کردم ولی تاثیری نداشته
          client.DefaultRequestHeaders.ExpectContinue = false;
          client.Timeout = TimeSpan.FromMilliseconds(150000);
          چجوری میشه کاری کرد تا زمانی که خطا میده کد مدام تکرار بشه ؟
  • #
    ‫۹ سال و ۱ ماه قبل، شنبه ۳۱ مرداد ۱۳۹۴، ساعت ۰۴:۳۳
    سلام تشکر میکنم از مطلب مفیدتون ، چطور میتونم 2 تا آیتم به کاربر ارسال کنم و اون یک مورد رو انتخاب کنه؟
  • #
    ‫۹ سال قبل، شنبه ۲۸ شهریور ۱۳۹۴، ساعت ۱۷:۱۹
    سلام از مطلب مفیدتون ممنونم، ایا امکان استفاده از شماره موبایل به جای chat_id در بات تلگرامی هستش؟ 
  • #
    ‫۸ سال و ۴ ماه قبل، چهارشنبه ۲۹ اردیبهشت ۱۳۹۵، ساعت ۱۸:۰۹
    با تشکر از این مطلب مفید. بنده هم چند روز پیش سری به مستندات تلگرام زدم و یه ربات با تمام قابلیت هاش طراحی کردم. در این مورد نکات کلی هست که انشاله مورد استفاده قرار بگیره.
    برای ایجاد ربات بهتره با کتابخانه پیشنهادی خود تلگرام کار کنید.(اینجا ) و یا اون رو از طریق Nuget دریافت کنید.
    pm> Install-Package Telegram.Bot
    درمورد دو روش کار با ربات باید بدونید که روش getUpdate فقط برای تست کردن پاسخگویی ربات بهتره استفاده بشه و اگراصرار به استفاده از این حالت دارید ربات شما نمیتونه به چندین کاربر پاسخ بده چون طبق این روش در هر لحظه برای  مثال 10 آپدیت دریافت میشه این آپدیت‌ها همون درخواست‌های کاربرا هستن پس درخواست یازدهم باید صبر کنه تا 10 درخواست اول پاسخ داده بشن. حل شد؟
    روش اصلی که شما برای ربات باید استفاده کنید همون Webhook هست اما این هم نکاتی داره. طبق قواعد تلگرام برای استفاده از این روش باید حتما ssl روی دامنه شما فعال باشه و شما هم باید یه وب سرویس برای پاسخگویی به درخواست‌ها پیاده کنید.
    برای دریافت ssl رایگان میتونید از CloudFlare استفاده کنید که اگر بگردید آموزش هاش هست و کار راحتیه
    برای پیاده سازی وب سرویس اون هم با Web Api  میتونید از این مثال استفاده کنید.
    حالا بعد از اینکه ربات رو توی حالت getupdate طراحی و تست کردید میتونید اون رو به حالت webhook منتقل کنید.
    نکته ای هم که وجود داره اینه که شما نمیتونید به طور همزمان برای یک ربات هم از webhook و هم از getupdate استفاده کنید !
    پس برای زمانی که ربات رو در حالت webhook منتشر کردید ولی دوباره نیاز به تست و دیباگ دارید و میخواید از getupdate استفاده کنید باید حتما حالت webhook  رو با استفاده از فراخوانی api زیر غیر فعال کنید (داخل آدرس بار مرورگر).
    https://api.telegram.org/bot[bot-token]/setwebhook
    به جای [bot-token]  باید توکن ربات خودتون رو بذارید.
    بعد دوباره برای فعال کردن webhook میتونید فراخوانی زیر رو داشته باشید.
    https://api.telegram.org/bot[bot-token]/setwebhook?url=https://yourdomain.example/api/webhook  
    • #
      ‫۷ سال و ۹ ماه قبل، دوشنبه ۶ دی ۱۳۹۵، ساعت ۱۸:۴۳
      سلام  . دو تا مشکل دارم :
      1. اینکه نمیدونم چرا برخی از پیامهای دریافتی null هستش و بخاطر همین نال بودن rs.message برنامه میفته تو catch  . چطوری نال رو رد کنم ؟
      2. وقتی از متد آپدیت استفاده میکنم وقتی داخل یک حلقه قرارش میدم همینطوری هر بار که حلقه شروع میشه میاد هرچی پیام قبلا توسط کاربر به بات فرستاده شده رو میگیره در آرایه ش میریزه و باز پاسخ میده و وقتی هم که پیام جدید واسش میاد نمیتونه به لیستش اضافه کنه .  
      protected void Page_Load(object sender, EventArgs e)
              {
                  long offset = 0;
                  var Bot = new Telegram.Bot.TelegramBotClient("Token");
                  int whilecount = 0;
                  while (true)
                  {
                     
                      WebRequest req = WebRequest.Create("https://api.telegram.org/bot" + "Token" + "/getUpdates");
                      req.UseDefaultCredentials = true;
                      WebResponse resp = req.GetResponse();
                      Stream stream = resp.GetResponseStream();
                      StreamReader sr = new StreamReader(stream);
                      string s = sr.ReadToEnd();
                      sr.Close();
                      var jobject = Newtonsoft.Json.Linq.JObject.Parse(s);
                      mydata gg = JsonConvert.DeserializeObject<mydata>(jobject.ToString());
                      List<result> results = new List<result>();
                      foreach (result rs in gg.result)
                      {
                          try
                          {
                               
                              //Debug.Assert(message != null, "message != null");
                              //if ((BotTelegramWeb.TaktopBot.message.Equals(rs, null))!= true)
                              if (rs.update_id != 547758883 && rs.update_id !=547758886)
                              {
                                  results.Add(rs);
                                  SendMessage(rs.update_id.ToString(), "hello      " + rs.message.chat.first_name); 
                              }
                              else
                              {
                                  continue;
                              }
                          }
                          catch (Exception ex)
                          {
                              throw;
                          }
                      }
                  }    
              }
             
          }

      • #
        ‫۷ سال و ۹ ماه قبل، سه‌شنبه ۷ دی ۱۳۹۵، ساعت ۰۲:۱۷
        1. آپدیتهای دریافتی همیشه فقط شامل Message نمیشه و ممکنه آپدیت دریافتی از نوع CallbackQuery هم باشه
        2. کمی بالاتر توضیح داده شده که برای دریافت آپدیت‌های جدید باید پارامتر offset رو هم ارسال کنی. مقدار این پارامتر باید رقم بعدی Id آخرین آپدیت دریافتی باشه یعنی update_id  +1
        برای طراحی ربات تلگرام هم بهتر هست که از پکیج‌های آماده استفاده بشه که بالاتر عرض کردم.
        یه پروژه کنسول ایجاد کن پکیج telegram.bot رو هم از Nuget به برنامه اضافه کن و کلاس program.cs  رو به صورت زیر پیاده کن
        به جای BOT_TOKEN هم توکن ربات خودت رو کپی کن و برنامه رو اجرا کن
        using System.Threading.Tasks;
        using Telegram.Bot;
        
        namespace Bot.Engine.Console
        {
            public class Program
            {
                Api bot;
                string botToken = "BOT_TOKEN";
        
                public static void Main(string[] args)
                {
                    Task.Run(() => RunBot(botToken));
        
                    System.Console.ReadLine();
                }
        
        
                /// <summary>
                /// 
                /// </summary>
                public static async Task RunBot(string botToken)
                {
                    #region راه اندازی ربات
        
                     bot = new Api(botToken);
                    var me = await bot.GetMe();
                    if (me != null)
                    {
                        System.Console.WriteLine("bot started {0}", me.Username);
                    }
                    else
                    {
                        System.Console.WriteLine("get bot failed ");
                    }
        
                  
                    #endregion
        
                    #region شروع گوش دادن به درخواست‌ها var whileCount = 0;
                    var offset = 0;
        
                    while (true)
                    {
                        System.Console.WriteLine("while no {0}", whileCount);
        
                        whileCount += 1;
                        try
                        {
                            var updates = await bot.GetUpdatesAsync(offset);
                            var updatesCount = updates.Count();
                            System.Console.WriteLine("updates count is {0}", updatesCount);
                            System.Console.WriteLine("================================================================");
        
                            if (updatesCount > 0)
                            {
                                foreach (var update in updates)
                                {
                                    try
                                    {
                                        offset = update.Id + 1;
                                        if (update.Message.Text!=null)
                                        {
                                            //echo msg
                                            await bot.SendTextMessageAsync(update.Message.Chat.Id, update.Message.Text);
                                        }
                                        else
                                        {
                                            await bot.SendTextMessageAsync(update.Message.Chat.Id, "لطفا یک پیام متنی بفرستید");
                                        }
        
                                    }
                                    catch (Exception ex)
                                    {
                                        bot.SendTextMessage(update.Message.Chat.Id, ex.ToString());
                                    }
                                }
                                continue;
                            }
        
        
                        }
                        catch (Exception ex)
                        {
                            System.Console.WriteLine("Error Msg = {0}",ex.Message);
                        }
        
                    }
        
                    #endregion
                }
        
            }
        }

    • #
      ‫۷ سال و ۴ ماه قبل، یکشنبه ۳۱ اردیبهشت ۱۳۹۶، ساعت ۱۷:۱۳
      سلام ممنون از اطلاعات مفید
      هرکاری کردم نتونستم این قسمت کد متوجه بشم
      // Endpoint musst be configured with netsh:
      // netsh http add urlacl url=https://+:8443/ user=<username>
      // netsh http add sslcert ipport=0.0.0.0:8443 certhash=<cert thumbprint> appid=<random guid>
      using (WebApp.Start<Startup>("https://+:8443"))
      ممنون میشم توضیح کاملتری  با ذکر مثال بدید
      و همچنین یه سوال دیگه 
      netsh http add urlacl
      باید روی سرور اجرا بشه و اگه باید از روی سرور اجرا بشه برای کسایی که فقط هاست دارند و سرور ندارند روشی هست
      • #
        ‫۷ سال و ۴ ماه قبل، یکشنبه ۳۱ اردیبهشت ۱۳۹۶، ساعت ۱۷:۴۷
        این مربوط به ثبت مجوز SSL دستی لوکال هست؛ مانند: ایجاد Self-Signed Certificate در IIS Express. اگر هاست شما مجوز SSL دارد، نیازی به افزودن چیزی نیست.
        • #
          ‫۷ سال و ۴ ماه قبل، سه‌شنبه ۲ خرداد ۱۳۹۶، ساعت ۱۵:۲۹
          سلام و با سپاس  مجدد
          SSL سایت از طریق cloudflare دریافت کردم
          دو تا سوال داشتم
          1- با توضیحات شما احتیاجی به اجرای دستور netsh بر روی سرور نیست. ولی وقتی می‌خوام روی visual studio  برنامه رو  اجرا کنم احتیاجی به دستور netsh هست ممنون میشم یه نمونه بنویسید
          2- جایگزین عبارت "https://+:8443" برای اجرای برنامه با visual studio  و همین طور وقتی قرار کد تو سرور قرار بدیم
             using (WebApp. Start<Startup>  ( "https://+:8443" ) )
           ممنون میشم علاوه بر توضیح برای هر دو یه نمونه هم بنویسید  
  • #
    ‫۷ سال و ۸ ماه قبل، سه‌شنبه ۱۴ دی ۱۳۹۵، ساعت ۱۲:۱۶
    با سلام 
    می خواستم بدونم چطور می‌توان فهمید کاربر چه کلیدی از کیبورد را انتخاب کرده است؟ در مثالی که برای node.js در اینجا آمده است اینکار به این صورت انجام  شده است :
    bot.sendMessage(USER, 'How old are you?', opts)
      .then(function (sended) {
        var chatId = sended.chat.id;
        var messageId = sended.message_id;
        bot.onReplyToMessage(chatId, messageId, function (message) {
          console.log('User is %s years old', message.text);
        });
      });
    اما با توجه به جستجوهایی که من انجام دادم هیچ راهکاری در سی شارپ پیدا نکردم. ممنون می‌شم اگر دوستان اطلاعاتی دارند من را راهنمایی بفرمایند./
  • #
    ‫۷ سال و ۸ ماه قبل، جمعه ۱۷ دی ۱۳۹۵، ساعت ۱۸:۴۵
    با سلام. مشکل بنده اینه که من یک بات ساختم در حقیقت یک بازی ست ، بازی حدس کلمات خاص ، ولی مشکل اینجاست وقتی ربات رو در دو گروه مختلف اد میکنم یا اصلا در دو گروه هم نه دو نفر به طور مجزا در موبایلشون دارن از این ربات استفاده میکنم هر نفر برای خودش بازی رو استارت میکنه ، بازیشون روی هم تاثیر میزاره نمیدونم چیکارش کنم.

                            foreach (var update in updates)
                            {
                                try
                                {
                                    offset = update.Id + 1;
                                    if (Text == "/start")
                                    {
                                         میره از دیتابیس داده‌ها رو میاره و نمایش میده که مثلا چند حرف و  پیام میده که یک حرف را وارد کنید 
                                        await bot.SendTextMessageAsync(update.Message.Chat.Id, "حرف را وارد کنید "+kalame);
                                    }
                                    else if (Text.length=1)
                                    {
    
    اگر حرف وارد شد اونوقت میره چک میکنه حرف درسته و میشونه محل مورد نظر در خونه خالی و پیام میده اگر    موفقیت امیز بود که صحیح است به همراه جا خالی و حرف درست و اگر غلط بودش پیام مربوطه
                                        await bot.SendTextMessageAsync(update.Message.Chat.Id, "پیام  فوق درست است");
                                    }
                                    else 
                                    {
                                     continue;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    continue;
                                }
                            }
                        }
    کد دم دستم نبود اضافه کنم ولی همین کلیت کارمه . foreach  هم که مشخصه هر بار پیام میده میره شروط رو چک میکنه . حالا به نظرتون چه کنم که این بازی وقتی دو نفر مجزا برای خودشون بازی میکنن قاطی نکنه؟ 
    • #
      ‫۷ سال و ۸ ماه قبل، دوشنبه ۲۰ دی ۱۳۹۵، ساعت ۱۳:۲۱
      مشکل شما دقیقا جاییه که توی کد فوق نمایش داده نشده !
      این متغیر kalame چیه و کجا تعریف شده؟
      شما ظاهرا حواست نیست که یه متغیر رو قبل از حلقه تعریف کردی و یا کلا از نوع static در نظر گرفتی و مقدارش رو بین کاربرها به اشتراک گذاشتی
      برای همین توی هربار تکرار حلقه و پاسخ دادن به کاربر، هنوز اطلاعات کاربر قبلی توی متغیر باقی مونده.
      فعلا این نظریه که از روی حدس میشه داد. اگر مشکل این نبود باید سورس کامل‌تری ارائه بدی که بشه به راحتی مشکل رو پیدا کرد
  • #
    ‫۷ سال و ۸ ماه قبل، یکشنبه ۱۹ دی ۱۳۹۵، ساعت ۱۵:۰۸
    با سلام و تشکر از مطلب مفیدتون.
    آیا امکان ارسال لینک همراه متن توی SendMessage هست؟
    • #
      ‫۷ سال و ۸ ماه قبل، یکشنبه ۱۹ دی ۱۳۹۵، ساعت ۱۶:۱۰
      سلام؛ لینک رو داخل یک متغیر قرار بده بعد اضافه کن به رشته ای که میخای ارسال کنی . البته همینطوری  لینک رو هم بزاری داخل دبل کوتشین ارسالی واست انتقال میده . لینک رو به عنوان تکست میشناسه .
      • #
        ‫۷ سال و ۸ ماه قبل، یکشنبه ۱۹ دی ۱۳۹۵، ساعت ۱۶:۵۹
        من نمیخوام به عنوان تست بشناسه. میخوام ((به این صورت))  باشه. آیا امکانش هست؟
        • #
          ‫۷ سال و ۸ ماه قبل، دوشنبه ۲۰ دی ۱۳۹۵، ساعت ۱۳:۳۴
          اگر سری به مستندات تلگرام برای api‌های مربوط به بات بزنی و متد SendMessage  رو با دقت بیشتری بررسی کنی میبینی که یه پارامتر به اسم parse_mode     داره که اگه مقدار  Markdown بهش بدی تلگرام موقع نمایش متنی که به بات ارسال میکنی طبق یک سری قرار داد ، فرمتینگ متن رو انجام میده. مثلا میتونیم متنی رو هایپر لینک کنی و یا به صورت  Bold یا italic نمایش بدی.
          برای اینکه متنی به صورت هایپر لینک نمایش داده بشه از قرارداد زیر استفاده کن :
          [test](http://www.example.com/)
          این متن باید داخل پارامتر text قرار بگیره. حالا خروجی که ما توی بات داریم به صورت زیره :
          test 
          بقیه موارد رو هم توی مستندات مطالعه کن  
  • #
    ‫۵ سال و ۱ ماه قبل، یکشنبه ۱۳ مرداد ۱۳۹۸، ساعت ۰۱:۳۲
    درود؛ وقت بخیر؛ من یک ربات ساختم. می‌خواهم وقتی کاربر قراره یک متنی وارد کند، یک مقداری خودم تو input نشون بدم و کاربر ادامش رو تکمیل کنه. امکان چنین کاری هست؟ مثلا : من یک مسیج به کاربر میدم و مینویسم لطفا عدد مورد نظر را وارد کنید. بعد کاربر این پیام رو که میبینه، توی input هم مقدار زیر رو ببینه و ادامش عدد مورد نظرش رو وارد کنه. تعداد :
    • #
      ‫۵ سال و ۱ ماه قبل، یکشنبه ۱۳ مرداد ۱۳۹۸، ساعت ۰۴:۴۷
      سلام
      شما کلا از چند طریق میتوانید  داده‌های خودتون رو به بات ارسال کنید
      1. از طریق تایپ و ارسال عادی متن که سمت سرور می‌توانید متن رو بگیرید و سمت سرور روش شرط بذارید.
      2. از طریق KeyboardButton  که دکمه‌هایی هستند زیر بات میان و می‌توانید با کلیک بر روی هر دکمه، نوشته داخل دکمه رو ارسال کنید که شبیه روش ۱ فقط با دکمه انجام میشه 
      3. ازطریق InlineKeyboardButton که دکمه‌های شیشه‌ای هستند و در محیط چت نمایش داده میشوند که میتوان با کلیک بر روی هر دکمه، مقداری را که پشت پرده ست کردید، بفرستید.
      طوری که من سوال شمارو فهمیدم شما با هرکدام از روش‌های بالا داده را به سرور بفرستید داخل سرور باید روی متن رشته‌ای فرستاده شده شرط بذارید و طبق شرطتون داده را مجدد برای کاربر بفرستید.
      همچنین میتوانید این مقاله را هم مطالعه نمائید.