Jumpeng/oraclex-bot
0
1import os2import requests3import numpy as np4from sentence_transformers import SentenceTransformer5from telegram import Update6from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes7from telegram.request import HTTPXRequest8 9# ==================== 从 Secret 读取代理(你的建议)===================10PROXY_URL = os.getenv("BOT_PROXY_URL", "socks5://51.79.98.70:1080") # 默认节点,Secret 可覆盖11request = HTTPXRequest(proxy=PROXY_URL)12 13# ==================== 读取密钥 ====================14TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")15API_KEY = os.getenv("SILICONFLOW_API_KEY")16 17if not TOKEN:18 raise ValueError("请设置 TELEGRAM_BOT_TOKEN")19if not API_KEY:20 raise ValueError("请设置 SILICONFLOW_API_KEY")21 22print(f"Token 已读取,长度: {len(TOKEN)}")23print(f"已启用 SOCKS5 代理: {PROXY_URL},绕过 DNS 封锁")24 25# ==================== RAG 系统 ====================26print("正在加载中文嵌入模型...")27embedder = SentenceTransformer("BAAI/bge-small-zh-v1.5")28 29with open("oraclex_info.txt", "r", encoding="utf-8") as f:30 text = f.read()31 32chunks = [c.strip() for c in text.split("\n\n") if c.strip() and len(c.strip()) > 15]33if not chunks:34 chunks = ["OracleX 是一个创新的区块链预言机项目。"]35 36print(f"正在为 {len(chunks)} 段文档生成向量...")37vectors = embedder.encode(chunks, normalize_embeddings=True, show_progress_bar=True)38vectors = vectors / np.linalg.norm(vectors, axis=1, keepdims=True)39 40def retrieve(q, k=4):41 v = embedder.encode([q], normalize_embeddings=True)[0]42 scores = np.dot(vectors, v)43 idx = np.argsort(scores)[-k:][::-1]44 return [chunks[i] for i in idx]45 46def generate_answer(context, question):47 prompt = f"""你是一个专业友好的 OracleX 项目助手,请根据以下资料简洁准确地回答。48如果资料中没有相关信息,请说“我目前没有找到这部分信息"。49 50资料:51{context}52 53用户问题:{question}54 55请用中文直接回答:"""56 57 try:58 r = requests.post("https://api.siliconflow.cn/v1/chat/completions",59 headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},60 json={"model": "Qwen/Qwen2.5-72B-Instruct", "messages": [{"role": "user", "content": prompt}], "temperature": 0.7},61 timeout=25)62 if r.status_code == 200:63 return r.json()["choices"][0]["message"]["content"]64 except:65 pass66 return "我检索到了以下内容:\n\n" + context[:1000]67 68# ==================== Bot 逻辑 ====================69async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):70 await update.message.reply_text(71 "🤖 OracleX 项目专属 AI 助手已上线!\n"72 "直接问我任何问题:团队、融资、代币、合作、上线时间...\n"73 "支持私聊和群聊~"74 )75 76async def handle(update: Update, context: ContextTypes.DEFAULT_TYPE):77 text = update.message.text or ""78 chat_type = update.effective_chat.type79 80 # 群聊只响应 @机器人81 if chat_type != "private":82 me = await context.bot.get_me()83 if f"@{me.username}" not in text:84 return85 text = text.replace(f"@{me.username}", "").strip()86 87 if not text.strip():88 return89 90 await context.bot.send_chat_action(chat_id=update.effective_chat.id, action="typing")91 docs = retrieve(text, 4)92 ctx = "\n\n".join(docs)93 ans = generate_answer(ctx, text)94 await update.message.reply_text(ans + f"\n\n---\n引用了 {len(docs)} 段资料")95 96# ==================== 启动 ====================97app = Application.builder().token(TOKEN).request(request).build()98app.add_handler(CommandHandler("start", start))99app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle))100 101print("OracleX Telegram Bot 启动成功!正在监听消息...")102app.run_polling(drop_pending_updates=True)