لوگوی وبسایت
تمام آموزش های وبسایت رایگان می باشد ، پس از صفحات مختلف سایت دیدن فرمایید .

آموزش inline keyborad و پاسخ به آن در ربات های تلگرام

شاید شما هم اینلاین کیبورت ( inline keyborad ) یا همون کی بورد های شیشه ایی را در ربات های تلگرام دیده باشید ، این کی بورد ها بسیار جذاب می باشند !‌بهتر است با آن ها آشنا شویم .

ماجرای inline keyboard چیست ؟

شما هم شاید مانند خیل عظیمی از کاربران ، به علت وجود کی بورد های اذیت کننده از ربات های تلگرام تنفر پیدا کرده باشید ! اما این کی بورد های شیک به همراه قابلیت آپدیت کردن پیام ها واقعا زیبایی و حس خوبی به ربات ها داده است .

زمانی که شما روی یکی از این دکمه ها کلیک می کنید چندین حالت وجود دارد ، یکی از مرسوم ترین حالت ها این است که شما یک callback بسازید و به اون کال بک پاسخ بدهید .

بیاید راحت تر صحبت کنیم ! شما وقتی روی دکمه ها کلیک می کنید ربات یک update جدید برای وب هوک شما ارسال می کند و شما به اون آپدیت می توانید هر پاسخی بدهید .

پروژه مد نظر inline keyborad ما

قرار است یک ربات پیاده کنیم که با ارسال هر پیامی به آن به ما تاریخ دقیق را بدهد . یک کیبورد هم به آن اضافه می کنیم که با کلیک بر روی آن تاریخ رفرش شود .

هم چنین تعداد بار هایی که کاربر روی کی بورد کلیک کرده است را هم می شماریم .

شروع برنامه نویسی قابلیت inline keyboard button

اگر هنوز نتوانسته اید وب هوک پیاده کنید آموزش های قبلی توسعه ربات را مطالعه کنید.

خوب ربات خودتون رو بسازید ، وب هوک تعریف کنید و Token رو بدست بیاورید .

ابتدا باید فرق یک Update معمولی با یک Update مربوط به callback را بشناسیم.

اگر اپدیت ما مربوط به CallBack بود در update ما یک property جدید به نام  callback_query اضافه می شود .

در این callback query مقادیر مختلفی هستند که بزودی با آن ها آشنا خواهیم شد .

ابتدا این قابلیت را باید به ربات اضافه کنیم که به هر پیام ارسالی ، تاریخ و کی بورد را ارسال کند.

حتما API_KEY را به Token ربات خود تغییر دهید .

تابع makeHTTPRequest برای شما متد ها را اجرا می کند. ‌( کار راحت تر می شود )

خوب حالا باید آپدیت ها را دریافت کنیم و مدیریت کنیم .

باید ببینیم که آپدیت مربوط به inline keyboard هست یا خیر :

خوب فعلا آپدیت ایی که مربوط به inline keyboard نیست را باید آماده کنیم .

وقتی کاربر برای ما پیامی ارسال می کند ما با استفاده از متد sendMessage یک پیام حاوی زمان و کی بورد ارسال می کنیم .

متن پیام خوب یک چیز ساده است و تاریخ هم با date('d M y - h:i:s'); بدست می آید اما برای کی بورد باید با  reply_markup آشنا شویم .

ما می توانید به ضمیمه اکثر پیام که markup هایی اعمال کنید : Inline keyborad , Keyboard , Force close , Hide keyboard

خوب هر کدام وظیفه ایی دارند و فعلا سر و کار ما با Inline Keyboard می باشد .

این مقدار که در آبجکت ما به شکل یک کلید inline_keyboard برای یک آبجکت دیگر تعریف می شود ، یک آرایه تو در تو میگیرد .

ارایه اول سطر ها را تعیید می کند و ارایه دوم ستون . در ارایه دوم هم یک سری آبجکت تعریف می کنیم که نقش دکمه ها را دارند.

برای مثال خروجی داده هایی به شکل زیر :

مانند این تصویر است :

inline_keyborad_sample_test

کمی تمرین کنید بیشتر متوجه می شوید …

خوب برای ارسال تمام این مقادیر با هم باید حتما مقدار reply_markup را تبدیل به json کنید .

برای مثال کد بالا را باید تماما json_encode کنید …

اما inline keyboard ها علاوه بر text در کی بورد های معمولی باید یکی از سه مقادیر url , callback_data , switch_inline_query را داشته باشند .

url که مانند مثال بالا یک دکمه اماده می کند که با کلیک بر روی آن وارد آدرس مد نظر می شویم.

اما callback_data که چیزی هست که ما با آن سر و کار داریم ،‌اطلاعاتی است که می خواهیم همراه با آپدیت ایی که برای وب هوک ارسال می شود ،‌ارسال شود .

برای مثال ما می خواهیم تعداد دفعاتی که کاربر روی دکمه کلیک می کند را بسنجیم‌،‌برای این کار ما ابتدا مقدار ۱ را به آن می دهیم و با هر بار آپدیت کردن این پیام ، به این مقدار اضافه می کنیم .

خوب همه این ها با هم کد زیر می شوند :

که باید در else شرطی که توضیح دادیم قرار دهیم .

خوب حالا باید به این query پاسخ بدهیم .

پاسخ به inline keyboard button query

برای این کار ما از متد answerInlineQuery استفاده می کنیم .

با این کار تلگرام به کاربر یک پیام ( یا به شکل Alert Box یا به شکل Toast ) نمایش می دهد ، شاید بگویید خوب ما فقط پیام را آپدیت می کنیم پس چرا این کار هم انجام دهیم ؟

تلگرام می خواهد اطمینان پیدا کند که query به وب هوک شما رسیده باشد ، و تا زمانی که شما به کوئری پاسخ ندهید ، تصویر Loading ایی که کنار دکمه می آید ناپدید نمی شود .

خوب ما اول باید اطلاعات Inline Query را داشته باشیم .

تلگرام این مقادیر را در callback_query در update قرار می دهد که از نوع Callback Query می باشد .

property هایی که برای ما مهم هستند :

id: شناسه ای inline query است که برای answerInlineQuery به آن نیاز داریم .

message: آن پیامی است که ما همراه کی بورد به کاربر فرستاده ایم . ما از message مقادیر chat id و message id را دریافت می کنیم تا پیاممان را آپدیت کنیم :

خوب data هم دقیقا همان مقدار callback_data ایی هست که به هر دکمه اختصاص داده ایم .

ما تعداد دقعاتی که کاربر از دکمه استفاده کرده است را در data قرار داده ایم ،‌آن را بدست می آوریم و به آن یکی اضافه می کنیم .

خوب حالا اطلاعات مد نظرمان را داریم ، بیاید اول answerQuery را انجام دهیم :

طبق توضیحات تلگرام Answer Callback Query از ما  callback_query_id که همان شناسه query ما است و در callback_query قبلا بدست آورده ایم ، text که پیام نمایشی ما است و show_alert را می خواهد .

show_alert اگر true باشد به ما به جای Toast یک Alert Box نمایش می دهد .

خوب حالا باید پیام قبلی مان را هم آپدیت کنیم :

برای این کار ما از متد  EditMessageText استفاده می کنیم . property های آن مانند sendMessage است با این تفاوت که باید مقادیر chat_id و message_id پیام ایی که می خواهیم آپدیت کنیم را هم وارد کنیم .

خوب ما این مقادیر را کمی بالا تر از callback_query استخراج کرده ایم ، بیایید پیام را آپدیت کنیم 🙂

توجه کنید که حتما JSON کنید !

توجه کنید که حتما تمام مقادیر reply_markup را json کنید ، یعنی تمام آرایه که از  ['inline_keyboard'=> ...    آغاز میشود و به آخرین [می رسد.

سورس پروژه :

 

بر چسب های پست : , , , , , , , ,
مطالب مرتبط
آموزش برنامه نویسی ربات تلگرام ، توسعه ربات و آماده سازی بستر بر روی لوکال هست ب ...
۲۶ مرداد ۹۶
11 دیدگاه
سلام دوستان امیدوارم حالتان خوب باشد . در قسمت قبلی ما با متد Long Polling آشنا ...
۱۰ اردیبهشت ۹۵
112 دیدگاه
50 دیدگاه برای “آموزش inline keyborad و پاسخ به آن در ربات های تلگرام”
  1. sadegh2007 گفت:

    خیلی مطلب خوبی بود
    فقط inline bot هم یاد بدید چون من وقتی inline keyboard واسه article ست می کنم هیچی بهم نشون نمیده
    ولی وقتی inline keyboard رو حذف می کنم اطلاعات رو نشون میده
    همون inline keyboard رو وقتی با sendMessage تست می کنم کار میکنم نمیدونم چرا واسه inline bot کار نمیکنه اگه بتونید جواب بدین خیلی خیلی ممنون میشم ازتون

    1. سلام .

      reply markup در inline bot در حالت article باید درinput_message_content ثبت شود

      1. sadegh2007 گفت:

        سلام مشکلم بابت این موضوع حل شد
        الان یه مشکلی که دارم وقتی از داخت ربات یه پیام بفرستی با inline button یعنی query callback یه message بهت میده که میتونی به متنی که همراه inline button فرستادی دسترسی داشته باشی ولی وقتی با via یا inline bot بفرستی اون message رو بهت نمیده چجوری میتونم به اون دسترسی داشته باشم؟ تا تغییر بدم متن و کیبورد رو باهم

        1. باید inline feedback توی bot father فعال کنید .

          بهتون آپدیت answered inline query میده

  2. hassan گفت:

    سلام
    ممنون پسن مفیدی بود.
    فقط من یک مشکل داشتم.از دیتای callback_query نمیتونم استفاده کنم اصن چیزی نمیاره
    else if(isset($update->callback_query)){
    makeCurl(“answerCallbackQuery”,[“callback_query_id”=>$update->callback_query->id]);
    $userfirstname=$update->callback_query->from->first_name;
    $text = $update->callback_query->data;
    $chat_id = $update->callback_query->chat->id;
    makeCurl(“sendMessage”,[“chat_id”=>$chat_id,”text”=>$update->callback_query->data]);
    }
    اصلا چیزی نمیفرسته

    1. سمیرا گفت:

      apiRequest(‘answerCallbackQuery’,
      [
      ‘callback_query_id’=>$body[‘callback_query’][‘id’],
      ‘text’=>’ok :)’,
      ‘show_alert’ => true
      ]);

      $message_id = $body[“callback_query”][“message”][“message_id”];
      $tried = $body[“callback_query”][“data”] ;
      $chat_id = $body-[“callback_query”][“message”][‘chat’][‘id’];
      $tried = $tried +1;
      apiRequest(‘editMessageText’,[
      ‘chat_id’=>$chat_id,
      ‘message_id’=>$message_id,
      ‘text’=>$tried,
      ‘reply_markup’=>json_encode([
      ‘inline_keyboard’=>[
      [
      [‘text’=>”رفرش “,’callback_data’=>”$tried”]
      ]
      ]
      ])
      ]);

  3. daniyaleight گفت:

    سلام من یه ربات ساده ساختم میخوام کیبورد من تو در تو باشه یعنی
    دکمه ۱ دکمه۲ دکمه ۳
    بعد هر کدوم وقتی روش کلیک شد دکمه های مشاهده، تصویر ،خواندن، رو داشته باشه لطفا راهنمایی کنید.

    مرسی

  4. mr.puker گفت:

    دستورات نصب در سرور رو میدید؟
    با تشکر

  5. سهراب گفت:

    سلام خیلی مطلب خوبی بود… تشکر و قدر دانی فراوان

  6. محسن گفت:

    سلام با تشکر از آموزش های خوبتون.
    بنده با کد نویسی در این باره آشناییت زیادی ندارم و تازه سال اول دانشگاه زبان c رو شروع کردم♥♥☻ایشالا که بزودی بتونم ربات با openshift بسازم
    سوالی داشتم .
    این قابلیت تو رباطی که با بات ساز ساختم چجوری فعالش کنم؟اصن داره؟
    ممنون♥

  7. E.A گفت:

    سلام.
    عالی بود فقط میشه یک کد کامل برای ایجاد یک دستور api در بات ساز بدید.
    من خیلی بلد نیستم php فقط میخوام وقتی زدن روی دکمه یک مطلب خاصی ارسال بشه؟
    اگه یک نفر این کار رو کنه ممنون میشم.
    erfanadddd@gmail.com

  8. kamyarazizi گفت:

    سلام
    شما سفارش ساخت بات قبول می کنید؟

    1. pedram گفت:

      با ایمیل بنده تماس بگیرید
      aslani.pedram@gmail.com

  9. محسن گفت:

    سلام،خسته نباشید

    من یه سوال دارم!

    اول از همه این رو بگم،ربات منو به سرور «هاجی ربات» وصل کردم.
    بعدش اینکه الان چطوری باید قابلیت «درون خطی یا inline» رو برای رباتم فعال کنم؟؟لطفاً به جیمیلم جواب رو بفرستید.

    منظور از درون خطی یعنی:
    برای مثال اینکه الان یکی با ربات من (عکس+دکمه‌شیشه‌ای پایین عکس)درست کرده.
    و اون فرد به کانال(یا گروه یا پیوی کسی)بره،که بعدش آدرس ربات من usernamebot@ که مثلا این باشه بنویسه.
    درآخر همون دکمه‌شیشه‌ای رو بشه فرستاد مثل حالت اینلاین inline

    امیدوارم که فهمیده باشید چی گفتم و بتونید راهنمایی کنید من رو،تشکر

    marab5210@gmail.com
    جیمیل:👆👆👆👆👆

  10. نوید گفت:

    سلام
    چطوری چند inline_keyboard ایجاد کنم ؟

    مثلا می خوام یکی نمایش زمان بده . یکی یچیز دیگه .
    منو ها ایجاد میشه ولی هر کدوم را که میزنم فقط متن اولی رو نشون میده .
    در هر تعداد پست و چت هم فرقی نمیکنه .
    باتشکر

  11. علی گفت:

    سلام
    برای نوشتن زبان پی اچ پی کجا بنویسیم؟؟؟؟؟
    لطفا جواب بدید.

    1. mehran گفت:

      تو Notepad
      با فرمت .php ذخیره کن به جای .txt

  12. ابوالفضل گفت:

    سلام
    من برنامه نویس نیستم اما واقعا خیلی علاقه دارم ب این کار
    من هیچی بلد نیستم لطفا اگه میشه به زبان ساده
    نوشتن ربات api رو از اول توضیح بدین
    یعنی باید اول کجا برم بعد چیکارکنم و…
    خیلی ممنون از شما

    1. mehran گفت:

      دو راه دارید:
      ۱) سرور مجازی روی کامپیوتر با wampserver

      ۲) ساخت ربات به کمک webhook که همین جا توضیح داده، روی سایتی مثل https://www.000webhost.com هاست بگیرید و اجرا کنید.
      کافیه کد رو توی notepad کپی کنید و به جای اون xxxx…. توکن ربات رو بزارید.
      بعدشم این url رو توی مرورگر وارد کنید و یک بار اجرا کنید
      آدرس فایل شما روی هاست=https://api.telegram.org/bot/setwebhook?url

  13. wahab گفت:

    سلام ممنون بابت مقاله
    چطور میتونم از داخل کانال تلگرام CallbackQuery
    بوت را فراخوانی کنم یعنی با ارسال Inlinekeyboard
    و کلیک روی اون این اتفاق میافته؟

  14. وحید گفت:

    سلام چ جوری می تونم روی کیبورد مجازیم تصاویر کوچک بزارم برای معرفی کاربرد دکمه مثلا دکمه کتابخانه تصویر ی کتاب

  15. سینا گفت:

    سلام آیا callbackquery روی api بات ساز هم جواب میده ؟؟ آخه همین سورس رو با تغییرات لازمه روی api بات ساز امتحان کردم اولین تلاش رو میاره ولی رفرش نمیکنه

  16. سامان گفت:

    سلام ممنون از زحمتی که بابت اموزش کشیدید
    میخواستم بدونم ایا اینلاین کیبورد با استفاده از متد getUpdates بدون استفاده از Webhook امکان پذیره؟

    1. mehran گفت:

      امکان پذیره، ولی به کار نمیاد
      // Fetching UPDATE
      $update = json_decode(file_get_contents(‘php://input’));
      کافیه php://input رو با .”https://api.telegram.org/bot”.$token.”/getupdates” عوض کنید

      توی کد هم یه سری تغییرات جزئی داره
      مثلا $text=$updates[“result”][0][“message”][“text”]; به جای چیزی که توی متن هست result و ۰ حذف میشن

      ولی بهتره فایل رو روی هاستی مثل https://www.000webhost.com آپلود کنید تا به صورت خودکار پاسخگو باشه

  17. هومن گفت:

    سلام اینو باید باچی بنویسم ؟ و چه چطوری توی ربات ساز استفاده کنم ؟

  18. عباس گفت:

    مطالبتون فوق العاده بود استفاده کردیم
    البته سورسی که قرار دادید رو نتونستم با سورس Hello Work خود سایت تلگرام قرار داده مچ کنم
    ولی در مجموع
    هدفم از این پیام
    یه تشکر ویژه از شما بزرگوار بود که انقدر عالی و مخلصانه اطلاعاتتون رو به صورت رایگان در اختیار هموطنات گذاشتید در حالی که اکثرا بابت همین اطلاعات رقم هایی تایین و دریافت میکنن.
    خواستم بدونید، هستن خیلیا که قدر شناسن اگرچه مطالب شما رو خوندن و پیام نذاشتن ولی قلبا با سایتت حال کردن
    کارت حرف نداشت ممنون.
    امیدوارم همیشه موفق باشی دوست عزیزم.
    یا علی.

  19. علی گفت:

    سلام ببخشید
    من برای ربات api میخوام یه دکمه شیشه ای بزارم ک وقتی کاربر روی اون کلیک کرد پیامی ک فرستاده رو ویرایش کنه و پیام جدید رو نشون بده با دکمه برگشت اگه میشه یاد بدین
    با تشکر

  20. داود گفت:

    سلام
    من رباتم رو با آموزش شما آماده کردم و تست هام رو هم با دسکتاپ تلگرام گرفتم
    اما با موبایل ربات کار نمیکنه!
    با رئش file_get_contents تست کردم کار کرد و متوجه شدم مشکل از تابع makeHTTPRequest هست.
    لطفا راهنمایی بفرمایید چطور میتونم حلش کنم ؟
    ممنونم.

  21. داود گفت:

    سلام
    ظاهرا مشکل از لاراوله.
    من با لاراول کار میکنم.
    csrf token رو هم در میدل ور غیرفعال کردم.
    اما بازم کار نمیکنه.

  22. Matin گفت:

    سلام
    شما رباتی برای تبادل هم کد نویسی کرده بودید
    من برای اون ربات کد اشتراک گذاری بنر میخوام

    ممنون میشم کمک کنید

  23. amirreza گفت:

    سلام میشه لطفا آموز ساخت دکمه آمار رو بزارید

  24. takchiz گفت:

    سلام
    عالی بود به کار بردم

  25. Sevil65 گفت:

    با سلام
    اولا بابت اموزش خوبتون ممنونم
    سوالی که داشتم این بود چطوری میشه این کلید هارو انتشار داد به گروه یا کانال خاص
    مثل ربات نظرسنجی اگه اموزش این رو هم بذارین ممنون میشم

  26. محمد گفت:

    سلام مطلب خوبیه ولی کاش میگفتی که مثلا تومتود ها کجا باید
    callback_query رو بزاریم در کدوم متو ها
    ممنون میشم بگید.💝

  27. مرتضی گفت:

    یه پیام با ربات فرستادم دوتا دکمه شیشه ای داره که calback_dataـی هر کدوم ۱ هست
    خب الان روی یکیش کلیک میکنم با موفقیت میگیرم data رو
    اما از کجا تشخیص بدم که کدوم دکمه کلیک شده؟

  28. یه نمونه خوب برای ارسال دکمه شیشه ای و بقیه متدهای قابل استفاده در تلگرام…
    http://www.safety-security.ir/bot

  29. مهدی گفت:

    با سلام و خسته نباشید

    امکانش هست که این اموزش رو در زبان سی شارپ هم ارائه بدید؟
    با تشکر

  30. mehran گفت:

    چطور میشه پست زمان دار فرستاد؟
    حلقه رو امتحان کردم ولی به مشکل میخورد

  31. کاظم گفت:

    سلام و درود

    چرا از ob_start(); در ابتدای فایل ربات استفاده کردید؟

  32. سوران گفت:

    سلام پروژه من به زبان C# هست و با این Callback Query مشکل دارم.
    مشکلم اینجاست که نمیدونم چطوری اطلاعات رو بخونم و ازش استفاده کنم

  33. محمد رضا گفت:

    سلام
    چطور میشه در گروه کیبورد فقط به یک شخص خاص نشون داده بشه؟

  34. علی گفت:

    سلام
    ممنون از آموزش خوبتون.
    لطف می کنید یک آموزش هم درباره botan sdk برای گرفتن آمار از ربات بدید؟
    و یک سوال داشتم:
    فرض کنید من یک ربات ساختم که به وسیله سوییچ پاسخ های صحیح رو ارسال میکنه برای کاربر که همراه هرکدوم هم یک لینک مربوط به همون پاسخ هست. حالا من چطوری میتونم بهجای لینکی معمولی از همین inline keboard به عنوان یک لینک استفاده کنم.

    تشکر

    1. سلام دوست عزیز
      شاید من دقیق متوجه سوال شما نشدم ولی در inline keyboard قابلیت این رو داریم که url ارسال کنیم .

      1. علی گفت:

        سلام
        ممنون از پیگیری شما
        من نمونه ای مثال میزنم:
        case ‘/start’:
        $reply =”متن تست”;
        $reply .=”“;
        break;
        case ‘/help’:
        $reply =”متن تست”;
        $reply .=”“;
        break;

        فرض کنید من از سوییچ کیس استفاده میکنم که بنا به ارسال کاربر مثلا نوشتن start یا help یک متن براش ارسال میشه و یک لینک که تا اینجا من مشکلی نداشتم.
        حالا میخوام اون لینکی که ارسال میشه به صورت اینلاین کیبورد باشه. اگر یک مثال برام بزنید تا بتونم این مورد رو پیاده کنم ممنون میشم.

        یک مورد هم که در دیدگاه قبلی گفتم آیا امکان آموزش botansdk وجود داره برای شما؟

        تشکر

        1. خب شما توی data های کیبورد یک ساختار بسازید .
          برای مثال

          question-{questionid}-answer-{answerid}

          و در ادامه طبق این ساختار اطلاعات رو تجزیه تحلیل کنید .

  35. yaser گفت:

    public async System.Threading.Tasks.Task GetMsgAsync()
    {
    var req = Request.InputStream;
    var responsString = new StreamReader(req).ReadToEnd();
    var update = JsonConvert.DeserializeObject(responsString);
    var message = update.Message;
    var chat = message.Chat;

    InlineKeyboardMarkup categoryInlineMarkup = new
    InlineKeyboardMarkup(
    new InlineKeyboardButton[][]
    {
    new InlineKeyboardButton[]
    {
    new InlineKeyboardCallbackButton(“button1″,”callbackData”)
    // چجوری کلیک این دکمه رو بگیرم ؟؟؟؟؟
    }
    }
    );

    await api.SendTextMessageAsync(update.Message.Chat.Id, “Please click the button”, replyMarkup: categoryInlineMarkup);

    if (update.Type == Telegram.Bot.Types.Enums.UpdateType.MessageUpdate)
    {
    // all codes just run in this block
    }

    if (update.Type == Telegram.Bot.Types.Enums.UpdateType.CallbackQueryUpdate)
    {
    // I can’t get clicked button here
    if (update.CallbackQuery.Data.Contains(“callbackData”))
    {
    await api.AnswerCallbackQueryAsync(update.CallbackQuery.Id, update.CallbackQuery.Data);
    }
    }

    }

    1. yaser گفت:

      سلام ، جواب سوال خودمو پیدا کردم ، هر کی مشکل منو داشته میتونه بره اینجا جواب رو ببینه :
      https://stackoverflow.com/questions/46144082/how-can-get-callbackdata-in-current-when-inlinekeyboardcallbackbutton-clicked-in/46219921#46219921

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

ورود به حساب کاربری
بستن این پنجره