From 4a0168d311ad5b7afae1a9f7dafa365df3741e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=B0=B4=E5=B1=85=E5=AE=A4?= Date: Sun, 16 Oct 2022 18:15:23 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E4=B8=BA=E9=82=80=E8=AF=B7BOT?= =?UTF-8?q?=E7=9A=84=E6=9D=A1=E4=BB=B6=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=A7=8D?= =?UTF-8?q?=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为了机器人防止被滥用,或部署的服务器资源不足只能留在部分群使用,或者是私用搭建所写的一个功能 别问为啥懒得写单独认证 懒了.jpg --- .env.example | 3 ++ core/config.py | 10 ++++++- plugins/system/new_member.py | 53 ++++++++++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/.env.example b/.env.example index ca43675..f0822ef 100644 --- a/.env.example +++ b/.env.example @@ -25,6 +25,9 @@ ADMINS=[{ "username": "", "user_id": -1 }] # 文章推送群组 可选配置项 # CHANNELS=[{ "name": "", "chat_id": 1}] +# 是否允许机器人邀请到其他群 默认不允许 如果允许 可以允许全部人或有认证选项 可选配置项 +# JOIN_GROUPS = "NO_ALLOW" + # 群验证功能 可选配置项 # VERIFY_GROUPS=[] diff --git a/core/config.py b/core/config.py index 9851e42..d6839f3 100644 --- a/core/config.py +++ b/core/config.py @@ -1,3 +1,4 @@ +from enum import Enum from pathlib import Path from typing import ( List, @@ -11,11 +12,17 @@ from pydantic import BaseModel, BaseSettings, validator from utils.const import PROJECT_ROOT -__all__ = ["BotConfig", "config"] +__all__ = ["BotConfig", "config", "JoinGroups"] dotenv.load_dotenv() +class JoinGroups(str, Enum): + NO_ALLOW = "NO_ALLOW" + ALLOW_AUTH_USER = "ALLOW_AUTH_USER" + ALLOW_ALL = "ALLOW_ALL" + + class BotConfig(BaseSettings): debug: bool = False @@ -38,6 +45,7 @@ class BotConfig(BaseSettings): channels: List["ConfigChannel"] = [] admins: List["ConfigUser"] = [] verify_groups: List[Union[int, str]] = [] + join_groups: Optional[JoinGroups] = JoinGroups.NO_ALLOW logger_width: int = 180 logger_log_path: str = "./logs" diff --git a/plugins/system/new_member.py b/plugins/system/new_member.py index 49f4b7c..f035777 100644 --- a/plugins/system/new_member.py +++ b/plugins/system/new_member.py @@ -1,34 +1,65 @@ from telegram import Update from telegram.ext import CallbackContext -from core.admin import BotAdminService +from core.admin.services import BotAdminService +from core.config import config, JoinGroups +from core.cookies.error import CookiesNotFoundError +from core.cookies.services import CookiesService from core.plugin import Plugin, handler +from core.user.error import UserNotFoundError +from core.user.services import UserService from utils.log import logger class BotJoiningGroupsVerification(Plugin): - def __init__(self, bot_admin_service: BotAdminService = None): + def __init__( + self, + bot_admin_service: BotAdminService = None, + user_service: UserService = None, + cookies_service: CookiesService = None, + ): + self.cookies_service = cookies_service + self.user_service = user_service self.bot_admin_service = bot_admin_service @handler.message.new_chat_members(priority=1) async def new_member(self, update: Update, context: CallbackContext) -> None: + if config.join_groups == JoinGroups.ALLOW_ALL: + return None message = update.effective_message chat = message.chat from_user = message.from_user - quit_status = False for new_chat_members_user in message.new_chat_members: if new_chat_members_user.id == context.bot.id: logger.info(f"有人邀请BOT进入群 {chat.title}[{chat.id}]") quit_status = True if from_user is not None: logger.info(f"用户 {from_user.full_name}[{from_user.id}] 在群 {chat.title}[{chat.id}] 邀请BOT") - admin_list = await self.bot_admin_service.get_admin_list() - if from_user.id in admin_list: - await context.bot.send_message(message.chat_id, "感谢邀请小派蒙到本群!请使用 /help 查看咱已经学会的功能。") - quit_status = False + if config.join_groups == JoinGroups.NO_ALLOW: + try: + admin_list = await self.bot_admin_service.get_admin_list() + if from_user.id in admin_list: + quit_status = False + else: + logger.warning("不是管理员邀请!退出群聊") + except Exception as exc: + logger.error(f"获取信息出现错误 {repr(exc)}") + elif config.join_groups == JoinGroups.ALLOW_AUTH_USER: + try: + user_info = await self.user_service.get_user_by_id(chat.id) + await self.cookies_service.get_cookies(user_info.user_id, user_info.region) + except (UserNotFoundError, CookiesNotFoundError): + logger.warning(f"用户 {from_user.full_name}[{from_user.id}] 邀请请求被拒绝") + except Exception as exc: + logger.error(f"获取信息出现错误 {repr(exc)}") + else: + quit_status = False + else: + quit_status = True else: logger.info(f"未知用户 在群 {chat.title}[{chat.id}] 邀请BOT") - if quit_status: - logger.warning("不是管理员邀请!退出群聊。") - await context.bot.send_message(message.chat_id, "派蒙不想进去!不是旅行者的邀请!") - await context.bot.leave_chat(chat.id) + if quit_status: + await context.bot.send_message(message.chat_id, "派蒙不想进去!不是旅行者的邀请!") + await context.bot.leave_chat(chat.id) + else: + await context.bot.send_message(message.chat_id, "感谢邀请小派蒙到本群!请使用 /help 查看咱已经学会的功能。")