iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
自我挑戰組

Python Discord Bot(DC機器人)系列 第 19

Python Discord Bot#19 - 做中學-會員簽到(二) - 進階題

  • 分享至 

  • xImage
  •  

進階題

每天每個人只能簽到一次,
使用Google AppSheet Api 來新增內容,
如有重覆的資料,就不新增了。

結果

https://ithelp.ithome.com.tw/upload/images/20230918/20106071gqK3aPcAHR.png
https://ithelp.ithome.com.tw/upload/images/20230918/20106071g7Yn5nl6jZ.png
https://ithelp.ithome.com.tw/upload/images/20230918/20106071doZCm8ao8B.png

新增 Google AppSheet服務

在我們的試算表中的工具列 > 擴充功能 > AppSheet > 建立應用程式
https://ithelp.ithome.com.tw/upload/images/20230918/20106071Dtp4tAKiCm.png

按進去後就會看到以下的畫面,
https://ithelp.ithome.com.tw/upload/images/20230918/20106071mAf8guHy4m.png

在左邊的Data點選後,可以有一個新增一個Table,Table name 可以自己取,
但是在實驗過程中,因為怕程式無法取得中文,所以才改成英文。
https://ithelp.ithome.com.tw/upload/images/20230918/20106071ikXojjjnuL.png
https://ithelp.ithome.com.tw/upload/images/20230918/20106071o2WGk18IDt.png

欄位

基本上可以直接改試算表欄位,要有一個唯一值,也就是所有的欄位都可以重覆,但一定要有一個欄位只能是一個人有,而我的唯一值(KEY)是由 [ID + 時間] 組成

Name | Type | Key | Show | EDITABLE | SEARCH | FORMULA
---|---|---|---|---|---
_RowNumber | Number | N | N | Y | N | ""
ID | TEXT | N | Y | Y | Y | ""
日期 | DATE | N | Y | Y | Y | ""
時間 | DATETIME | N | Y | Y | N | ""
暱稱 | TEXT | N | Y | Y | Y | ""
_ComputedKey | TEXT | Y | Y | N | Y | CONCATENATE([ID],": ",[日期])

Deploy 部署

點選在左邊的Deploy ,往下劃, 點選 「Move app to deplyed state despite errors」,
當有綠色點點就表示完成了。
https://ithelp.ithome.com.tw/upload/images/20230918/20106071j8YBpSkGRx.png
https://ithelp.ithome.com.tw/upload/images/20230918/20106071Vy82D2jvXE.png
https://ithelp.ithome.com.tw/upload/images/20230918/20106071t2TajrWz4v.png

Google AppSheet

官方文件
使用 URL POST

Code

googleAppSheet.py

import os
import requests


# google appsheet
def app_sheet_init(tableId, payload):
  appId = os.getenv("GOOGLE_APPSHEET_ID")
  url = f'https://api.appsheet.com/api/v2/apps/{appId}/tables/{tableId}/Action'
  headers = {'ApplicationAccessKey': os.getenv("GOOGLE_APPSHEET_TOKEN")}
  
  x = requests.post(url, headers=headers, json=payload)
  return x.text

def app_sheet_find(tableId, selector):
  return app_sheet_init(tableId, {
    "Action": "Find",
    "Properties": { 
      "Locale": "zh-tw",
      "Selector": selector
    },
  })

def app_sheet_add(tableId, data):
  payload = {
    "Action": "Add",
    "Properties": { "Locale": "zh-tw" },
    "Rows": [ data ]
  }
  app_sheet_init(tableId, payload)

tool_checkin.py

def main(Bot):
    name = "簽到"
    print(f"{name} 註冊成功")

    def check_in_data(member):
      try:
        now = moment.now().timezone("Asia/Taipei")
        selector = f"FILTER('checkIn',([_ComputedKey] = '{str(member.id)}: {now.format('MM/DD/YYYY')}'))"
        resultStr = app_sheet_find("checkIn", selector)

        result = json.loads(resultStr)
        if (len(result) > 0):
          return "你今天已經簽到過了喔w😚"
        else :
          app_sheet_add("checkIn", {
            "ID": str(member.id),
            "日期": moment.now().format("YYYY/MM/DD"),
            "時間": moment.now().format("YYYY/MM/DD HH:mm:ss"),
            "暱稱": member.display_name
          })
          return "簽到成功✅"
      except:
        return "⚠️簽到失敗,請通知管理員處理"
        
    @Bot.command(name=name)
    async def check_in_form_command(ctx):
      await ctx.send(check_in_data(ctx.author))
    
    @Bot.slash_command(name=name, description="成員簽到")
    async def check_in_from_slash_command(ctx):
      await ctx.respond(check_in_data(ctx.author))

上一篇
Python Discord Bot#18 - 做中學-會員簽到(一)
下一篇
Python Discord Bot#20 - 做中學-管理員限定!
系列文
Python Discord Bot(DC機器人)31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言