Python实战:用MyQQ框架5分钟打造智能聊天机器人(附天气查询+整蛊功能)
·
Python实战:5分钟用MyQQ框架打造智能聊天机器人(附天气查询与趣味互动)
最近在技术社区发现不少开发者对QQ机器人开发感兴趣,但很多教程要么过于复杂,要么功能单一。今天我们就用Python和MyQQ框架,从零开始构建一个具备实用功能和趣味互动的智能机器人。这个项目特别适合Python初学者练手,也能满足QQ机器人爱好者的创作欲望。
1. 环境准备与框架配置
首先需要下载MyQQ框架主程序,官网提供了清晰的下载指引。安装完成后,重点配置两个端口:监听端口和回调端口。很多新手容易忽略回调端口设置,导致消息无法正常接收。
推荐配置(在config.ini中修改):
[server]
listen_port = 8888
callback_port = 8889
Python环境需要安装以下依赖:
pip install requests flask python-dotenv
创建项目目录结构:
/myqq_bot
├── main.py # 主程序
├── responses.py # 应答逻辑
├── weather.py # 天气查询模块
├── config.ini # 配置文件
└── requirements.txt
2. 核心消息处理机制
MyQQ框架通过HTTP POST方式将消息推送到我们指定的回调地址。下面是一个基础的消息处理类:
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
@app.route('/callback', methods=['POST'])
def handle_message():
data = request.json
msg_type = data.get('MQ_type') # 1-私聊 2-群聊
from_qq = data.get('MQ_fromQQ')
content = data.get('MQ_msg')
# 消息处理逻辑
response = process_message(content, from_qq, msg_type)
return jsonify({"reply": response})
def process_message(content, sender, msg_type):
"""根据消息内容返回相应回复"""
if content == "天气":
return get_weather("北京") # 默认查询北京天气
elif content == "我在哪":
return random_location()
# 其他条件判断...
3. 实用功能开发:天气查询
天气查询是机器人最实用的功能之一。我们使用中国天气网的公开接口,通过城市编码获取天气数据:
import requests
from urllib.parse import quote
CITY_CODE = "101010100" # 北京城市代码
def get_weather(city_name):
url = f"http://www.weather.com.cn/data/cityinfo/{CITY_CODE}.html"
try:
response = requests.get(url, timeout=3)
data = response.json()
weather_info = data['weatherinfo']
return (
f"{weather_info['city']}天气:{weather_info['weather']}\n"
f"温度:{weather_info['temp1']}~{weather_info['temp2']}"
)
except Exception as e:
return "天气查询失败,请稍后再试"
常见城市代码对照表:
| 城市 | 代码 | 示例查询指令 |
|---|---|---|
| 北京 | 101010100 | "天气 北京" |
| 上海 | 101020100 | "天气 上海" |
| 广州 | 101280101 | "天气 广州" |
4. 趣味互动功能实现
除了实用功能,机器人还需要一些趣味元素增加互动性。以下是几个经典玩法:
随机位置应答:
import random
locations = {
1: "在图书馆假装学习",
2: "在食堂偷吃小龙虾",
3: "在宿舍躺平",
4: "在操场跑步(才怪)",
5: "在网吧五连坐"
}
def random_location():
return locations[random.randint(1, 5)]
整蛊功能(针对特定好友):
prank_responses = {
"在吗": "不在,勿扰",
"吃饭了吗": "吃了,但没叫你",
"帮我个忙": "先V50看看诚意"
}
def check_prank(sender, content):
if sender == "目标QQ号":
return prank_responses.get(content, "?")
return None
5. 消息发送与API调用
当需要主动发送消息时,调用MyQQ的HTTP API接口:
def send_message(robot_qq, target, msg_type, content):
"""发送消息到QQ/群
:param msg_type: 1-好友 2-群
"""
api_url = "http://127.0.0.1:8888/MyQQHTTPAPI"
payload = {
"function": "Api_SendMsg",
"token": "你的Token",
"params": {
"c1": robot_qq,
"c2": msg_type,
"c3": target if msg_type == 2 else "",
"c4": target if msg_type == 1 else "",
"c5": content
}
}
requests.post(api_url, json=payload)
6. 异常处理与调试技巧
开发过程中常见的坑及解决方案:
-
端口冲突:检查8888和8889端口是否被占用
netstat -ano | findstr "8888" -
消息乱码:对接收的消息进行URL解码
from urllib.parse import unquote decoded_msg = unquote(raw_msg) -
API调用失败:添加重试机制
from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def call_api_safely(): # API调用代码
完整项目已经上传到GitHub,包含更多高级功能如:
- 定时消息提醒
- 群成员管理
- 关键词自动回复
- 聊天记录分析
这个项目最有趣的部分是可以不断扩展新功能。上周我刚添加了「今日运势」功能,用随机数生成运势描述,结果群里的小伙伴每天都要「抽签」,意外地受欢迎。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)