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. 异常处理与调试技巧

开发过程中常见的坑及解决方案:

  1. 端口冲突:检查8888和8889端口是否被占用

    netstat -ano | findstr "8888"
    
  2. 消息乱码:对接收的消息进行URL解码

    from urllib.parse import unquote
    decoded_msg = unquote(raw_msg)
    
  3. API调用失败:添加重试机制

    from tenacity import retry, stop_after_attempt
    
    @retry(stop=stop_after_attempt(3))
    def call_api_safely():
        # API调用代码
    

完整项目已经上传到GitHub,包含更多高级功能如:

  • 定时消息提醒
  • 群成员管理
  • 关键词自动回复
  • 聊天记录分析

这个项目最有趣的部分是可以不断扩展新功能。上周我刚添加了「今日运势」功能,用随机数生成运势描述,结果群里的小伙伴每天都要「抽签」,意外地受欢迎。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐