DAY24 linebot完结篇

import json,ast
from django.db.models.query import QuerySet
from django.http.response import JsonResponse
from chatbot import urls
from django.db.models.fields import EmailField
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
 
from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import (
    MessageEvent,
    TextSendMessage,
	PostbackEvent
)
from linebot.models.events import Postback
from linebot.models.responses import Content, Profile
from linebot.models.sources import Source
from .message import Featuresmodel, Message
from .team import Team
from .report import Report
from .schedule import Schedule
from .root_team import Root_Team
from .name import Name
from chatbot.models import *
from datetime import datetime, timezone, timedelta
from chatbot import schedule
line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)
# Create your views here.

@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)  # 传入的事件
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            if isinstance(event, MessageEvent):  # 如果有normal讯息事件                
                if event.message.text == "功能列表":
                    line_bot_api.reply_message(  # 回复「功能列表」按钮样板讯息
                        event.reply_token,
                        Featuresmodel().content()   
                    )
                if event.message.text[0] == "姓":
                    uid=event.source.user_id
                    name=event.message.text[3:]
                    if is_all_chinese(name)==True:
                        message=[]
                        if User_Info.objects.filter(name=name).exists()==True:
                            line_bot_api.reply_message( 
                            event.reply_token,
                            TextSendMessage(text="已经有建立会员资料罗") 
                            )
                        # elif User_Info.objects.filter(uid=uid).exists()==True:
                        #     line_bot_api.reply_message( 
                        #     event.reply_token,
                        #     TextSendMessage(text="已经有建立会员资料罗") 
                        #     )
                        else:
                            User_Info.objects.create(uid=uid,name=name)
                            line_bot_api.reply_message( 
                            event.reply_token,
                            Team().content()
                            )
                    else :
                        line_bot_api.reply_message(  
                            event.reply_token,
                            TextSendMessage(text="请输入中文名字") 
                            )
                if event.message.text[:9] == "[昨日完成进度]:":
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    user.yesterday_temp=event.message.text[9:]#将使用者输入的昨日完成进度暂存到资料库
                    user.save()
                    line_bot_api.reply_message(  # 回复「功能列表」按钮样板讯息
                        event.reply_token,
                        TextSendMessage(text="请输入\n"+"[今日规划进度]:") 
                    )
                if event.message.text[:9] == "[今日规划进度]:":
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    user.today_temp=event.message.text[9:] #将使用者输入的今日规划进度暂存到资料库
                    user.save()
                    line_bot_api.reply_message(  # 回复「功能列表」按钮样板讯息
                        event.reply_token,
                        TextSendMessage(text="确认是否要修改成\n"+"[昨日完成进度]:"+user.yesterday_temp+"\n"+"[今日规划进度]:"+user.today_temp+"\n"+"Y/N")
                    )
                if event.message.text== "Y":
                    tz = timezone(timedelta(hours=+8))
                    now=datetime.now(tz).isoformat()
                    today = str(now)[:19]
                    uid=event.source.user_id 
                    user=User_Info.objects.get(uid=uid)
                    user.yes_project=user.yesterday_temp
                    user.tod_project=user.today_temp
                    user.update_project=today
                    user.save()
                    user.yesterday_temp=0
                    user.today_temp=0
                    user.save()
                    line_bot_api.reply_message( 
                        event.reply_token,
                        TextSendMessage(text="专案进度修改成功\n"+"当前的专案进度:\n"+"[昨日完成进度]:"+user.yes_project+"\n"+"[今日规划进度]:"+user.tod_project)
                    )
                if event.message.text== "N":
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    user.yesterday_temp=0
                    user.today_temp=0
                    user.save()
                    line_bot_api.reply_message( 
                        event.reply_token,
                        TextSendMessage(text="你已放弃专案修改\n"+"当前的专案进度:\n"+"[昨日完成进度]:"+user.yes_project+"\n"+"[今日规划进度]:"+user.tod_project)
                    )
                if event.message.text[:9] == "[我要成为管理员]":
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    user.root=1 #将使用者晋升为管理员
                    user.save()
                    line_bot_api.reply_message(  
                        event.reply_token,
                        TextSendMessage(text="你已经成为管理员")
                    )

            if isinstance(event, PostbackEvent):  # 如果有normal讯息事件
                #以下为按钮“注册按钮“

                if event.postback.data[0] == "注" and event.postback.data[1] == '册':
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text="请输入姓名:\n"+"格式如下\n"+"姓名:") 
                    )
                if event.postback.data[0] == "组" and event.postback.data[1] == '别':
                    team=str(event.postback.data[3:])
                    if User_Info.objects.filter(team=team).exists()==True:
                        line_bot_api.reply_message(  # 回复「功能列表」按钮样板讯息
                        event.reply_token,
                        TextSendMessage(text="已经有建立会员资料罗") 
                        )
                    else:
                        uid=event.source.user_id
                        user=User_Info.objects.get(uid=uid)
                        user.yesterday=1
                        user.save()
                        line_bot_api.reply_message(  
                        event.reply_token,
                        TextSendMessage(text="注册完毕") 
                        )
                    #以下为按钮“签到“
                if event.postback.data[0] == "签" and event.postback.data[1] == '到':
                    tz = timezone(timedelta(hours=+8))
                    now=datetime.now(tz).isoformat()
                    # now = (datetime.datetime.now()).isoformat()   #获取当下时间
                    today = str(now)[:19]
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    user.date=today
                    user.date_day1=today
                    user.save()
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text="签到完毕\n"+"签到时间为:"+today) 
                    )
                    #以下为按钮“专案进度“
                if event.postback.data[0] == "专" and event.postback.data[1] == '案':
                    line_bot_api.reply_message(
                        event.reply_token,
                        Report().content()  #回复「专案进度」按钮样板讯息
                        # TextSendMessage(text=Report().content()) 
                    )
                if event.postback.data[0] == "回" and event.postback.data[1] == '报':
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text="[昨日完成进度]:"+user.yes_project+"\n\n"+"[今日规划进度]:"+user.tod_project) 
                    )
                if event.postback.data[0] == "修" and event.postback.data[1] == '改':
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text="请输入\n"+"[昨日完成进度]:") 
                    )
                if event.postback.data[0] == "查" and event.postback.data[1] == '看':  #不是管理员身份
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    if user.root =="1":
                        line_bot_api.reply_message(
                            event.reply_token,
                            Root_Team().content()
                        )
                    else :
                        line_bot_api.reply_message(
                            event.reply_token,
                            TextSendMessage(text="你不是管理员无法使用") 
                        )
                #获得管理权限後查看_选则组别
                if event.postback.data[:5] == "Root:":
                    choose=str(event.postback.data[5:]) #选择要的组别名称
                    # user=User_Info.objects.filter(team=choose)
                    all=''
                    for data in User_Info.objects.filter(team=choose):
                        if data.update_project == "":
                            data.update_project="[本日尚未回报进度]"
                        message="姓名:"+data.name+"\n"+"组别:"+data.team+"\n"+"[昨日完成进度]:"+data.yes_project+"\n"+"[今日规划进度]:"+data.tod_project+"\n"+"[专案进度更新时间]:"+data.update_project+"\n\n"
                        all=all+message
                    line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(text=all) 
                    )
                #本日尚未签到的按钮
                if event.postback.data[0] == "本" and event.postback.data[1] == '日':
                    all=""
                    for data in User_Info.objects.filter(date=""):
                        message="姓名:"+data.name+"\n"+"组别:"+data.team+"\n\n"
                        all=all+message
                    line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(text="[本日尚未签到的使用者]\n"+all) 
                    )
                #时刻表的按钮
                if event.postback.data[0] == "时" and event.postback.data[1] == '刻':
                    uid=event.source.user_id
                    user=User_Info.objects.get(uid=uid)
                    if user.root =="1":
                        line_bot_api.reply_message(
                        event.reply_token,
                        Schedule().content() #回复「时刻表」按钮样板讯息
                        )
                    else :
                        line_bot_api.reply_message(
                            event.reply_token,
                            TextSendMessage(text="你不是管理员无法使用") 
                        )
                #时刻表选取的组别
                if event.postback.data[:9] == "Schedule:":
                    choose=str(event.postback.data[9:]) #选择 时刻表 要的查看组别名称
                    list=[]
                    for data in User_Info.objects.filter(team=choose):
                        new_body={
                                "type": "button",
                                "action": {
                                "type": "postback",
                                "label": data.name,
                                "data": "Name="+data.name
                                },
                                "margin": "sm",
                                "color": "#0066ff",
                                "style": "primary"
                            }
                        list.append(dict(new_body))                
                    line_bot_api.reply_message(
                        event.reply_token,
                        Name().content(list)
                    )
                if event.postback.data[:5] == "Name=":#选择时刻表_姓名後列出项目
                    data=User_Info.objects.get(name=event.postback.data[5:])
                    if data.update_project == "":
                        data.update_project="[本日尚未回报进度]"
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text="姓名:"+data.name+"\n"+"[最新签到时间]:"+data.date+"\n"+"[近期七天签到时间]:"+data.date_day1+"\n")
                    )
        return HttpResponse()
    else:
        return HttpResponseBadRequest()


#检验是否全是中文字符
def is_all_chinese(strs):
    for _char in strs:
        if not '\u4e00' <= _char <= '\u9fa5':
            return False
    return True

以上是views.py的完整程序码
YA~这样我们就完成了DAY2所提到的文件,唯一美中不足的是我使用的电脑是MAC-M1,所以在排程的部分好像出了点小问题,其他主要的功能大致上是都完成了。开心^^

这边我简单的在做一下总结,先安装完需要的条件後,设定一些东西像是ngrok的网址,到views写主程序,把不同样板独立写出来需要的时候再呼叫就好,主程序中需要的东西就对django资料库做CRUD大概是这样。


今天的歌曲是 周杰伦-藉口 Excuse
https://www.youtube.com/watch?v=KcK8WurGpEQ&list=PLFl6Na2uUoOZBEhBtQ_jeGA4P1V20JvpW&index=23&ab_channel=%E5%91%A8%E6%9D%B0%E5%80%ABJayChou


<<:  IT 铁人赛 k8s 入门30天 -- day25 Indexed Job for Parallel Processing with Static Work Assignment

>>:  Day 25 -资料库应用小程序 创建资料库

NIST SDLC和RMF(续)-PartII

-NIST SDLC和RMF 在启动项目後进行系统分类;这意味着已经开发了一个业务案例,并且已选择...

【Day8】 将Function当成state传给子类别套用在事件上吧≖‿≖

相信各位看官们很熟悉各种Html的Events事件, 这篇呢~我们要透过上一篇所提到的State传入...

Day22 测试写起乃 - Sidekiq Testing

sidekiq testing 是用来在测试环境时调整 sidekiq 模式 require 'si...

Day24:终於要进去新手村了-Javascript-函式-物件建立练习

这一篇我会使用彭彭教学中的例子加上自己理解的方式做解释以及纪录。 在彭彭课程之中的程序码如下: va...

[day9]API就位罗~串接永丰API规划

##API规划 先准备这次消费串接的API,主要需要三支API 订单建置API 目的: 由网站点选缴...