Browse Source

refactor: basic part of bot

master
Dnomd343 3 years ago
parent
commit
78811540db
  1. 19
      env.php
  2. 34
      functions/TgInterface.php
  3. 63
      init.php
  4. 37
      main.php
  5. 6
      route.php

19
env.php

@ -1,19 +0,0 @@
<?php
function loadEnv($filename) { // 读取环境变量文件
$file = fopen($filename, 'r');
$data = array();
while (!feof($file)) { // 逐行读入文件
$raw = trim(fgets($file));
if ($raw == '') { continue; } // 跳过空行
if (substr($raw, 0, 1) === '#') { continue; } // 跳过注释
$record = explode('=', $raw);
if (count($record) === 2) {
$data[$record[0]] = $record[1]; // 合法记录
}
}
fclose($file);
return $data;
}
?>

34
functions/TgInterface.php

@ -41,8 +41,7 @@ class tgApi { // Telegram消息发送接口
}
public function sendPayload($payload) { // 发送原始数据
global $apiPath;
$url = $apiPath . '/' . $payload['method'] . '?';
$url = 'https://api.telegram.org/bot' . $GLOBALS['env']['BOT_TOKEN'] . '/' . $payload['method'] . '?';
foreach ($payload as $param => $content) {
$url .= '&' . $param . '=' . urlencode($content);
}
@ -50,18 +49,25 @@ class tgApi { // Telegram消息发送接口
}
function debug() { // 调试接口
global $webhook, $tgEnv;
$msg .= 'isCallback: ' . ($tgEnv['isCallback'] ? 'true' : 'false') . PHP_EOL;
$msg .= 'isGroup: ' . ($tgEnv['isGroup'] ? 'true' : 'false') . PHP_EOL;
$msg .= 'messageText: ' . $tgEnv['messageText'] . PHP_EOL;
$msg .= 'messageId: ' . $tgEnv['messageId'] . PHP_EOL;
$msg .= 'chatId: ' . $tgEnv['chatId'] . PHP_EOL;
$msg .= 'userId: ' . $tgEnv['userId'] . PHP_EOL;
$msg .= 'userName: ' . $tgEnv['userName'] . PHP_EOL;
$msg .= 'userAccount: ' . $tgEnv['userAccount'] . PHP_EOL;
$msg .= 'userLanguage: ' . $tgEnv['userLanguage'] . PHP_EOL;
tgApi::sendText($msg);
tgApi::sendText(json_encode($webhook));
global $tgEnv;
$msg = '<i>---- tgEnv Content ----</i>' . PHP_EOL;
$msg .= '<b>myId:</b> ' . $tgEnv['myInfo']['id'] . PHP_EOL;
$msg .= '<b>myName:</b> ' . $tgEnv['myInfo']['name'] . PHP_EOL;
$msg .= '<b>myAccount:</b> ' . $tgEnv['myInfo']['account'] . PHP_EOL;
$msg .= '<b>isCallback:</b> ' . ($tgEnv['isCallback'] ? 'true' : 'false') . PHP_EOL;
$msg .= '<b>isGroup:</b> ' . ($tgEnv['isGroup'] ? 'true' : 'false') . PHP_EOL;
$msg .= '<b>messageText:</b> ' . $tgEnv['messageText'] . PHP_EOL;
$msg .= '<b>messageId:</b> ' . $tgEnv['messageId'] . PHP_EOL;
$msg .= '<b>chatId:</b> ' . $tgEnv['chatId'] . PHP_EOL;
$msg .= '<b>userId:</b> ' . $tgEnv['userId'] . PHP_EOL;
$msg .= '<b>userName:</b> ' . $tgEnv['userName'] . PHP_EOL;
$msg .= '<b>userAccount:</b> ' . $tgEnv['userAccount'] . PHP_EOL;
$msg .= '<b>demo:</b> ' . 'dnom<html>d343' . PHP_EOL;
$msg .= '<b>userLanguage:</b> ' . $tgEnv['userLanguage'] . PHP_EOL;
tgApi::sendMessage(array(
'text' => $msg,
'parse_mode' => 'HTML', // HTML格式输出
));
}
}

63
init.php

@ -0,0 +1,63 @@
<?php
function initBot($webhook) { // 初始化机器人
$webhook = json_decode($webhook, true);
$isCallback = isset($webhook['callback_query']) ? true : false; // 是否为回调请求
if ($isCallback) { // 回调请求模式
$message = $webhook['callback_query']['message'];
$messageText = $webhook['callback_query']['data'];
$messageFrom = $webhook['callback_query']['from'];
} else { // 直接请求模式
$message = $webhook['message'];
$messageText = $webhook['message']['text'];
$messageFrom = $webhook['message']['from'];
}
return array(
'myInfo' => getMyself($GLOBALS['env']['BOT_TOKEN']), // bot信息
'isGroup' => ($message['chat']['type'] === 'group') ? true : false, // 是否为群组
'isCallback' => $isCallback, // 是否为回调请求
'messageText' => $messageText, // 请求/回调 文本内容
'messageId' => $message['message_id'], // 请求/回调 消息ID
'chatId' => $message['chat']['id'], // 会话ID
'userId' => $messageFrom['id'], // 请求者用户ID
'userName' => $messageFrom['first_name'], // 请求者名字
'userAccount' => $messageFrom['username'], // 请求者用户名
'userLanguage' => $messageFrom['language_code'] // 请求者语言
);
}
function getMyself($token) { // 获取bot信息
$redis = new RedisCache('me');
$info = $redis->getData('info'); // 查询缓存数据
if (!$info) { // 缓存未命中
$url = 'https://api.telegram.org/bot' . $token . '/getMe'; // API查询
$info = json_decode(file_get_contents($url), true)['result'];
$info = array(
'id' => $info['id'],
'name' => $info['first_name'],
'account' => $info['username']
);
$redis->setData('info', json_encode($info), 2 * 3600); // 缓存2小时
} else { // 缓存命中
$info = json_decode($info, true); // 使用缓存数据
}
return $info;
}
function loadEnv($filename) { // 读取环境变量文件
$file = fopen($filename, 'r');
$data = array();
while (!feof($file)) { // 逐行读入文件
$raw = trim(fgets($file));
if ($raw == '') { continue; } // 跳过空行
if (substr($raw, 0, 1) === '#') { continue; } // 跳过注释
$record = explode('=', $raw);
if (count($record) === 2) {
$data[trim($record[0])] = trim($record[1]); // 合法记录
}
}
fclose($file);
return $data;
}
?>

37
main.php

@ -1,6 +1,6 @@
<?php
require_once 'env.php';
require_once 'init.php';
require_once 'route.php';
require_once 'functions/DNS.php';
require_once 'functions/Curl.php';
@ -12,38 +12,11 @@ require_once 'functions/SqliteDB.php';
require_once 'functions/RedisCache.php';
require_once 'functions/TgInterface.php';
fastcgi_finish_request(); // 断开连接
$env = loadEnv('.env'); // 载入环境变量
$apiToken = $env['BOT_TOKEN'];
$botAccount = $env['BOT_NAME']; // 机器人用户名
fastcgi_finish_request(); // 断开连接
ini_set('date.timezone', $env['TIME_ZONE']); // 设置时区
$apiPath = 'https://api.telegram.org/bot' . $apiToken; // Telegram API接口
$webhook = json_decode(file_get_contents("php://input"), TRUE); // Webhook接受信息
$isCallback = isset($webhook['callback_query']) ? true : false; // 是否为回调请求
if ($isCallback) { // 回调请求模式
$message = $webhook['callback_query']['message'];
$messageText = $webhook['callback_query']['data'];
$messageFrom = $webhook['callback_query']['from'];
} else { // 直接请求模式
$message = $webhook['message'];
$messageText = $webhook['message']['text'];
$messageFrom = $webhook['message']['from'];
}
$chat = $message['chat'];
$tgEnv = array(
'isGroup' => ($chat['type'] === 'group') ? true : false, // 是否为群组
'isCallback' => $isCallback, // 是否为回调请求
'messageText' => $messageText, // 请求/回调 文本内容
'messageId' => $message['message_id'], // 请求/回调 消息ID
'chatId' => $chat['id'], // 会话ID
'userId' => $messageFrom['id'], // 请求者用户ID
'userName' => $messageFrom['first_name'], // 请求者名字
'userAccount' => $messageFrom['username'], // 请求者用户名
'userLanguage' => $messageFrom['language_code'] // 请求者语言
);
route($messageText); // 发往请求路由
$tgEnv = initBot(file_get_contents("php://input")); // 初始化bot配置
tgApi::debug();
route($tgEnv['messageText']); // 发往请求路由
?>

6
route.php

@ -36,7 +36,8 @@ function cmdRoute($cmd) { // 命令功能模块路由
}
function route($message) { // 请求路由
global $tgEnv, $botAccount;
global $tgEnv;
$botAccount = $tgEnv['myInfo']['account'];
$message = trim($message); // 去除前后空字符
if (!$tgEnv['isGroup']) { // 当前为私聊模式
$reply = tgReply::match();
@ -51,14 +52,13 @@ function route($message) { // 请求路由
$rawParam = '';
} else { // 命令带有参数
unset($temp[0]);
$rawParam = implode(' ', $temp); // 获得参数
$rawParam = trim(implode(' ', $temp)); // 获得参数
}
if ($tgEnv['isGroup']) { // 当前为群组
if (substr($cmd, -strlen($botAccount) - 1) === '@' . $botAccount) {
$cmd = substr($cmd, 0, strlen($cmd) - strlen($botAccount) - 1); // 分离@机器人
}
}
$rawParam = trim($rawParam);
$entry = cmdRoute($cmd); // 获取功能模块入口
if (!$entry) { return; } // 命令不存在
if ($tgEnv['isCallback']) {

Loading…
Cancel
Save