diff --git a/acggw_bot.py b/acggw_bot.py new file mode 100644 index 0000000000000..07b283b9ad9de --- /dev/null +++ b/acggw_bot.py @@ -0,0 +1,95 @@ +import requests +from bs4 import BeautifulSoup +import urllib.parse +import time +import random + +from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes + +class ACGGWCrawler: + def __init__(self): + self.base_url = "https://www.acggw.me" + self.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' + } + self.session = requests.Session() + + def search(self, keyword: str, max_pages: int = 1): + encoded_keyword = urllib.parse.quote(keyword) + results = [] + for page in range(1, max_pages + 1): + url = f"{self.base_url}/page/{page}/?s={encoded_keyword}" if page > 1 else f"{self.base_url}/?s={encoded_keyword}" + try: + response = self.session.get(url, headers=self.headers, timeout=10) + response.raise_for_status() + soup = BeautifulSoup(response.text, 'html.parser') + articles = soup.find_all('article') + if not articles: + break + for article in articles: + result = self._parse_article(article) + if result: + results.append(result) + time.sleep(random.uniform(1, 2)) + except Exception as e: + print(f"Error on page {page}: {e}") + break + return results + + def _parse_article(self, article): + try: + title_elem = article.find('h2', class_='entry-title') + title = title_elem.text.strip() if title_elem else "无标题" + link = title_elem.find('a')['href'] if title_elem and title_elem.find('a') else None + thumbnail = article.find('img') + thumbnail_url = thumbnail['src'] if thumbnail and 'src' in thumbnail.attrs else None + excerpt = article.find('div', class_='entry-summary') + excerpt_text = excerpt.text.strip() if excerpt else "无简介" + return { + 'title': title, + 'url': link, + 'thumbnail': thumbnail_url, + 'excerpt': excerpt_text + } + except Exception as e: + print(f"Parse error: {e}") + return None + +crawler = ACGGWCrawler() + +async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): + await update.message.reply_text("欢迎使用 GalGame 检索器 1.0\n请输入 /search 关键词 进行搜索") + +async def search(update: Update, context: ContextTypes.DEFAULT_TYPE): + query = ' '.join(context.args) + if not query: + await update.message.reply_text("请提供搜索关键词,如:/search 魔法少女") + return + await update.message.reply_text(f"🔍 正在搜索:{query},请稍等...") + results = crawler.search(query) + if not results: + await update.message.reply_text("未找到任何结果。") + return + for result in results: + msg = f"🎮 {result['title']}\n\n📝 {result['excerpt'][:100]}...\n\n🔗 查看详情" + buttons = [[InlineKeyboardButton("复制链接", url=result['url'])]] + reply_markup = InlineKeyboardMarkup(buttons) + if result['thumbnail']: + await update.message.reply_photo(photo=result['thumbnail'], + caption=msg, + reply_markup=reply_markup, + parse_mode='HTML') + else: + await update.message.reply_text(text=msg, + reply_markup=reply_markup, + parse_mode='HTML') + +BOT_TOKEN = "7663966008:AAFx0U6h7RSyHNkLWnp5oSVkTDZjlhbu6Cg" + +if __name__ == "__main__": + app = ApplicationBuilder().token(BOT_TOKEN).build() + app.add_handler(CommandHandler("start", start)) + app.add_handler(CommandHandler("search", search)) + print("🤖 Bot 正在运行...") + app.run_polling()