ساخت ربات telegram - قسمت چهارم - ساخت ربات آینه (متنی)

ساخت ربات telegram - قسمت چهارم - ساخت ربات آینه (متنی)

ساخت ربات آینه (متن) Telegram با استفاده از زبان php :

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

- برای شروع ابتدا کد را می نویسیم و سپس به توضیح آن می پردازیم :

<?php

$token = "<-BotToken->";
$baseUrl = "https://api.telegram.org/bot" . $token;
$offset = 0;
while (true) {
  $url = $baseUrl . "/getUpdates?offset=" . $offset;
  $fileContents = file_get_contents($url);
  $arrayResult = json_decode($fileContents);
  foreach ($arrayResult['result'] as $update) {
    $uId = $update['update_id'];
    $offset = $uId + 1;
    $chatId = $update['message']['from']['id'];
    $userMessage = $update['message']['text'];
    $sendText = $baseUrl . "/sendMessage?chat_id=" . $chatId . "&text=" . $userMessage;
    file_get_contents($sendText);
  }
}

آشنایی با جیسون :

- برای ادامه آموزش ابتدا یک توضیح کوتاه درباره فرمت جیسون می گویم و آموزش را ادامه میدهم ، تصور کنید یک خروجی مانند زیر داشته باشید (با فرض اینکه مطمئن باشید جیسون است) :

{"name":{"first":"Mohammad","last":"Zarchi"},"age":25}

حال می خواهید به خانه ای از این آرایه بنام last دسترسی پیدا کنید ، اما چطور؟ اگربرای این کار از زبان php کمک میگیرید کافی است از تابع json_decode استفاده کنید و این جیسون را به یک آرایه تبدیل کنید سپس میتوانید از طریق زیر نه تنها به last بلکه به تمامی عناصر آرایه دست پیدا کنید (برای هر کدام دوحالت نوشته شده).

$data = json_decode(جیسون);

$lastName = $data->name->last;
$lastName = $data['name']['last'];

$age = $data->age;
$age = $data['age']

توضیح کد ربات :

- در خط های بعد ازتگ php تا ابتدای حلقه ی بی نهایت while (در این آموزش فرض شده که برنامه نویس مقدمات زبان php را که در این همین سایت ارایه شده است را فرا گرفته باشد) متغییرهایی به نام های baseUrl ، token و offset تعریف شده اند که به ترتیب محل ذخیره token ربات ، آدرس همواره ثابت ربات به همراه token لازم به ذکر است به این دلیل می گوییم همواره ثابت که تمامی متد ها بعد از این ادرس قرار می گیرند و دامنه ربات به میزانی که در این کد نوشته شده همواره ثابت است وبه جهت اینکه شاید بارها و بارها این مقدار از دامنه بات مورد استفاده قرار گیرد ما یک متغییر تعریف می کنیم و چندین بار از آن استفاده می کنیم (به اصطلاح Reuse) و متغییر سوم که در ادامه به توضیح آن می پردازیم.

Offset چیست ؟

- در این مثال ابتدا مقدار این متغییر 0 در نظر گرفته شده است و بعد از اجرای حلقه مقدار آن تغییر میکند در واقع offset همان مقدار update_id است (در قسمت سوم میتوانید با مراجعه به خروجی ربات بعد از start ، مقدار update_id را مشاهده کنید) که به صورت یک پارامتردر متد getUpdates مورد استفاده قرار می گیرد. اما چرا باید از این پارامتر استفاده کنیم؟ استفاده از این پارامتر به این دلیل مهم است که اگرتا به حال شما به خروجی جیسون ربات خود توجه کرده باشید شاید چندین پیام مختلف از چندین کاربر را به شما نشان دهد اما پردازش این پیام ها هنگامی که بیش از حد انتظار شوند ، سخت است. بهترین راه کار این است که شما پیام ها را به صورت واحدی (تکی) دریافت کنید که برای پردازش آنها به مشکل بر نخورید ! ، همانطور که در کد مشخص است این متغییر (offset) را با مقدار update_id مقدار دهی کرده ایم.

- حال قرار است که کاربران ربات ما هر آنچه به ربات ارسال کردند (البته در این قسمت پیام متنی فقط) را عینا به خودشان باز گردانیم ، وارد حلقه بی نهایت while میشویم ، این حلقه به این علت بی نهایت است که نباید تا مدتی که ما تعیین کرده ایم توقف کند(لازم به ذکر است در این مثال می توان با بستن پنجره مرورگر به اجرای کد خاتمه داد و همچنین می توان مقدار اجرای کد را به وسیله سرور محدود کرد و ... که هم اکنون سوژه مورد آموزش ما نمی باشد) ، مقدار اولیه offset صفر است و اولین پیام یا بعبارتی قدیمی ترین پیامی که به ربات ارسال شده را می توانیم با استفاده از متد getUpdates و پارامتر offset دریافت کنیم ، در زبان php برای گرفتن محتوای یک ادرس می توانیم از تابع file_get_contents استفاده و اگر مانند این خط از کد خروجی دارای ارزش بود ، آن را داخل یک متغییر ذخیره کنیم. به خاطر اینکه خروجی ما از نوع جیسون است با اطمینان خاطر آن را از قالب جیسون بوسیله تابع json_decode خارج کرده و تبدیل به یک آرایه و درنهایت دریک متغییر ذخیره می کنیم.

- در داخل این حلقه این حلقه دیگر وجود دارد که به ازای تعداد هر یک از اندیس های دارای نام result در آرایه بالا اجرا می شود ، با این کار دسترسی به اندیس های آرایه راحت تر انجام می گیرد (به دلیل اینکه مبحث این مقاله آموزش زبان php نمی باشد از توضیحات اضافه برای نحوه تعریف آرایه و دسترسی به اندیس های آن اجتناب میکنم) ، حال که توانستیم به مقادیرداخل آرایه دسترسی پیدا کنیم ابتدا باید مقدار offset را به مقدار واقعی تنظیم کنیم برای این کار مقدار update_id را گرفته (متغییر uId) یک واحد به آن اضافه می کنیم (متغییر offset) ، اما چرا؟ بدلیل اینکه ما باید بعد از پردازش این پیام ربات ، به پردازش پیام بعدی برویم لذا باید یک واحد به آن اضافه کنیم تا در اجرای بعدی حلقه while ، یک پیام جدید ربات را از تلگرام دریافت کنیم و با استفاده از دانش ساختار آرایه ی دریافتی و مهم بودن داشتن chat_id برای ارسال پیام به کاربر می توانیم chat_id کاربر را دریافت کنیم (متغییر chatId) ، بدلیل اینکه ربات ما وظیفه ارسال پیام مشابه پیام کاربر را دارد لازم است ، پیام کاربر را هم مانند chat_id دریافت و ذخیره کنیم (متغییر userMessage) ، حال کافی است متد sendMessage را با پارمترهای دریافت شده ، اجرا کنیم ، خواهید دید که پیام عینا به کاربر ارسال می گردد.

- لازم به ذکر است نمونه کد اجرایی قسمت چهارم ، در حال حاضر بر روی ربات زیر پیاده سازی شده است و شما می توانید با جستجوی ربات SokanAcademy_bot در تلگرام از آن استفاده کنید. در قسمت بعد به ساخت ربات آینه (فایل) می پردازیم.

پایان قسمت چهارم.

موفق باشید.