You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python LineBot报错name 'events' is not defined 求助

Line Bot 错误修复:name 'events' is not defined 及代码优化

核心错误原因

你直接写了for event in events:但events变量根本没定义——Line Bot的事件不是这么直接遍历的,得通过WebhookHandler的装饰器来接收和处理Line服务器发来的事件请求。

代码里的其他问题

  • Eatmodel.content()方法里错误地把line_bot_api.push_message()塞进了TemplateSendMessage的参数里,这完全不符合语法,push_message是发送消息的方法,不能作为模板消息的一部分。
  • 缺少必要的导入:MessageEvent和TextMessage(用来判断文本消息事件)
  • 没有Webhook的请求处理入口(Line服务器需要把用户消息POST到你的某个接口)

修正后的完整代码

from linebot import LineBotApi, WebhookHandler
from linebot.models import (
    PostbackAction, URIAction, MessageAction, 
    TemplateSendMessage, ButtonsTemplate,
    MessageEvent, TextMessage  # 补充缺失的导入
)

# 填入你的token和secret
line_bot_api = LineBotApi('你的LINE_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('你的LINE_CHANNEL_SECRET')

class Eatmodel():
    def content(self):
        # 直接返回TemplateSendMessage对象,不要嵌套push_message
        return TemplateSendMessage(
            alt_text='ButtonsTemplate',
            template=ButtonsTemplate(
                title='Eat點通-常見問題',
                text='選擇問題',
                actions=[
                    MessageAction(label='會員問題', text='會員問題'),
                    MessageAction(label='食譜問題', text='食譜問題'),
                    MessageAction(label='健康小知識', text='健康小知識'),
                    MessageAction(label='廚房小知識', text='廚房小知識')
                ]
            )
        )

# 使用handler的装饰器处理文本消息事件
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    # 检测关键词"home"
    if event.message.text == "home":
        # 回复消息用reply_message,传入reply_token和模板消息
        line_bot_api.reply_message(
            event.reply_token,
            Eatmodel().content()
        )

# 如果是用Flask做Web服务,需要添加下面的路由(如果用其他框架类似)
from flask import Flask, request, abort

app = Flask(__name__)

@app.route("/callback", methods=['POST'])
def callback():
    # 获取请求中的签名和正文
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    
    # 处理Webhook请求
    try:
        handler.handle(body, signature)
    except Exception as e:
        abort(400)
    return 'OK'

if __name__ == "__main__":
    app.run()

关键改动说明

  • 补充了MessageEvent和TextMessage的导入,才能正确识别用户的文本消息事件
  • 用@handler.add(MessageEvent, message=TextMessage)装饰器替代了原来无意义的for循环,这是Line Bot处理事件的标准方式
  • 修复了Eatmodel.content()的逻辑,让它返回正确的TemplateSendMessage对象,不再错误嵌套push_message
  • 添加了Flask的Webhook路由,这是接收Line服务器消息请求的必要入口(如果用Django等其他框架,需要对应调整路由)
  • 用reply_message回复用户消息,而不是硬编码用户ID的push_message(push_message是主动发消息给用户,reply_message是回复用户的消息,符合你的需求)

内容的提问来源于stack exchange,提问作者Martin Hsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:35