ساخت ربات تلگرام با php: قسمت دوم (setWebhook و getUpdates)

نوشته شده توسط:
قسمت های دیگر این مطلب:

در قسمت قبل از آموزش با ربات‌های تلگرام و ایجاد ربات با Bot Father آشنا شدیم. در این آموزش کار را با برنامه نویسی به زبان PHP برای این ربات پیش می‌بریم.

برای ارتباط با ربات تلگرام دو متد وجود دارد. متد setWebhook و متد getUpdates.

متد setWebhook برای ارتباط با تلگرام:

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

مزیت بلادرنگ بودن، مزیتی مهم است که یک پیشنیاز دارد و آن هم داشتن دامنه‌ای با https است که در هیتوس راه کاری برای آن تعبیه شده است. به این صفحه رفته و از راهنمای موجود استفاده کنید.

متد getUpdates برای ارتباط با تلگرام:

در این متد درخواست‌های کاربران در سرور تلگرام ذخیره شده و ما باید در بازه‌های زمانی کوتاه از سرور تلگرام درخواست‌های کاربران را دریافت کنیم. مزیتی که این روش نسبت به setWebhook دارد در این است که نیازی به داشتن هاست یا سرور با https نداریم.

در ادامه هر دو متد را با هم بررسی می‌کنیم.

ابتدا مثالی از فعال کردن روش setWebhook بیان می‌کنیم. با الگوی زیر یک URL ساخته و آن را در مرورگر خود وارد می‌کنیم:

https://api.telegram.org/bot[TOKEN]/setWebhook?url=[URL]

در مثال فوق Token ربات خود را در [TOKEN] و آدرس فایل برنامه نویسی شده ارتباط با ربات در [URL] قرار می‌گیرد.

مثالی از پیاده سازی الگوی فوق:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook?url=https://hitos.ir/test/tlg.php

اگر دستور فوق را در مرورگر خود وارد کنیم با پیغامی مانند زیر دریافت می‌کنیم:

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

پیغام فوق یک آرایه JSON است که بیان می‌کند webhook با موفقیت ثبت شده است. وقتی عملیات webhook با موفقیت انجام شود سرور تلگرام تمامی درخواست‌های کاربران را به url‌ای که برای تلگرام اعلام کردیم ارسال می‌کند.

برای حذف کردن این webhook پارامتر [URL] را حذف کرده و در خواست را دوباره با مرورگر ارسال می‌کنیم:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook

الگوی پایین برای دریافت آخرین ارسال‌ها با کمک متد getUpdates است:

https://api.telegram.org/bot[TOKEN]/getupdates

مثال استفاده از این متد:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/getupdates

اگر این آدرس را درخواست دهیم، چیزی مشابه نتیجه زیر به نمایش در می‌آید:

{"ok":true,"result":[{"update_id":818742452,
"message":{"message_id":19,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471866230,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}]}

در بالا یک آرایه json از کل پیغام‌ها دریافت کردیم.

در ادامه قصد داریم عملیات دریافت اطلاعات با متد getupdate را با ذکر یک مثال به طور کامل شرح دهیم:

header('Content-Type: text/html; charset=utf-8');
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$url= "https://api.telegram.org/bot".$token."/getupdates";
$update= file_get_contents($url);
$arrayUpdate= json_decode($update, true);
var_dump($arrayUpdate);

در اولین سطر از هدر utf-8 استفاده کردیم تا بتوانیم رشته‌های فارسی را مشاهده کنیم.

با دستورات فوق عملیات دریافت update را با زبان php انجام دادیم. برای تمرین برای ربات خود متن بفرستید و با getUpdate پیغام‌ها را دریافت کنید. اگر در متن اسکریپت دریافتی از getUpdate دقت کنید خواهید دید username و نام کاربر و دستوراتی را که درخواست داده است را می‌توانید مشاهده کنید.
در پایین دستوراتی برای پیمایش پیغام‌ها مشاهده می‌کنید:

header('Content-Type: text/html; charset=utf-8');
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$url= "https://api.telegram.org/bot".$token."/getupdates";
$update= file_get_contents($url);
$arrayUpdate= json_decode($update, true);
foreach ($arrayUpdate['result'] as $key) {
    echo "update_id: ".$key['update_id']."<br>";
    echo "user name: ".$key['message']['from']['username']."<br>";
    echo "first name: ".$key['message']['from']['first_name']."<br>";
    echo "text: ".$key['message']['text']."<br>";
    echo "<br><br><br><br>";
}

نکته: قبلا از استفاده از getUpdate حتما getWebHook را غیر فعال کنید.

استفاده از متد getWebHook برای برنامه نویسی ربات:

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

در پایین آموزش را با getWebHook ادامه می‌دهیم، هر چند که حتی اگر شما از getUpdates استفاده تفاوت چندانی در اسکریپت‌ها وجود ندارد.

همانند اول آموزش با آدرس زیر فایل tlp.php را به عنوان اسکریپت دریافت کننده پیام‌های کاربران معرفی می‌کنیم:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook?url=https://hitos.ir/test/tlg.php

سورسی که در پیش رو دارید فایل tlg.php هاست است:

$message= file_get_contents("php://input");
file_put_contents("message.txt", $message);

تلگرام پیغام‌ها را با متد POST برای فایل معرفی شده با getwebhook ارسال می‌کند. برای یافتن متدهای موجود در پیغام ارسالی به فایل tlg.php سورس بالا را استفاده می‌کنیم. "php://input" کل پارامترهای دریافتی از post را دریافت می‌کند. در نهایت اطلاعات دریافتی در فایلی به نام message.txt در مسیر جاری ذخیره می‌شود. در پایین این مقدار خروجی را مشاهده می‌کنید:

{"update_id":818742456,
"message":{"message_id":23,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471875367,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}

با بررسی این رشته JSON به ساختار زیر دست پیدا می‌کنیم:

header('Content-Type: text/html; charset=utf-8');
$message= '{"update_id":818742457,
"message":{"message_id":24,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471876469,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}';
$message= json_decode($message, true);
echo "update_id: ".$message['update_id']."<br>";
echo "user name: ".$message['message']['from']['username']."<br>";
echo "first name: ".$message['message']['from']['first_name']."<br>";
echo "text: ".$message['message']['text']."<br>";
echo "<br><br><br><br>";

خروجی سورس بالا:

update_id: 818742457
user name: esmahdim
first name: سید مهدی
text: /aboutus

آشنایی با متد sendMessage:

متد sendMessage کار ارسال به کاربر را انجام می‌دهد:

https://api.telegram.org/bot[TOKEN]/sendMessage?chat_id=[CHAT_ID]&text=[TEXT]

در پایین سورس فایل tlg.php را به گونه‌ای تغییر می‌دهیم که پس از دریافت کاربر پاسخ مناسب را بدهد:

header('Content-Type: text/html; charset=utf-8');
$message= file_get_contents("php://input");
$arrayMessage= json_decode($message, true);
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$chat_id= $arrayMessage['message']['from']['id'];
$command= $arrayMessage['message']['text'];

if($command == '/start'){
    $text= "سلام، به ربات ما خوش آمدید";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else if($command == '/aboutus'){
    $text= "این متن برای آشنایی شما با ماست";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else{
    $text= "دستور شما نا معتبر است";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}

دستور بالا به سادگی ابتدا پیام کاربر را دریافت، از آن chat_id و command را دریافت می‌کند و url مناسب را برای ارسال پیام به کاربر می‌سازد.

نکته: کامند /start در تمامی روبات‌ها به صورت پیشفرض وجود دارد، پس بهتر است برای آن یک متن نمایشی پیش فرض ایجاد کنیم.

نکته: البته شرطی هم در سورس وجود دارد که برای پاسخ دهی به دستورات نا معتبر است.

همانطور که در بالا دیدید می‌توانید کامندهای دیگری برای بات خود تعریف کنید و برای هر کامند دستورات مناسب را ایجاد کنید.

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

تگ ها: messenger / پیام رسان ربات تلگرام / Telegram Bot تلگرام
نظر خود را برای این مطلب وارد کنید
دریافت خبرنامه
Lili

میدونم
منظورم اینه که وقتی از getUpdate استفاده کردم و پیام ها رو دریافت کردم،
با sendmessage میتونم جواب درخواست کاربرو بدم؟! یا حتما باید قبلش از getwebhook استفاده میکردم؟

پاسخ:

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

زهرا

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

پاسخ:

سلام

1- از صحت URL بات مطمین بشید.

2- ربات خودتون رو به شکل صحیح در سرویس webhook هیتوس ثبت کنید.

3- در ابتدا فقط کدهای نمونه رو اجرا کنید.

سجاد قربانی
سلام ممنون بابت اموزشتون
لطف میکنید در رابطه با اینلاین کوئری و اینلاین کیبرد هم مثال کوچیکی قرار بدید
همچنین ارسال لینک و فرمت دهی متن
mohammad

سلام، ممنون از آموزش هاتون، یه سوال داشتم من الان یه ربات نوشتم و با کد زیر نام کاربری و نام رو دریافت میکنم:

$df = file_get_contents("php://input");
file_put_contents("message.txt", $df);
$df = json_decode($df, true);
$name = $df['message']['from']['first_name'];
$username = $df['message']['from']['username'];

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

پاسخ:

سلام mohammad جان:

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

مهرشاد

خوب ببینید اگر هم من یک ربات ایجاد کنم و فرد عضو شوم چگونه میتونم شماره همراه طرف رو دریافت کنم که ببرم تو دیتابیس خودم و پیام مربوط به اونو واسش سند کنم با chat id که مقدار قابل ملاحظه ای یا شناسه ی ویزه ای دستم نمی یاد برای سرچ در کوئری بانک اطلاعاتی من ؟

چاره چیه

پاسخ:

سلام مهرشاد جان:

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

شما می تونید شماره رو مثلا از کاربر درخواست بدی و تو بانک اطلاعاتیت، شناسه کاربریت رو با شماره در یک ردیف ذخیره کنی.

در ضمن اگر برات مهمه که کاربر حتما شماره خودش رو وارد کرده باشه می تونی از تصدیق SMS استفاده کنی، به شکلی که یک پنل SMS با API دریافت کنی و وصلش کنی به ربات تلگرام.

saeed

سلام. منون از آموزشهای عالیتون.
من یکم گیج شدم، این کدهای پی اچ پی که برای متد getupdate نوشتید رو کجا باید وارد کنیم و بنویسیم. تلگرام از کجای اینارو فراخوانی میکنه؟؟؟؟

پاسخ:

سلام. این متد رو توی مرورگرتون هم اگه اجرا کنید نتیجه رو دریافت می کنید.

ali
بله مطمعنم چون ایدی پیام هارو میگیره
تست کردم خود آیدیو به جای متن پاسخ فرستاد اما ریپلای نمیزنه
ali
ممنونم از پاسختون مشکل حل شد.
جهت اطلاع دوستانی که ممکنه با مشکل مشابه با مشکل من روبرو بشن باید عرض کنم که در پیام پاسخ مقدار پارامتر $message که مقدار فرم ایدیو در خودش داره و به sendMessage فرستاده میشه مقدار دهی نشده بود و خالی ارسال میشد که اضافه کردم و مشل حل شد
رضا

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

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

$row['ch_tag'];
$row['ch_members'];

مثلا محتوای این جدول هارو هر کدوم بره به یک آرایه

پاسخ:

سلام رضا:

برای این بار باید از دستور mysqli_fetch_assoc استفاده کنید، اگر با این دستور آشنا نیستید یک سرچ ساده تو گوگل بزنید.

مصطفی

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

پاسخ:

سلام

ببینید شما کد شناسه هر کاربر و آی دی اونو می تونید از Json ای که از سمت تلگرام دریافت و ذخیره کنید.

مصطفی
در ضمن جهت اطلاع، بنده از webhook استفاده میکنم
مصطفی
سلام
قبلا پیام دادم، ظاهرا مشغول هستید، فقط خواستم تاکید کنم که این قسمت از سورس رو به شدت نیاز دارم و از مطالب شما نتونستم استفاده کنم، اگر ممکنه ما این کار رو برام انجام بدید یا راهنمایی کنید
به ایمیلم ارسال کنید
یوسفی
سلام میخواستم بدونم چطور تو send message از متد getupdate استفاده کنم
برنامه ای که تو صفحه گذاشتین با متد webhook نوشته شده
ممنون
mosi

سلام

چطوری در پیام ارسالی بین خطوط فاصله بندازم؟

مثلا وقتی مینویسم

"تست 1

تست 2

"

اینطوری ارسال میشه = "تست 1 تست 2"

من میخوام به شکل اولی ارسال بشه

پاسخ:

از urlencode استفاده کنید:

$txt = urlencode("line one\n line two \n line three");
کیوان

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

پاسخ:

سلام

منتظر باشید نسخه جدید دوره آموزش ربات تلگرام به زودی منتشر می شه.

محمد

سلام
اینجانب از متد webhook استفاده کردم. و طبق آموزش جلو رفتم. پیام ست شدن رو هم گرفتم:
ok true
result true
description "Webhook was set"
اما وقتی تو ربات دستور رو اجرا می کنم چیزی به کاربر نشون نمیده
لطفا راهنمایی کنید

پاسخ:

سلام

ورودی هاتون رو چک کنید، چون کار سختی نیست.

سعی کنید از کدهای نمونه تو سایت استفاده کنید.

ابوالفضل

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

پاسخ:

سلام. باید با id پیام ها رو پیمایش کنید.

محمدرضا

سلام

من کد های سمپلی که تو آموزش هست رو اجرا میکنم

و فقط توکن رو جایگزین میکنم

اما در ارور لاگ توی cpanel این ارور رو دریافت میکنم :

[28-Oct-2017 13:57:29 UTC] PHP Warning: file_get_contents(https://api.telegram.org/bot436184842:AAGc0XFkLkAg3.../sendMessage?chat_id=109001394&text=نام یکی از شعرای بزرگ ایرانی را انتخاب کنید&reply_markup={"keyboard":[["\/Ferdowsi","\/Mawlawi","\/Hafez","\/Rudaki"]]}): failed to open stream: Connection timed out in /home/.../public_html/bot.php on line 27
[28-Oct-2017 13:57:59 UTC] PHP Warning: file_get_contents(https://api.telegram.org/bot436184842:AAGc0XFkLkAg3.../sendMessage?chat_id=109001394&text=سلام، به ربات ما خوش آمدید): failed to open stream: Connection timed out in /home/.../public_html/bot.php on line 13
[28-Oct-2017 13:59:40 UTC] PHP Warning: file_get_contents(https://api.telegram.org/bot436184842:AAGc0XFkLkAg3.../sendMessage?chat_id=109001394&text=این یک متن درباره ماست): failed to open stream: Connection timed out in /home/.../public_html/bot.php on line 17
پاسخ:

سلام

باید سورستون رو دقیق کنید و ببینید عیب کار کجاست.

مصطفی

سلام
من همه مراحل رو بدرستی در مورد webhook انجام دادم اما ارور دارم

وقتی که وضعیت webhook رو چک میکنم در توضیح ارور میگه:

Wrong response from the webhook: 301 Moved Permanently

چطور میتونم برطرفش کنم.

پاسخ:

کجا این خطا رو دریافت کردید؟

مصطفی

در خود تلگرام هیچ واکنشی نشون نمیده

وقتی از تابع getWebhookInfo استفاده میکنم که وضعیت رو چک کنم این جواب رو میبینم.

{"ok":true,"result":{"url":"https://mydomain.com/hook.php/token","has_custom_certificate":false,"pending_update_count":57,"last_error_date":1487580943,"last_error_message":"Wrong response from the webhook: 301 Moved Permanently","max_connections":40}}
پاسخ:

من سورس و هاستتون رو ندارم تا بتونم بهتر راهنمایی کنم، ولی ورودی ها رو از اول چک کنید.

کلا در ابتدا ببینید webHook رو درست تعریف کردید؟ تو مرورگر آدرس زیر رو بزنید ببینید تعریف شده است یا خیر:

https://api.telegram.org/bot[TOKEN]/setWebhook

به جای [token] باید توکن خودتون رو بذارید.

مصطفی

من دقیقا از کدهای حودتون استفاده کردم و token رو جایگذین کردم.

آدرس webhook هم درست هستش و فعال

میشه مشکل از ssl باشه؟

پاسخ:

آدرس URL رو با دقت بیشتری وارد کنید و امتحان کنید.

مصطفی

سلام

مشکل من هم حل شد.

برای راهنمایی دوستان باید بگم که آدرس سایت و صفحه مورد نظرتون رو با دقت تمام وارد کنید ، حتی www رو.

elahe

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

ممنون میشم جواب بدین

پاسخ:

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

روحی

سلام
یه سوال:
برای ارسال عکس باید چکار کنیم؟

پاسخ:

سلام

قسمت چهارم رو ببینید.

علی

سلام من Ssl سایتم کامل درسته و پیام ها تحویل داده میشن
مثال اول کاملا درست کار می کنه و هر پیام که میاد توی فایل ذخیره میشه
اما مثال دوم که به کاربر جواب ارسال می کنه کار نمی کنه . لینک جواب رو دستی تو مرورگر وارد کردم کار کرد ورژن php هم 4 هست .

پاسخ:

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

Abolfazl

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

پاسخ:

سلام

سورس آخر کامل است.

ابوالفضل

من وب هوکو ست کردم. از این کد هم استفاده کردم, ولی یازم کار نميکنه....

$message= file_get_contents("php://input");
file_put_contents("message.txt", $message);
پاسخ:

باید ورودی ها رو دوباره چک کنید و ببینید کجا کارتون اشکال داشته.

Abolfazl
با یه ربات دیگه مشکل حل شد!
علی

با سلام
با تشکر از آموزش خوبتون و خسته نباشید
من تمام مراحلی که گفته بودین رفتم با setWebhook هم در تلگرام ثبتش کردم و OK هم داد ولی کلا وقتی که در تلگرام دستور به بات می فرستم تو هاست فایل را نمی خونه دو تا تیک کنار پیغام فرستاده شده میزاره.وقتی قسمت URL در setWebhook را توی براوزر مینویسم اجرا میشه. توی سایت هم SSL/TLS را نصب کردم.

پاسخ:

ورودی هاتون رو چک کنید و سعی کنید با مثال های پایه برید جلو و ببینید تو دستورات ساده هم می تونید با ربات کار کنید یا خیر.

mehran

سلام . ممنون بابت آموزش خوبتون

من کارهایی که گفتید رو انجام دادم ولی وقتی از setwebhook استفاده میکنم فقط یه پیغام بهم میده که این وب هوک وجود داره

برای گرفتن پیام ها از getwebhook استفاده کردم که خطا میده این متود وجود نداره . میشه راهنمایی کنید؟

پاسخ:

سلام

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

علی
با سلام و خسته نباشید
مشکل حل شد ممنون
مشکل از ssl سایت بود که key نامعتبر بود
علی

سلام من همه کارها رو کردم و ربات رو به هاست وصل کردم ولی وقتی به ربات پیام میدم در هاست یه فایل error_log ایجاد میشه و دراون این جملات رو نوشته

[01-Apr-2017 04:07:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/robot/public_html/robot/telegram.php on line 13
[01-Apr-2017 04:07:55 UTC] PHP Warning: file_get_contents(https://api.telegram.org/bot307300025:AAFbft5ukuurfwgaF395hdv73kj2Ft1JW7qw9/sendMessage?chat_id=176311954&text=سلام، به ربات ما خوش آمدید): failed to open stream: no suitable wrapper could be found in /home/robot/public_html/robot/telegram.php on line 13

لطفا راهنمایی کنید باتشکر.

پاسخ:

سلام

باید نمونه سورستون رو ببینم.

امید

سلام،
کدهای php رو کجا باید بزنیم؟

header('Content-Type: text/html; charset=utf-8');
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$url= "https://api.telegram.org/bot".$token."/getupdates";
$update= file_get_contents($url);
$arrayUpdate= json_decode($update, true);
var_dump($arrayUpdate);

 

پاسخ:

سلام

این ها کدهای PHP هستند، اگر با این برنامه نویسی آشنا نیستید مطلب https://hitos.ir/go/49 رو به طور کامل بخونید.

jamshidi

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

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

برای اینکه آخرین id جدید ترین پیام رو بگیرم چه راهکاری می دهید

چون با هر بار رفرش در فایل php یا اجرا در cronjob کلیه دستورات از قبل ارسال شده در ربات هم دوباره پردازش میشه

در صورتی که ما همیشه جواب آخرین پیام را در ربات میدهیم

پاسخ:

سلام

استفاده از متد getUpdate به این دلیل پیچیده است که باید id آخرین پیام دریافتی رو ذخیره کنید تا اشتباه نشه. برای ذخیره اطلاعات می تونید از دیتابیس استفاده کنید.

محمد

سلام خسته نباشید
من به کمک آموزش های شما یک ربات درست کردم و کد نویسی کردم چون ssl ندارم از getupdate استفاده کردم و کران جاب
الان توی کرون جاب فایلم هر 1 ثانیه یکبار اجرا میشه
و آخرین دستور کاربر توی ربات گرفته میشه(getUpdates?offset=-1) و پردازش میشه و نتیجش بهش ارسال میشه
منتها ایرادی که داره اینه که اگر کاربر پیام جدیدی وارد نکنه هم همینجوری هر 1 ثانیه آخرین رکورد پردازش میشه و به کاربر نتیجش ارسال میشه
راهکاری برای این دارید؟

پاسخ:

سلام

شما جواب رو برای هر پیام با شناسه منحصر به فرد فقط یک بار ارسال کنید.

amir

سلام با تشکر از توضیحاتتون

تو متد getupdates دستورات php رو کجا مینویسید و ذخیره میکنید؟

پاسخ:

سلام

تمام دستورات PHP باید توسط یک یک وب سرور در سیستم شما و یا یک هاست اینترنتی اجرا شوند. لطفا این آموزش رو مشاهده کنید: https://hitos.ir/go/49

saeed

سلام

کد های php مربوط به متد getUpdates رو کجا وارد کنیم؟در مرورگر؟

منظورم این کد ها هستند

header('Content-Type: text/html; charset=utf-8');

$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xR19Sc6E";

$url= "https://api.telegram.org/bot".$token."/getupdates";

$update= file_get_contents($url);

$arrayUpdate= json_decode($update, true);

var_dump($arrayUpdate);
پاسخ:

سلام دوست عزیز

این کدها باید در یک فایل PHP ذخیره و توسط یک وبسرور اجرا بشه.

برای آشنایی با PHP به این لینک مراجعه کنید: https://hitos.ir/go/49

saeed

سلام.

مطالب سایت شما عالی هست.

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

پاسخ:

سلام

پاسخ سوالتون رو در بخش سوال و جواب سایت هیتوس مشاهده کنید: https://hitos.ir/question/12

ALi

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

header('Content-Type: text/html; charset=utf-8');
$message= file_get_contents("php://input");
$arrayMessage= json_decode($message, true);
$token= "354250115:AAEpXAijJ0zNYvIJdBr4narypbE-EGJKsd0";
$chat_id= $arrayMessage['message']['from']['id'];
$command= $arrayMessage['message']['text'];

if($command == '/start'){
    $text= "سلام، به ربات ما خوش آمدید";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else if($command == '/aboutus'){
    $text= "این متن برای آشنایی شما با ماست";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else if($command == '/charge'){
    $text= "نوع شارژ مورد نظر خود را انتخاب کنید";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else{
    $text= "دستور شما نا معتبر است";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}

 

پاسخ:

سلام

به احتمال زیاد مشکل از ارتبات با تلگرامه.

اگر مشکلی دارید می تونید از هاست معمولی و راه کار تلگرام هیتوس استفاده کنید: https://hitos.ir/telegram

Fati

سلام من واقعا از این آموزشتون خیلی ممنونم!!

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

(امیدوارم تونسته باشم منظورمو رسونده باشم! )

پاسخ:

سلام

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

آریا

سلام آقای مهندس موسوی من میخوام ی ربات بنویسم که محاسبات مهندسی انجام بده مثل این ربات :@AsansorBot

میخواستم بدونم چه جوری هنچین ربات بنویسم اگه امکان داره جواب بدید

ممنون

پاسخ:

سلام

تا چند وقت دیگه آموزشی در سایت منتشر می شه برای برنامه نویسی حرفه ای ربات های تلگرام.

منتظر باشید از طریق ایمیل اطلاع رسانی کنید.

جواد قصاب

سلام. برای دریافت کپشن تصویر یا چیز های دیگه که در فایل دریافت شده در قالب json دریافت شده باید چیکار کرد؟ دریافت یعنی اینکه بتونم تو یه متغیر ذخیره کنم

پاسخ:

سلام

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

Fati

سلام

واقعا از پاسخگوییتون ممنونم

یه سوال دیگه ک داشتم اینه ک تابع

file_get_contents("php://input");

همه ی آپدیت ها رو دریافت میکنه یا فقط اخرینشو؟

اگه که همه رو دریافت میکنه میشه بگین چجوری اخریو دریافت کنیم؟؟

پاسخ:

سلام

با این دستور تمام اطلاعاتی که به صورت Post براتون ارسال شده رو می تونید دریافت کنید.

سینا

سلام

من از سی پنل استفاده می کنم.مثال هر دو روش رو روی هاستم امتحان کردم.تو روش getupdate رو لوکال جواب گرفتم اما رو هاست مقدار null رو بر میگردونه.فکر می کنم تابع file_get_contents غیرفعال شده.تو روش webhook پیام دریافت می شه و فایل متنی ساخته و مقداردهی می شه با درخواست جدید اما پاسخ برای کاربر ارسال نمی شه.

راهنمایی بفرمایید لطفا

پاسخ:

سلام

شما می تونید از سرویس webhook هیتوس استفاده کنید. از مثال های موجود در این صفحه https://hitos.ir/telegram استفاده کنید و جز Token چیز دیگه ای رو عوض نکنید.

محمدرضا

سلام

من میخوام ربات از کاربر لینک فایل صوتی دریافت کنه؛

بعد اونو توی هاست، دانلود کنه و بعد فایلش رو بفرسته به کاربر... (لینک بگیر ---> فایل بده)

لطفا راهنماییم کنید...

محمد حسن

سلام
فرض کنیم با رباط تلگرام عکسی به کانال تلگرام فرستادم
حالا سوال اینه که چطوری میشه عکسی که به کانال فرستادم را در مرورگر وب ببینم؟
و یا حتی دانلود کنم
ممنون

پاسخ:

سلام

در آینده نزدیک چنین آموزشی به سایت اضافه می شه.

saeid

سلام ممنون از آموزش خوبتون
من وقتی دستور آپدیت(getupdates) رو اجرا میکنم خروجی بهم NULL میده. ممنون میشم کمک کنید.

پاسخ:

سلام

ممنون از ابراز لطفتون.

جواب سوال شما در بخش سوال و جواب هیتوس درج شد.

هادی

سلام

ببخشید من از https://hitos.ir/telegram این قسمت و وب هوک هیتوس استفاده کردم ولی باز مشکلم حل نشد.

نمیدونم چرا؟

ارور زیر رو میده، فکر کنم اصلا file_get_contents اجرا نمیشه که chat id بهم بده.

Warning: file_get_contents(https://api.telegram.org/bot4564784924:AAGt9TpN8o5pR2vanEJK4BbTHiPSeo89_7g/sendMessage?chat_id=&text=سلام، به ربات من خوش آمدید): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /storage/ssd3/566/2119566/public_html/bot/newbot/index.php on line 8
پاسخ:

سلام

رباتتون رو ابتدا با کدهای موجود در آموزش پیاده سازی کنید و فقط TOKEN رو جایگذاری کنید. بعد مرحله به مرحله ربات رو تغییر بدید و ببینید عیب کار کجاست.

هادی

سلام

من دقیقا مرحله به مرحله جلو رفتم.

تو قسمت getUpdates هم هیچی چاپ نمیکنه.

البته echo $url رو توی کدم اضاف کردم بعد جواب داد نمیدونم چرا ولی تو قسمت webHook هر کاری میکنم chat id رو میگه خالیه.

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

چون ریپورت هستم فک کنم عمل نمیکنه.

پاسخ:

سلام

پاسخ مشکل رو براتون ارسال کردم.

محمدرضا

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

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

بسیار عالی بودند...

الان مشکلی که برای من پیش اومده اینه که؛

اگر کاربر ارسال کرد: /name ====> براش بفرستم: نام خود را ارسال کنید

اگر کابر ارسال کرد: /family ====> براش بفرستم: نام خانوادگی ارسال کنید

حالا چجوری message هایی که کاربر در جواب درخواست ربات میفرسته ذخیره کنم؟

چون هر message که ارسال میشه، صفحه php ما از نو خونده میشه و کامند قبلی از بین میره.

راحت تر بگم: (با ارسال هر Message دستورات php مرحله به مرحله اجرا میشن ولی منتظر Message بعدی کاربر نمیشن)

با تشکر

پاسخ:

سلام

سوال خوبی پرسیدید، ببینید وظیفه ربات تلگرام فقط انجام ارتباطه و ما بقی امور باید سمت سرور و هاست انجام بشند.

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

درآینده نه چندان دور آموزشی در این زمینه در سایت منتشر می کنم.

محمد

سلام خسته نباشید
چه جوری میشه چک کرد که فردی در کانال عضو شده تا دکمه هارو براش نمایش دهیم؟

پاسخ:

سلام

این مباحث کمی پیچیده هستند، در آینده آموزشی از این مورد در سایت قرار می گیره.

alli

سلام هر کاری می کنم توی error_log اینو میده

PHP Warning: file_get_contents(https://api.telegram.org/bot944959347:AAER59G--3BLKs6L1jTHI8Ew6EWPyPmHTPA/sendMessage?chat_id=54925357&text=لطفا یکی از حالات را انتخاب کنید.): failed to open stream: Connection timed out in /home/partoray/public_html/robots/robots.php on line 27

مقدور هست براتون کمکم کنید؟

پاسخ:

سلام

امکان این قضیه وجود نداره، چون این خروجی فقط در صورتی نمایش داده می شه که شما این فایل رو توی مرورگر اجرا کنید.

اساس کار ربات به این شکله که از سمت سرور تلگرام یک Post به صورت Json دریافت می شه و سورس شما این فایل رو پردازش می کنه.

Lili

سلام مرسی از آموزش عالی
میشه یکم زود به سوالم جواب بدین!؟

قسمت sendMessage و میشه برای متد getupdate هم استفاده کرد؟

پاسخ:

سلام

getUpdate تنها برای دریافت پیام هاست.

موضوعات بخش برنامه نویسی و نرم افزار

مطالب برگزیده برنامه نویسی php

مطالب برگزیده سایت