سلام مجدد ، خدمت شما دوستان عزیز و علاقه مندان به ربات تلگرام 

خب توی این پست در مورد WebHook صحبت میکنم. 

لطفا قبل از خواندن این پست , مطلب شماره یک را مطالعه کنید .- قسمت اول 

برای شما عزیزان یک مقاله اماده کردم که در ان  ngrok کاملا توضیح داده شده  و کانفیگ اش رو ویندوز را تعریف شده است .

خب بعد از اینکه Forward رو از طریق ngork انجام دادیم باید اون رو با متد WebHook ارسال کنیم به روباتمون ، در مقاله گفتم اینجا هم میگم ، اگر از WebHook استفاده کنید نمیشه از GetUpdates استفاده کرد ، برای اینکه دوباره از GetUpdates استفاده کنید باید متد WebHook رو با آرگومان url خالی ارسال کنید.

ببینید متد WebHook را :

کد:
https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/setWebhook?url=https://{Bot Page Address}

اون قسمت رو که با قرمز مشخص کردم محلی هست که روبات ما داخلشه ، من مثلا روباتم داخل پوشه ی index ئه لوکال هاست هست و Forward Address ام هم اینه : https://3d34ca81.ngrok.io

خب SetWebHook اینطوری میشه:

کد:
https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/setWebhook?url=https://3d34ca81.ngrok.io

خب ، اگر همه چیز درست باشه ، پاسخ اینه :

کد:
{
   "ok":true,
   "result":true,
   "description":"Webhook was set"
}

description میگه که Webhook تنظیم شد ، خب الآن چی شد دقیقا !؟ بذارید اینطوری بگم ، یک پیام میدم توی گروهی که روبات ام داخلش هست و پنل ngork رو میبینم :


خب دیدید چی شد !؟ تلگرام به ما درخواست داد ، نه ما به تلگرام :>
در حالی که در موردهای قبلی این ما بودیم که به تلگرام درخواست میدادیم (:

این باعث میشه روبات ما Real Time باشه ، نه اینکه ما همش Request بدیم ، اما درخت JSON متد WebHook با GetUpdates تفاوتایی داره ، مثلا والد Result وجود نداره.
بذارید همون مثلا قبلی رو انجام بدیم ، میخوایم وقتی گفته شد ، "سلام" ما بگیم "سلام. خوبی!؟"
اینجا دیگه نیاز نیست message_id رو نگه داریم ، چون WebHook هر 1 پیام مجزا رو Request میده.
الآن میخوام بر مبنای WebHook این برنامه رو بنویسیم :


کد PHP:
<?php
$update 
json_decode(file_get_contents('php://input'));
$message=$update->message->text;
if(
$message=="سلام"){
        
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("سلام. خوبی !؟")));
        echo 
"Ok";
}
?>


خط دوم باعث میشه هر دیتایی که به صورت POST دریافت میکنیم json_decode کنیم ، خط سوم متغیر پیام را با مقدار ولد text پر میکنه و خط چهارم اگر این متغیر برابر با "سلام" بود پیام "سلام. خوبی!؟" را ارسال میکنه به گروهی با chat_id مشخص شده :



و اما بحثی شد در مورد روبات تینا و اینکه چجوری به پیام کاربران جواب میده و تاحدودی باهاشون صحبت میکنه ، در مبحث هوش مصنوعی چیزی داریم به نام NLP که میشه Natural language processing ، که رایانه را طوری به عمل میاره که زبان نوشتاری و گفتاری رو بتونه تحلیل کنه و بر مبنای اون جواب بده ، 

برای PHP یک لایبری وجود داره ؛ من در آینده سعی میکنم که روی این مبحث مانور بدم اگر عمری بود!

حسن ختام این پست ، یک اسکریپت هست که مشابه اش رو کانال های IRC باید دیده باشید ، این اسکریپت به این صورته که یه کامند میدیم بهش ، مثلا "random/" ، بعد اسکریپت یک عدد رندوم مثلا از 1 تا 100 در متغیر ذخیره میکنه ، کاربران گروه پیام میدن و عدد رو حدس میزنن ، و روبات اگر عدد بالاتر از مقدار حدس زده باشه میگه : "برو بالا" و اگر پایین تر از مقدار حدس زده باشه میگه : "برو پایین"

الگوریتم به صورتیه که telegram متوالی و به صورت جداگانه در برابر هر PM به ما ریکوئست میده ، این یعنی متغیر رو باید جوری تعریف کنیم که مقدارش از دست نره ، راه اصولی این کار در PHP استفاده از apc cache یا Memcached هست ، اما من میام یک فایل txt درست میکنم و متغیر رو از اون میخونم.

اول باید بگیم بازی چجوری شروع بشه ، فرض کنید با کامند "randomgame/" میخوایم بازی رو شروع کنیم ، باید عدد رندوم را در یک فایل txt ذخیره کنیم که در دفعات بعدی ازش استفاده کنیم
در دفعات بعدی اول باید چک کنیم فایل var.txt خالی هست یا نه ، اگر خالی باشه یعنی اصلاً بازی شروع نشده ، پس نباید به پیام ها پاسخی بدیم ، اما اگر این فایل حاوی عدد بود ، و پیام کاربر هم فقط عدد بود کار شروع میشه ، اگر عددی که یوزر داده بود ، پایین تر از مقدار var.txt بود بگه : "برو بالا" ، اگر هم بالاتر بود ، بگه : "برو پایین"

کد PHP:
<?php
$update 
json_decode(file_get_contents('php://input'));
$message=$update->message->text;
$id=$update->message->message_id;
if(
$message=="/randomgame"){
    
$file fopen("var.txt","w");
    echo 
fwrite($file,rand(1,100));
    
fclose($file);
    
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("یه عدد انتخاب کردم ، اگه گفتی چیه !؟ :D")));
}else{
    if((
is_numeric($message)) && (filesize('var.txt') != 0) ){
        if(
$message<file_get_contents('var.txt')){
            
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("برو بالا")."&reply_to_message_id=".$id));
        }elseif(
$message>file_get_contents('var.txt')){
            
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("بیا پایین")."&reply_to_message_id=".$id));
        }elseif(
$message==file_get_contents('var.txt')){
            
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("آفرین درسته :)")."&reply_to_message_id=".$id));
            
file_put_contents("var.txt""");
        }
    }
}
?>

فقط یه چیزی هست ، اینجا یک پارامتر reply_to_message_id هم ارسال کردم به متد SendMessage که برای نقل قول به کار میره.


لینک مقابله ngrok

موفق و پیروز باشید 🌹


🌟 کپی بدون ذکر منبع حرام است ✨

 ◀️ Www.NewsAndroid.Blog.IR ➡️

 🎯 بروز ترین مرجع نرم افزاری 🎮