PDA

View Full Version : حرفه ای: ارسال دکمه برای ربات تلگرام



milad.biroonvand
جمعه 28 آبان 1395, 09:06 صبح
سلام
چطوری میشه کاری کرد که وقتی تلگرام از طریق وب هوک برای ما یک پیام فرستاد ما در جوابش چند تا دکمه (تلگرامی) برای بفرستیم و بهش اجازه بدیم با صفحه کلید روی یکی از این دکمه ها کلیک کنه؟

amin1softco
جمعه 28 آبان 1395, 12:08 عصر
برای ساخت دکمه در ربات باید یک همچین آدرسی را فراخوانی کنید با curl

https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&reply_markup={"inline_keyboard":[[{"text":"sitename","url":"http://google.com"}]]}

https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&reply_markup={"keyboard":[["button name"]],"resize_keyboard":true}


و کتابخانه زیاد هست روی جیت هاب برای استفاده

milad.biroonvand
جمعه 28 آبان 1395, 14:37 عصر
برای ساخت دکمه در ربات باید یک همچین آدرسی را فراخوانی کنید با curl

https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&reply_markup={"inline_keyboard":[[{"text":"sitename","url":"http://google.com"}]]}

https://api.telegram.org/bot{token}/sendmessage?chat_id=123456789&text=yourmessage&reply_markup={"keyboard":[["button name"]],"resize_keyboard":true}


و کتابخانه زیاد هست روی جیت هاب برای استفاده

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

amin1softco
جمعه 28 آبان 1395, 15:41 عصر
سایت خود تلگرام !! https://core.telegram.org/bots/api#available-methods
اینم برای کار با api ربات هر چیزی لازم داشته باشید پیاده سازی شده
https://github.com/akalongman/php-telegram-bot
(https://core.telegram.org/bots/api#available-methods)

saeed2922
شنبه 20 آبان 1396, 10:33 صبح
سلام کسی می تونی برای کد دکمه برگشت منو راهنمایی کنه یعنی وقتی روی برگشت کلیک میکنه به مرحله قبلی برگرده

thacker
شنبه 20 آبان 1396, 12:32 عصر
سلام کسی می تونی برای کد دکمه برگشت منو راهنمایی کنه یعنی وقتی روی برگشت کلیک میکنه به مرحله قبلی برگرده

سلام .
شما باید کاربرانی که با ربات کار میکنند رو توی دیتابیس ذخیره کنید و یک ستون برای ثبت جایگاه کاربر در رباتتون ایجاد کنید. مثلا کاربر وقتی صفحه اصلی ربات بود جایگاه رو H در نظر بگیرید. وقتی روی دکمه A کلیک کرد جایگاهش رو به A تغییر بدید توی دیتابیس . وقتی روی دکمه B کلیک کرد جایگاهش رو آپدیت کنید به B . حالا زمانی که روی دکمه برگشت کلیک کرد دوباره جایگاه رو آپدیت کنید به H و متن و منوی صفحه اصلی رو فراخوانی کنید.

sajjad.eskandary
شنبه 20 آبان 1396, 15:57 عصر
147025

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

sajjad.eskandary
شنبه 20 آبان 1396, 16:11 عصر
http://barnamenevis.org/attachment.php?attachmentid=147025&d=1510404926
از جدول باید بخونی همه چیز رو
اینطوری مشکل توهم حل میشه
مطالعه کنید اینو بازگشت هم هست توش

saeed2922
یک شنبه 21 آبان 1396, 08:44 صبح
قطعه کد اگه داشته باشی ممنون میشم

sajjad.eskandary
یک شنبه 21 آبان 1396, 09:07 صبح
از طریق کلاس 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();
}
}

sajjad.eskandary
یک شنبه 21 آبان 1396, 09:16 صبح
این هم پروسیجور 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 ;

sajjad.eskandary
یک شنبه 21 آبان 1396, 09:17 صبح
و این هم پروسیجور 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 ;

sajjad.eskandary
یک شنبه 21 آبان 1396, 09:19 صبح
پروسیجور 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 ;

sajjad.eskandary
یک شنبه 21 آبان 1396, 11:34 صبح
واسه inline هم فرقی نداره باید یه همچین چیزی بگی که :


if($this->command == 'InlineBtnName'){
//دستورات افزودن به علاقه مندی
}

sajjad.eskandary
یک شنبه 21 آبان 1396, 11:36 صبح
با این کد هم آنچه از تلگرام ارجاع داده میشه رو میتونی بگیری


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'];

JYasProgramer
سه شنبه 13 آذر 1397, 15:58 عصر
با این کد هم آنچه از تلگرام ارجاع داده میشه رو میتونی بگیری


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'];


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

hamid_diablo
یک شنبه 08 اردیبهشت 1398, 18:03 عصر
سلام دوستان

رباتی داریم که در صفحه اول چند دکمه داره
اگر بخوایم برای هر دکه زیر مجموعه داشته باشیم باید چه کدی رو با php اعمال کنیم؟




1
2
3
4

$mT = 'انتخاب کنید';
$op = array(array('کفش مردانه','کفش زنانه') , array('نقد و نظر و پیشنهادات'),array('سبد خرید','درباره ما'));

$telegram->sendMessage2($userid, $mT , $op );








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