سلام
چطوری میشه کاری کرد که وقتی تلگرام از طریق وب هوک برای ما یک پیام فرستاد ما در جوابش چند تا دکمه (تلگرامی) برای بفرستیم و بهش اجازه بدیم با صفحه کلید روی یکی از این دکمه ها کلیک کنه؟
سلام
چطوری میشه کاری کرد که وقتی تلگرام از طریق وب هوک برای ما یک پیام فرستاد ما در جوابش چند تا دکمه (تلگرامی) برای بفرستیم و بهش اجازه بدیم با صفحه کلید روی یکی از این دکمه ها کلیک کنه؟
برای ساخت دکمه در ربات باید یک همچین آدرسی را فراخوانی کنید با curl
https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&rep ly_markup={"inline_keyboard":[[{"text":"sitename","url":"http://google.com"}]]}
https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&rep ly_markup={"keyboard":[["button name"]],"resize_keyboard":true}
و کتابخانه زیاد هست روی جیت هاب برای استفاده
سایت خود تلگرام !! https://core.telegram.org/bots/api#available-methods
اینم برای کار با api ربات هر چیزی لازم داشته باشید پیاده سازی شده
https://github.com/akalongman/php-telegram-bot
آخرین ویرایش به وسیله amin1softco : جمعه 28 آبان 1395 در 16:11 عصر
سلام کسی می تونی برای کد دکمه برگشت منو راهنمایی کنه یعنی وقتی روی برگشت کلیک میکنه به مرحله قبلی برگرده
سلام .
شما باید کاربرانی که با ربات کار میکنند رو توی دیتابیس ذخیره کنید و یک ستون برای ثبت جایگاه کاربر در رباتتون ایجاد کنید. مثلا کاربر وقتی صفحه اصلی ربات بود جایگاه رو H در نظر بگیرید. وقتی روی دکمه A کلیک کرد جایگاهش رو به A تغییر بدید توی دیتابیس . وقتی روی دکمه B کلیک کرد جایگاهش رو آپدیت کنید به B . حالا زمانی که روی دکمه برگشت کلیک کرد دوباره جایگاه رو آپدیت کنید به H و متن و منوی صفحه اصلی رو فراخوانی کنید.
7.png
من دارم روی یک سیستم مدیریت ربات های تلگرام کار میکنم ..
این جدولی که توی عکس میبینید میتونه دستورات و دکمه های بی نهایت ربات رو کنترل بکنه ...
اضافه کنه .. کم کنه ...
همه دستورات در واقع از اینجا هدایت میشن
از جدول باید بخونی همه چیز رو
اینطوری مشکل توهم حل میشه
مطالعه کنید اینو بازگشت هم هست توش
قطعه کد اگه داشته باشی ممنون میشم
از طریق کلاس BotCommand به اون جدولی که عکسش رو گذاشتم میتونی دسترسی داشته باشی ..
این کلاس پایین خیلی به دردت میخوره
این کد ها بعد از کلی آزمون خطا به دستم اومده ها ...
واقعا هم تجربی هست کسی پیدا نشد کمکم کنه ...
ولی خواهشم اینه که به کسایی که واقععا برنامه نویس هستن نشر بدین اگه خواستین ..
نه به جوجه برنامه نویس ها ..
چون اونا کاره مارو همیشه میبرن زیر سوال
با تشکر
class WorkAlertBot extends MainBot{
private $MainKeyboard;
private $Notifire;
private $bot_id;
private $bot_username;
private $token;
private $chat_id;
private $command;
private $AccLvl;
public function __construct($BotId,$BotUsername,$BotToken,$ChatId, $Command,$AccLvl){
$this->bot_id = $BotId;
$this->bot_username = $BotUsername;
$this->token = $BotToken;
$this->chat_id = $ChatId;
$this->command = $Command;
$this->AccLvl = $AccLvl;
require_once BOT_ENTITIES.'BotCommand.php';
$ObjBotCommand = new \bot\BotCommand();
$ResBotCommand = $ObjBotCommand->GetCommands($this->chat_id,$this->AccLvl,$this->bot_id,$this->command);
while($array = $ResBotCommand->fetch_array() ){
$BotCommandRows[] = $array;
}
if(isset($BotCommandRows[0])){
foreach($BotCommandRows as $BotCommandRow){
if($this->command == $BotCommandRow['Command'] ){
if( !is_null($BotCommandRow['ChildId'] ) ) {
$ResBotKeyboard = $ObjBotCommand->GetBotKeyboard($BotCommandRow['ChildId']);
if(isset($BotKeyboardRows))unset($BotKeyboardRows) ;
while($array = $ResBotKeyboard->fetch_array()){
$BotKeyboardRows[]=$array;
}
if(isset($BotKeyboardRows[0])){
foreach($BotKeyboardRows as $BotKeyboardRow){
$keys[]=$BotKeyboardRow['Command'];
}
}
$keyboard = array(
'keyboard' => array( $keys ),
'resize_keyboard' => true );
}
if(isset($keyboard)){
$this->MainKeyboard= "&reply_markup=".json_encode($keyboard);
unset($keyboard);
}else $this->MainKeyboard = "";
$text= $BotCommandRow['Cm'];
$url= "https://api.telegram.org/bot".$this->token."/sendMessage?chat_id=".$this->chat_id."&text=".$text.$this->MainKeyboard;
file_get_contents($url);
$f = 1;
break;
}
}
}
else{
$ResFunction = $ObjBotCommand->GetFunction($this->bot_id,$this->chat_id);
$FetFunction = $ResFunction->fetch_object();
if (strpos($BotCommandRow['ChildId'], ',') === false && isset($FetFunction->Command)){
$this->{$FetFunction->Command}($this->bot_id,$this->chat_id,$this->command);
}
}
if(!isset($f)){
$text= "متوجه نشدم \xF0\x9F\x98\xB3";
$url= "https://api.telegram.org/bot".$this->token."/sendMessage?chat_id=".$this->chat_id."&text=".$text;
file_get_contents($url);
}
}
private function InsertNationalcode($BotId , $ChatId ,$Command ){
$this->MysqliConnect();
$this->mysqli->query("CALL InsertNationalcode( $ChatId , '$Command' )");
$this->mysqli->close();
}
}
این هم پروسیجور mysql هستش که تابع GetFunction که توی کدم هست این پروسیجور رو فراخوانی میکنه
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetFunction`(IN `bot_id` INT, IN `chat_id` INT)
BEGIN
SELECT Command FROM BotRequests
INNER JOIN BotCommands ON BotCommands.Id = BotRequests.CommandId
INNER JOIN BotProccess ON BotProccess.Id = BotRequests.ProcessId
WHERE BotId = bot_id AND ChatId = chat_id AND IsFunction = 1 AND( BotProccess.IsFinished IS NULL OR BotProccess.IsFinished = 0 );
END$$
DELIMITER ;
و این هم پروسیجور GetCommands
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetCommands`(IN `AccLvl` INT, IN `DBotId` INT, IN `Cmd` VARCHAR(60), IN `chat_id` INT)
BEGIN
DECLARE parent_id int DEFAULT 0 ;
DECLARE _count int DEFAULT 0 ;
DECLARE proccess_id int DEFAULT 0 ;
DECLARE command_id int DEFAULT 0 ;
SELECT COUNT(1)
INTO _count
FROM BotCommands
WHERE BotId = DBotId
AND AccessLevel >= AccLvl
AND Command = Cmd
AND ( IsFunction = 0 OR IsFunction IS NULL );
IF _count > 0 THEN
SELECT COUNT(ParentId)
INTO parent_id FROM BotCommands
WHERE BotId = DBotId AND AccessLevel >= AccLvl
AND Command = Cmd
AND ( IsFunction = 0 OR IsFunction IS NULL );
IF parent_id = 0 THEN
SELECT Id
INTO command_id FROM BotCommands
WHERE BotId = DBotId AND AccessLevel >= AccLvl
AND Command = Cmd
AND ( IsFunction = 0 OR IsFunction IS NULL );
INSERT INTO BotProccess (Name,BotProccess.Datetime)
VALUES ( concat('bot:',DBotId,'cmd:',Cmd ) , NOW() );
SELECT LAST_INSERT_ID() INTO proccess_id ;
INSERT INTO BotRequests
(ChatId,ProccessId,BotId,CommandId,RegDatetime)
VALUES (chat_id,proccess_id,DBotId,command_id,NOW());
ELSEIF parent_id > 0 THEN
SELECT BotRequests.ProccessId , BotRequests.CommandId
INTO proccess_id , command_id
FROM BotRequests
INNER JOIN BotCommands
ON BotCommands.Id = BotRequests.CommandId
INNER JOIN BotProccess
ON BotProccess.Id = BotRequests.ProccessId
WHERE BotRequests.Id IN
(SELECT MAX(BotRequests.Id)
FROM BotRequests
INNER JOIN BotCommands
ON BotCommands.Id = BotRequests.CommandId
INNER JOIN BotProccess
ON BotProccess.Id = BotRequests.ProccessId
ORDER BY BotRequests.Id DESC)
ORDER BY BotRequests.Id DESC ;
INSERT INTO BotRequests
(ChatId,ProccessId,BotId,CommandId,RegDatetime)
VALUES (chat_id,proccess_id,DBotId,command_id,NOW());
END IF;
END IF;
IF AccLvl = 1 THEN
SELECT Id , Command , Cm , ParentId,ChildId , BotId FROM BotCommands WHERE ParentId >= 0 AND Command = Cmd AND ( IsFunction = 0 OR IsFunction IS NULL );
ELSEIF DBotId > 0 AND AccLvl = 2 THEN
SELECT Id ,Command , Cm , ParentId ,ChildId, BotId FROM BotCommands WHERE BotId = DBotId AND AccessLevel >= AccLvl AND Command = Cmd AND ( IsFunction = 0 OR IsFunction IS NULL );
ELSEIF DBotId > 0 AND AccLvl = 3 THEN
SELECT Id , Command , Cm , ParentId,ChildId , BotId FROM BotCommands WHERE AccessLevel >= AccLvl AND BotId = DBotId AND Command = Cmd AND ( IsFunction = 0 OR IsFunction IS NULL );
END IF;
END$$
DELIMITER ;
پروسیجور GetBotKeyboards
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetBotKeyboard`(IN `child_id` VARCHAR(60))
NO SQL
BEGIN
SELECT Command FROM BotCommands WHERE
FIND_IN_SET(Id, child_id) > 0;
END$$
DELIMITER ;
واسه inline هم فرقی نداره باید یه همچین چیزی بگی که :
if($this->command == 'InlineBtnName'){
//دستورات افزودن به علاقه مندی
}
با این کد هم آنچه از تلگرام ارجاع داده میشه رو میتونی بگیری
header('Content-Type: text/html; charset=utf-8');
$message = file_get_contents("php://input");
$arrayMessage = json_decode($message, true);
$this->chat_id = $arrayMessage['message']['from']['id'];
$this->Username = isset($arrayMessage['message']['from']['username'])?$arrayMessage['message']['from']['username']:'';
$this->Firstname = isset($arrayMessage['message']['from']['first_name'])?$arrayMessage['message']['from']['first_name']:'';
$this->Lastname = isset($arrayMessage['message']['from']['last_name'])?$arrayMessage['message']['from']['last_name']:'';
$this->command = $arrayMessage['message']['text'];
البته لازم به ذکر است که در مدل inline باید شما یک message_id هم موقع بازگشت دریافت بکنید
راجع به کدش مطمئن نیستم جای دقیقش رو ولی یه همچین چیزی باید باشه
$this->message_id = $arrayMessage['message']['message_id'];
آخرین ویرایش به وسیله sajjad.eskandary : یک شنبه 21 آبان 1396 در 11:49 صبح دلیل: توضیحات تکمیلی
سلام دوستان
رباتی داریم که در صفحه اول چند دکمه داره
اگر بخوایم برای هر دکه زیر مجموعه داشته باشیم باید چه کدی رو با php اعمال کنیم؟
1
2
3
4$mT = 'انتخاب کنید';
$op = array(array('کفش مردانه','کفش زنانه') , array('نقد و نظر و پیشنهادات'),array('سبد خرید','درباره ما'));
$telegram->sendMessage2($userid, $mT , $op );
این کد صفحه نخست ربات
اگر بخوایم برای دکمه " کفش مردانه" سه دکمه زیر مجموعه به نام " اسپرت" و "مجلسی" و "صندل" داشته باشیم باید چه کدی بزنیم؟