php 使用会话进行Telegram bot webhook

oyt4ldly  于 10个月前  发布在  PHP
关注(0)|答案(2)|浏览(53)

我试图使一个电报机器人将连接到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”,但在此之后没有答案,隐私设置已经被禁用。

k10s72fa

k10s72fa1#

最后我只使用了mysql。

r8xiu3jd

r8xiu3jd2#

您需要了解,会话不是一顶不知从哪里获取用户数据的魔法帽子。它只是服务器上的键值存储,其中序列化数据存储在客户端提供的键 * 下。
在Web环境中,这样的密钥通常在 cookie 中传输。但Telegram不发送cookie。因此,您需要另一个源来标识客户端(在调用session_start()之前,必须将其输入session_id()函数)。
幸运的是,有很多。Telegram发送的信息包含,例如,聊天和id用户id。您可以使用任何一个,这是更好地服务于您的目的(虽然聊天ID更类似于一个会话ID)
唯一的诀窍是这样的id不能按原样使用,比如

session_id($data['message']['chat']['id']);

字符串
因为它们的格式不是会话ID的正确格式。但只要你能让它看起来像PHP session id,即使是使用str_pad()这样愚蠢的方法,下面的代码将使session非常适用于Telegram webhooks:

session_id(str_pad($data['message']['chat']['id'], 26, 'F'));
session_start();


但现在你得想想,是否值得这么麻烦?会话机制的主要部分是发送和接收cookie。而剩下的部分只是一个键值存储。可以使用任何可用的数据库创建,例如Mysql或Redis。
因此,您只需获取聊天ID,对想要存储的数据进行json_encode,并使用您觉得方便的任何存储,而不是弄乱会话。

相关问题