我试图使一个电报机器人将连接到RCON,但目前我被困在会话的使用,似乎他们没有保存.这是我目前为止的代码:
<?php
define('BOT_TOKEN', 'xx:xxxxxx');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');
//Start session
session_set_cookie_params(3600, "/");
session_start();
//read incoming info and grab the chatID
$content = file_get_contents("php://input");
$update = json_decode($content, true);
$chatID = $update["message"]["chat"]["id"];
$message = $update["message"]["text"];
$reply = "";
if (isset($_SESSION['AskIP'])){
$_SESSION = array('AskPort' => true,
'ip' => $message);
$reply = "Saved IP: ". $message ."Write the port";
}
else if (isset($_SESSION['AskPort'])){
$ip = $_SESSION['ip'];
$_SESSION = array('connected' => true,
'ip' => $ip,
'port' => $message);
$reply = "Now you are connected the rcon (".$_SESSION['ip']. ":". $_SESSION['port'].")! Type /disconnect to disconnect from the rcon!";
}
else if (substr($message, 0, 11) === "/disconnect" && strlen($message) == 11 && isset($_SESSION['connected'])){
$_SESSION['connected'] = false;
$reply = "Disconnected from". $_SESSION['ip'] .":". $_SESSION['port'];
$_SESSION = array();
session_destroy();
}
else if (substr($message, 0, 5) === "/rcon" && strlen($message) == 5) {
$_SESSION = array('AskIP' => true);
$reply = "Write the Server IP";
}
if (empty($reply))
return;
$sendto = API_URL."sendmessage?chat_id=".$chatID."&text=".$reply;
file_get_contents($sendto);
字符串
?>
在那一刻,它只工作时,你输入/rcon(和答复“写IP”,但在此之后没有答案,隐私设置已经被禁用。
2条答案
按热度按时间k10s72fa1#
最后我只使用了mysql。
r8xiu3jd2#
您需要了解,会话不是一顶不知从哪里获取用户数据的魔法帽子。它只是服务器上的键值存储,其中序列化数据存储在客户端提供的键 * 下。
在Web环境中,这样的密钥通常在 cookie 中传输。但Telegram不发送cookie。因此,您需要另一个源来标识客户端(在调用
session_start()
之前,必须将其输入session_id()
函数)。幸运的是,有很多。Telegram发送的信息包含,例如,聊天和id用户id。您可以使用任何一个,这是更好地服务于您的目的(虽然聊天ID更类似于一个会话ID)
唯一的诀窍是这样的id不能按原样使用,比如
字符串
因为它们的格式不是会话ID的正确格式。但只要你能让它看起来像PHP session id,即使是使用
str_pad()
这样愚蠢的方法,下面的代码将使session非常适用于Telegram webhooks:型
但现在你得想想,是否值得这么麻烦?会话机制的主要部分是发送和接收cookie。而剩下的部分只是一个键值存储。可以使用任何可用的数据库创建,例如Mysql或Redis。
因此,您只需获取聊天ID,对想要存储的数据进行json_encode,并使用您觉得方便的任何存储,而不是弄乱会话。