token = $token; // parent::__construct(); } /** * http_build_query兼容多维数组,返回结果数组仍支持http_build_query函数处理 * @author Zjmainstay https://bugs.php.net/bug.php?id=67477 * @param $data array curl传递参数的数组(原装) * @return array 可curl传递的格式化数组 */ function http_build_query_develop($data) { if (!is_array($data)) { return $data; } foreach ($data as $key => $val) { if (is_array($val)) { foreach ($val as $k => $v) { if (is_array($v)) { $data = array_merge($data, http_build_query_develop(array("{$key}[{$k}]" => $v))); } else { $data["{$key}[{$k}]"] = $v; } } unset($data[$key]); } } return $data; } private function fetch($url, $postdata = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if (!is_null($postdata)) { curl_setopt($ch, CURLOPT_POSTFIELDS, $this->http_build_query_develop($postdata)); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $re = curl_exec($ch); curl_close($ch); return $re; } public function callMethod($method, $param = array(), $detection = true) { /** 访问网页 */ $url = 'https://api.telegram.org/bot' . $this->token . '/' . $method; $ret = json_decode($this->fetch($url, $param), true); /** 分析结果 */ if ($ret['ok'] == false && $detection == true) { if ($ret['error_code'] != 400 && $ret['error_code'] != 403) { $errorModel = new ErrorModel; $errorModel->sendError(MASTER, '尝试调用 ' . $method . " 时出现问题,参数表如下:\n" . print_r($param, true) . "\n\n返回结果:\n" . print_r($ret, true)); } } /** 返回 */ return $ret; } public function getWebhook() { $this->ret = $this->callMethod('getWebhookInfo', [], false); return $this->ret; } public function setWebhook($newurl) { $this->ret = $this->callMethod('setWebhook', [ 'url' => $newurl ], false); return $this->ret; } public function sendMessage($chat_id, $text, $reply_to_message_id = NULL, $reply_markup = array(), $parse_mode = 'HTML', $disable_web_page_preview = false, $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; foreach (str_split($text, 4096) as $text_i => $text_d) { $tmp = $this->callMethod('sendMessage', [ 'chat_id' => $chat_id, 'text' => $text_d, 'reply_to_message_id' => $reply_to_message_id, 'parse_mode' => $parse_mode, 'reply_markup' => $reply_markup, 'disable_web_page_preview' => $disable_web_page_preview, 'disable_notification' => $disable_notification ]); if ($text_i == 0) $this->ret = $tmp; } return $this->ret['result']['message_id']; } public function editMessage($chat_id, $message_id, $text, $reply_markup = array(), $parse_mode = 'HTML') { $this->ret = $this->callMethod('editMessageText', [ 'chat_id' => $chat_id, 'message_id' => $message_id, 'text' => $text, 'parse_mode' => $parse_mode, 'reply_markup' => $reply_markup ]); return isset($this->ret['result']['message_id'])?$this->ret['result']['message_id']:0; } public function deleteMessage($chat_id, $message_id) { $this->ret = $this->callMethod('deleteMessage', get_defined_vars()); return $this->ret; } public function kickMember($chat_id, $user_id, $until_date = NULL) { $this->ret = $this->callMethod('kickChatMember', [ 'chat_id' => $chat_id, 'user_id' => $user_id, 'until_date' => $until_date ]); return $this->ret; } //键盘按钮 KeyboardButton $chat_id sender_chat_id public function KeyboardButton($chat_id, $text, $Keyboard = array(), $message_id = null, $message_thread_id = null) { return $this->sendthreadMessage($chat_id, $text, $message_id, $message_thread_id, $Keyboard); } public function sendthreadMessage($chat_id, $text, $reply_to_message_id = NULL, $message_thread_id = NULL, $reply_markup = array(), $parse_mode = 'HTML', $disable_web_page_preview = false, $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; foreach (str_split($text, 4096) as $text_i => $text_d) { $tmp = $this->callMethod('sendMessage', [ 'chat_id' => $chat_id, 'text' => $text_d, 'message_thread_id' => $message_thread_id, 'reply_to_message_id' => $reply_to_message_id, 'parse_mode' => $parse_mode, 'reply_markup' => $reply_markup, 'disable_web_page_preview' => $disable_web_page_preview, 'disable_notification' => $disable_notification ]); if ($text_i == 0) $this->ret = $tmp; } if ($this->ret['ok'] == false) { if ($this->ret['description'] == "Bad Request: BUTTON_URL_INVALID") { //按钮设置错误导致异常 $txt = $text . "\r\n" . "\r\n" . "由于按钮信息设置错误,异常,您可以点击按钮参考设置规则"; $button = json_encode(array( 'inline_keyboard' => array( array(array( 'text' => '参考按钮设置', 'callback_data' => 'xinshouxiuefrb ' )) ) )); $this->sendMessage($chat_id, $txt, null, $button, 'Markdown', true); } //按钮设置问题导致报错 if (strpos($this->ret['description'], "keyboard button")) { //按钮设置错误导致异常 $txt = $text . "\r\n" . "\r\n" . "由于按钮信息设置错误,异常,您可以点击按钮参考设置规则"; $button = json_encode(array( 'inline_keyboard' => array( array(array( 'text' => '参考按钮设置', 'callback_data' => 'xinshouxiuefrb ' )) ) )); $this->sendMessage($chat_id, $txt, null, $button, 'Markdown', true); } elseif (strpos($this->ret['description'], "Bad Request: have no rights to send a message")) { $cuwucishu = Cache::get("cuwusishuo" . $chat_id); if ($cuwucishu > 100) { // $this->db->update('group', ['switch' => 0, 'botid' => $this->botid], ['group' => $chat_id]); Db::name("group")->where(['group' => $chat_id, 'botid' => $this->botid])->update(['switch' => 0]); $this->getgroupinfo($chat_id, $this->tokenbase, 1); } else { Cache::set("cuwusishuo" . $chat_id, $cuwucishu + 1, 36000); } } else { $txt = "本次请求出错了,错误日志如下" . "\r\n" . "检查下设置的地址是否正确或者是存在多余的空格" . "\r\n" . $this->ret['description'] . "\r\n" . "\r\n" . "实在解决不了 反馈 @kaihebug"; if ($text == "查看群规") { $this->sendMessage($chat_id, $txt); } // file_put_contents("tgsendmassttttt.txt", json_encode($this->ret).$text.$reply_markup.$chat_id.$parse_mode."\r\n", FILE_APPEND); } if (isset($this->ret['parameters']['retry_after'])) { $retry_after = $this->ret['parameters']['retry_after']; Cache::set("retry_after" . $chat_id, 1, $retry_after); } } //下面还可以添加规则 if (isset($this->ret['result']['message_id'])) { return $this->ret['result']['message_id']; } else { return null; } //return $this->ret['result']['message_id']; } //强制回复 forcereply public function forcereply($chat_id, $text, $message_id = null, $message_thread_id = null) { $buttonsc = json_encode( array( 'force_reply' => true, 'input_field_placeholder' => $text, 'selective' => true, ) ); return $this->sendthreadMessage($chat_id, $text, $message_id, $message_thread_id, $buttonsc); } public function sendPhoto($chat_id, $photo, $caption = '', $reply_to_message_id = NULL, $reply_markup = array(), $parse_mode = 'HTML') { if (is_array($photo)) { return $this->sendMediaGroup($chat_id, array_map(function ($p) use ($caption, $parse_mode) { return [ 'type' => 'photo', 'media' => $p, 'caption' => $caption, 'parse_mode' => $parse_mode ]; }, $photo), $reply_to_message_id); } if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendPhoto', [ 'chat_id' => $chat_id, 'photo' => $photo, 'caption' => $caption, 'parse_mode' => $parse_mode, 'reply_to_message_id' => $reply_to_message_id, 'reply_markup' => $reply_markup ]); return isset($this->ret['result']['message_id'])?$this->ret['result']['message_id']:0;; } public function sendDocumentphoto($chat_id, $document, $caption = '', $reply_to_message_id = NULL, $reply_markup = array(), $parse_mode = 'HTML') { $url = 'https://api.telegram.org/bot' . $this->token . '/sendPhoto'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $finfo = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $document); $cFile = new \CURLFile($document, $finfo); curl_setopt($ch, CURLOPT_POSTFIELDS, $this->http_build_query_develop([ 'chat_id' => $chat_id, 'photo' => $cFile, 'caption' => $caption, 'parse_mode' => $parse_mode, 'reply_to_message_id' => $reply_to_message_id, 'reply_markup' => $reply_markup ])); $result = curl_exec($ch); curl_close($ch); $this->ret = json_decode($result, 1); $message_id=isset($this->ret['result']['message_id'])?$this->ret['result']['message_id']:""; if(!empty($message_id)){ unlink($document); } //var_dump($this->ret); return $message_id; } public function sendMediaGroup($chat_id, $media, $reply_to_message_id = NULL) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendMediaGroup', [ 'chat_id' => $chat_id, 'media' => json_encode($media), 'reply_to_message_id' => $reply_to_message_id ]); return array_map(function ($m) { return $m['message_id']; }, $this->ret['result']); } public function sendAudio($chat_id, $audio, $caption = '', $reply_to_message_id = NULL, $reply_markup = array(), $parse_mode = 'HTML', $duration = '', $performer = NULL, $title = NULL, $thumb = '', $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendAudio', get_defined_vars()); return $this->ret['result']['message_id']; } public function sendDocument($chat_id, $document, $caption = '', $reply_to_message_id = NULL, $reply_markup = array(), $parse_mode = 'HTML', $thumb = '', $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendDocument', get_defined_vars()); return $this->ret['result']['message_id']; } public function sendVideo($chat_id, $video, $duration = '', $width = '', $height = '', $thumb = '', $caption = NULL, $parse_mode = 'HTML', $supports_streaming = '', $disable_notification = false, $reply_to_message_id = '', $reply_markup = '') { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendVideo', get_defined_vars()); return $this->ret['result']['message_id']; } public function sendAnimation($chat_id, $animation, $duration = NULL, $width = NULL, $height = NULL, $thumb = NULL, $caption = '', $parse_mode = 'HTML', $disable_notification = NULL, $reply_to_message_id = NULL, $reply_markup = array()) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendAnimation', get_defined_vars()); return $this->ret['result']['message_id']; } public function getBusinessConnection($business_connection_id) { $this->ret = $this->callMethod('getBusinessConnection', get_defined_vars()); return $this->ret['result']; } public function sendVoice($chat_id, $voice, $caption = NULL, $parse_mode = 'HTML', $duration = '', $disable_notification = false, $reply_to_message_id = '', $reply_markup = '') { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendVoice', get_defined_vars()); return $this->ret['result']['message_id']; } public function getUserProfilePhotos($user_id, $offset = '', $limit = '') { $this->ret = $this->callMethod('getUserProfilePhotos', get_defined_vars()); return $this->ret['result']; } public function unbanChatMember($chat_id, $user_id) { $this->ret = $this->callMethod('unbanChatMember', get_defined_vars()); return $this->ret['result']; } public function restrictChatMember($chat_id, $user_id, $permissions, $until_date = NULL) { $this->ret = $this->callMethod('restrictChatMember', get_defined_vars()); return $this->ret['result']; } public function promoteChatMember($chat_id, $user_id, $can_change_info = NULL, $can_post_messages = NULL, $can_edit_messages = NULL, $can_delete_messages = NULL, $can_invite_users = NULL, $can_restrict_members = NULL, $can_pin_messages = NULL, $can_promote_members = NULL) { $this->ret = $this->callMethod('promoteChatMember', get_defined_vars()); return $this->ret['result']; } public function setChatPermissions($chat_id, $permissions) { $this->ret = $this->callMethod('setChatPermissions', get_defined_vars()); return $this->ret['result']; } public function exportChatInviteLink($chat_id) { $this->ret = $this->callMethod('exportChatInviteLink', get_defined_vars()); return $this->ret['result']; } public function setChatPhoto($chat_id, $photo) { $this->ret = $this->callMethod('setChatPhoto', get_defined_vars()); return $this->ret['result']; } public function deleteChatPhoto($chat_id) { $this->ret = $this->callMethod('deleteChatPhoto', get_defined_vars()); return $this->ret['result']; } public function setChatTitle($chat_id, $title) { $this->ret = $this->callMethod('setChatTitle', get_defined_vars()); return $this->ret['result']; } public function setChatDescription($chat_id, $description = NULL) { $this->ret = $this->callMethod('setChatDescription', get_defined_vars()); return $this->ret['result']; } public function pinChatMessage($chat_id, $message_id, $disable_notification = false) { $this->ret = $this->callMethod('pinChatMessage', get_defined_vars()); return $this->ret['result']; } public function unpinChatMessage($chat_id) { $this->ret = $this->callMethod('unpinChatMessage', get_defined_vars()); return $this->ret['result']; } public function leaveChat($chat_id) { $this->ret = $this->callMethod('leaveChat', get_defined_vars()); return $this->ret['result']; } public function getChat($chat_id) { $this->ret = $this->callMethod('getChat', get_defined_vars()); return $this->ret['result']; } public function getChatMembersCount($chat_id) { $this->ret = $this->callMethod('getChatMembersCount', get_defined_vars()); return $this->ret['result']; } public function getChatMember($chat_id, $user_id) { $this->ret = $this->callMethod('getChatMember', get_defined_vars()); return $this->ret['result']; } public function editMessageText($chat_id = '', $message_id = '', $inline_message_id = NULL, $text, $parse_mode = 'HTML', $disable_web_page_preview = '', $reply_markup = '') { $this->ret = $this->callMethod('editMessageText', get_defined_vars()); return $this->ret['result']['message_id']; } public function editMessageCaption($chat_id = '', $message_id = '', $inline_message_id = NULL, $caption = NULL, $parse_mode = 'HTML', $reply_markup = '') { $this->ret = $this->callMethod('editMessageCaption', get_defined_vars()); return $this->ret['result']['message_id']; } public function editMessageMedia($chat_id = '', $message_id = '', $inline_message_id = NULL, $media, $reply_markup = '') { $this->ret = $this->callMethod('editMessageMedia', get_defined_vars()); return $this->ret['result']['message_id']; } public function editMessageReplyMarkup($chat_id = '', $message_id = '', $inline_message_id = NULL, $reply_markup = '') { $this->ret = $this->callMethod('editMessageReplyMarkup', get_defined_vars()); return $this->ret['result']['message_id']; } public function sendSticker($chat_id, $sticker, $reply_to_message_id = NULL, $reply_markup = array(), $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendSticker', get_defined_vars()); return $this->ret['result']['message_id']; } public function sendGame($chat_id, $game_name, $reply_to_message_id = NULL, $reply_markup = array()) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('sendGame', [ 'chat_id' => $chat_id, 'game_short_name' => $game_name, 'reply_to_message_id' => $reply_to_message_id, 'reply_markup' => $reply_markup ]); return $this->ret['result']['message_id']; } public function setGameScore($user_id, $score, $force = false, $disable_edit_message = false, $chat_id = NULL, $message_id = NULL, $inline_id = NULL) { $this->ret = $this->callMethod('setGameScore', [ 'user_id' => $user_id, 'score' => $score, 'force' => $force, 'disable_edit_message' => $disable_edit_message, 'chat_id' => $chat_id, 'message_id' => $message_id, 'inline_message_id' => $inline_id ]); return $this->ret['result']['message_id']; } public function forwardMessage($chat_id, $from_chat_id, $message_id, $disable_notification = false) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('forwardMessage', get_defined_vars()); return $this->ret['result']['message_id']; } public function answerCallback($callback_id, $text = '', $show_alert = false, $url = '', $cache_time = 0) { if (isset($GLOBALS['statistics']['send_total'])) $GLOBALS['statistics']['send_total']++; $this->ret = $this->callMethod('answerCallbackQuery', [ 'callback_query_id' => $callback_id, 'text' => $text, 'show_alert' => $show_alert, 'url' => $url, 'cache_time' => $cache_time ]); return $this->ret; } public function sendInlineQuery($results) { self::$inlineResults = array_merge(self::$inlineResults, $results); } public function sendInline($inline_id, $cache_time = 600, $offset = '', $switch_pm_parameter = '') { $this->ret = $this->callMethod('answerInlineQuery', [ 'inline_query_id' => $inline_id, 'results' => json_encode(self::$inlineResults), 'cache_time' => $cache_time, 'next_offset' => $offset, 'switch_pm_parameter' => $switch_pm_parameter ]); return $this->ret; } public function sendChatAction($chat_id, $action) { $this->ret = $this->callMethod('sendChatAction', [ 'chat_id' => $chat_id, 'action' => $action ]); return $this->ret; } public function getFile($file_id) { $this->ret = $this->callMethod('getFile', [ 'file_id' => $file_id, ]); if ($this->ret['ok']) { $fileUrl = 'https://api.telegram.org/file/bot' . $this->token . '/' . $this->ret['result']['file_path']; $this->ret['result']['down_url'] = $fileUrl; } return $this->ret; } public function getInlineId() { return hash('sha256', uniqid(mt_rand(), true)); } public function getChatAdmin($chat_id) { $this->ret = $this->callMethod('getChatAdministrators', [ 'chat_id' => $chat_id ]); return $this->ret['result']; } public function getMe() { $this->ret = $this->callMethod('getMe', []); return $this->ret; } public function getStickerSet($name) { $this->ret = $this->callMethod('getStickerSet', [ 'name' => $name ]); return $this->ret['result']; } public function isAdmin($chat_id, $user_id) { $ret = false; $adminList = $this->getChatAdmin($chat_id); foreach ($adminList as $adminList_d) { if ($adminList_d['user']['id'] == $user_id) { $ret = true; break; } } return $ret; } public function atById($userid, $username) { return '@' . $username . ''; } public function getMaster() { return MASTER; } public function getBotName() { return BOTNAME; } public function getReturn() { return $this->ret; } public function error() { $this->callMethod('sendMessage'); } }