1720浏览
查看: 1720|回复: 13

[K10教程] K10小智与行空板M10 MCP服务器的院线热映电影查询

[复制链接]
本帖最后由 豆爸 于 2025-6-21 17:21 编辑

【项目背景】

电影已成为人们日常生活中重要的娱乐方式之一。传统的电影信息获取方式,如通过线下海报、电视广告或搜索引擎查找,不仅效率较低,而且信息整合不够全面。

本项目旨在利用行空板 K10 的硬件优势和小智 AI 的智能交互能力,结合 MCP 服务器强大的数据处理与传输功能,搭建一个便捷、高效的院线热映电影查询系统。用户只需通过简单的语音指令,就能快速获取最新的院线热映电影信息,包括上映电影数量、片名、上映时间、片长、地区、导演、主演、评分、海报等信息,为观影决策提供便利,提升观影体验。

K10小智与行空板M10 MCP服务器的院线热映电影查询图6

【硬件准备】

1. 行空板 K10
K10小智与行空板M10 MCP服务器的院线热映电影查询图8

作为智能交互终端的核心硬件,行空板 K10 具备丰富的接口与较强的计算能力,是刷写小智 AI 固件的载体。其高性能处理器、大容量内存及存储空间,能够保障小智 AI 固件稳定运行,实现语音识别、自然语言处理等功能,完成与用户的语音交互。

2. 行空板 M10+行空板M10扩展板组合

K10小智与行空板M10 MCP服务器的院线热映电影查询图9

用于搭建 MCP 服务器,行空板 M10 凭借自身硬件性能,可高效存储和管理院线热映电影的相关数据,如电影名称、上映时间、剧情简介、评分等。同时,它能稳定接收行空板 K10 发送的查询请求,快速从数据库检索对应电影信息,并将结果精准返回给 K10,为整个电影查询系统提供数据支撑。

项目实施步骤


1. 行空板K10刷入小智AI固件
(1)固件下载
https://github.com/78/xiaozhi-es ... 5/v1.7.5_df-k10.zip
从上面地址下载行空板K10小智AI固件。
(2)烧录工具
https://img.dfrobot.com.cn/wikic ... 949cb74e51e5f91.zip
从上面地址下载烧录工具。
(3)烧录固件
K10小智与行空板M10 MCP服务器的院线热映电影查询图1



K10小智与行空板M10 MCP服务器的院线热映电影查询图2


(3)小智AI配网
使用手机或电脑连接 Xiaozhi-XXXX的热点。

K10小智与行空板M10 MCP服务器的院线热映电影查询图15


浏览器访问192.168.4.1,打开如下图所示页面,选择wifi,填入密码,点击连接。


K10小智与行空板M10 MCP服务器的院线热映电影查询图16


设备将自动连接到 Wi-Fi,并显示 登录 成功标志,表示已经配置网络成功,设备将在 3 秒后自动重启。


K10小智与行空板M10 MCP服务器的院线热映电影查询图17




2. 编写MCP服务器

  1. # mcp_douban_movie.py
  2. from mcp.server.fastmcp import FastMCP
  3. import sys
  4. import logging
  5. import requests
  6. from bs4 import BeautifulSoup
  7. import json
  8. # 设置日志记录器
  9. logger = logging.getLogger('DoubanMovieServer')
  10. # 修复Windows控制台UTF-8编码问题
  11. if sys.platform == 'win32':
  12.     sys.stderr.reconfigure(encoding='utf-8')
  13.     sys.stdout.reconfigure(encoding='utf-8')
  14. # 创建MCP服务器
  15. mcp = FastMCP("DoubanMovieServer")
  16. @mcp.tool()
  17. def get_now_playing_movies(city_pinyin_name: str) -> dict:
  18.     """
  19.     获取指定城市当前正在上映的电影列表。当需要查询当前电影院正在上映的电影时使用此工具。
  20.     参数city_pinyin_name是城市的拼音名称,例如'beijing'、'shanghai'、'xian'等。
  21.     返回一个字典,包含以下键:
  22.         - 'success': 操作是否成功 (bool)
  23.         - 'count': 实际返回的热映电影数量 (int)
  24.         - 'result': 电影信息列表,每个元素是一个包含以下键的字典:
  25.              * 'poster_image_url': 电影海报图片的完整URL
  26.              * 'movie_title': 电影名称
  27.              * 'release_date': 上映时间(年份)
  28.              * 'directors': 导演列表
  29.              * 'main_actors': 主演列表
  30.              * 'rating': 电影评分(浮点数)
  31.     """
  32.     result = {
  33.         'success': False,
  34.         'count': 0,
  35.         'result': []
  36.     }
  37.    
  38.     # 构造豆瓣电影URL
  39.     url = f'https://movie.douban.com/cinema/nowplaying/{city_pinyin_name}/'
  40.     headers = {
  41.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  42.         'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
  43.     }
  44.    
  45.     try:
  46.         logger.info(f"Fetching now playing movies for city: {city_pinyin_name}")
  47.         
  48.         # 发送HTTP请求
  49.         response = requests.get(url, headers=headers, timeout=10)
  50.         response.raise_for_status()
  51.         
  52.         # 解析HTML内容
  53.         soup = BeautifulSoup(response.text, 'html.parser')
  54.         nowplaying_div = soup.find('div', id='nowplaying')
  55.         if not nowplaying_div:
  56.             logger.warning("No 'nowplaying' div found on the page")
  57.             return result
  58.             
  59.         movie_items = nowplaying_div.select('ul.lists > li.list-item')
  60.         
  61.         if not movie_items:
  62.             logger.warning("No movie items found in the 'nowplaying' section")
  63.             return result
  64.         
  65.         # 提取电影信息
  66.         movies = []
  67.         for item in movie_items:
  68.             movie = extract_movie_info(item)
  69.             if movie:
  70.                 movies.append(movie)
  71.         
  72.         # 构建结果
  73.         result['success'] = True
  74.         result['count'] = len(movies)
  75.         result['result'] = movies
  76.         logger.info(f"Successfully fetched {len(movies)} movies for {city_pinyin_name}")
  77.    
  78.     except requests.exceptions.RequestException as e:
  79.         logger.error(f"Request failed: {e}")
  80.     except Exception as e:
  81.         logger.error(f"Error occurred: {e}")
  82.    
  83.     return result
  84. def extract_movie_info(item):
  85.     try:
  86.         # 从data属性获取基本信息
  87.         data_title = item.get('data-title', '')
  88.         data_director = item.get('data-director', '')
  89.         data_actors = item.get('data-actors', '')
  90.         data_release = item.get('data-release', '')
  91.         data_score = item.get('data-score', '0')
  92.         
  93.         # 处理导演和演员信息
  94.         directors = [d.strip() for d in data_director.split('/')] if data_director else []
  95.         main_actors = [a.strip() for a in data_actors.split('/')] if data_actors else []
  96.         
  97.         # 海报图片URL
  98.         poster_img = item.select_one('li.poster img')
  99.         poster_image_url = poster_img['src'] if poster_img and 'src' in poster_img.attrs else ""
  100.         
  101.         # 电影标题 - 优先使用data-title属性
  102.         movie_title = data_title
  103.         
  104.         # 评分处理
  105.         rating = 0.0
  106.         try:
  107.             # 尝试从data-score属性获取评分
  108.             if data_score and data_score != '0':
  109.                 rating = float(data_score)
  110.             else:
  111.                 # 如果data-score不可用,尝试从页面元素获取
  112.                 rating_tag = item.select_one('li.srating span.subject-rate')
  113.                 if rating_tag and rating_tag.text.strip():
  114.                     rating = float(rating_tag.text.strip())
  115.         except (ValueError, TypeError):
  116.             pass
  117.         
  118.         movie_info = {
  119.             'poster_image_url': poster_image_url,
  120.             'movie_title': movie_title,
  121.             'release_date': data_release,
  122.             'directors': directors,
  123.             'main_actors': main_actors,
  124.             'rating': rating
  125.         }
  126.         
  127.         logger.debug(f"Extracted movie: {movie_info['movie_title']}")
  128.         return movie_info
  129.    
  130.     except Exception as e:
  131.         logger.error(f"Error extracting movie info: {e}")
  132.         return None
  133. # 启动服务器
  134. if __name__ == "__main__":
  135.     mcp.run(transport="stdio")
复制代码

3. 将上述文件传至行空板M10

K10小智与行空板M10 MCP服务器的院线热映电影查询图3


4. 安装依赖库
pip install -r requirements.txt

K10小智与行空板M10 MCP服务器的院线热映电影查询图4


5. 获取 MCP 接入点
登录 xiaozhi.me 的控制台,进入智能体的配置角色页面,右下角可以看到该智能体专属的 MCP 接入点,点击复制。


K10小智与行空板M10 MCP服务器的院线热映电影查询图14






6. 设置环境变量


在行空板M10终端输入:

export MCP_ENDPOINT= 刚才复制的MCP 接入点

K10小智与行空板M10 MCP服务器的院线热映电影查询图5


7. 启动MCP服务器

在行空板M10终端输入:

python mcp_pipe.py
mcp_douban_movie.py

K10小智与行空板M10 MCP服务器的院线热映电影查询图11



K10小智与行空板M10 MCP服务器的院线热映电影查询图12



K10小智与行空板M10 MCP服务器的院线热映电影查询图13






附件
下载附件MCP-Server.zip


下载附件v1.7.5_df-k10.zip









easy猿  初级技师

发表于 2025-6-17 09:47:26

牛逼
回复

使用道具 举报

hnyzcj  版主

发表于 2025-6-17 15:36:39

牛逼
回复

使用道具 举报

zoey不种土豆  超级版主

发表于 2025-6-19 10:17:34

牛逼
回复

使用道具 举报

春秋大仙  初级技匠

发表于 2025-6-19 15:47:33

牛而逼之........
回复

使用道具 举报

刘睿鹏  中级技师

发表于 2025-6-22 16:17:07

此项目甚牛而逼之
回复

使用道具 举报

云天  初级技神

发表于 2025-6-23 15:08:32

这几个库,在行空板上都安装不上,请问您是怎么安装上的,有方法吗?
MonJune-202506233704..png
回复

使用道具 举报

云天  初级技神

发表于 2025-6-23 15:11:18

mcp在行空板上,手动安装也装不上?
MonJune-202506231577..png
回复

使用道具 举报

云天  初级技神

发表于 2025-6-23 17:18:09

云天 发表于 2025-6-23 15:11
mcp在行空板上,手动安装也装不上?

我也安装上了,哈
回复

使用道具 举报

豆爸  初级技匠
 楼主|

发表于 2025-6-24 22:26:49

云天 发表于 2025-6-23 17:18
我也安装上了,哈

恭喜云天大佬!!!!
回复

使用道具 举报

 高级技师

发表于 2025-7-2 11:20:06

解决问题安装上mcp库了

本帖最后由 兆 于 2025-7-2 08:16 编辑

搞定了,https://gitee.com/liliang9693/un ... nstall/README-cn.md   按上面的教程更新下 python版本,在部署离线版本的过程中,用 [color=var(--code-function_v3)]sudo[color=var(--code-block-code-color)] [color=var(--code-function_v3)]apt[color=var(--code-block-code-color)] update 升级下apt,就可以按教程正常安装了。
回复

使用道具 举报

dreamful  见习技师

发表于 2025-7-2 23:35:44

能否不用K10的小智?完全在一个M10上完成所有的工作?比如在M10上已经写好了语音调用大模型的程序,让这个程序去对接MCP来实现这些功能?
回复

使用道具 举报

豆爸  初级技匠
 楼主|

发表于 昨天 13:23

dreamful 发表于 2025-7-2 23:35
能否不用K10的小智?完全在一个M10上完成所有的工作?比如在M10上已经写好了语音调用大模型的程序,让这个 ...

可以的                              
回复

使用道具 举报

dreamful  见习技师

发表于 昨天 13:49


求教程和案例,只在M10上完成所有mcp的任务。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail