使用Notion搭建遊戲清單『Part2 遊戲清單的每日自動更新代碼』

Notion集成

往期勘誤(Part 1)數據庫新建屬性需要多加一個文件和媒體:遊戲封面圖,用來展示遊戲的封面,寫的時候漏掉了,其他無需更改,望各位見諒

注意:各位記得把自己的隱私設置全部設置爲公開,要不然會返回沒有訪問權限。(查看我的個人資料→編輯個人資料→隱私設置)

簡單介紹

Notion集成使開發人員能夠以編程方式與 Notion 工作區進行交互。這些集成有助於將 Notion工作區數據與其他應用程序或 Notion 中的工作流程自動化相關聯。主要功能包括:頁面(創建、更新和檢索頁面內容)、數據庫(管理數據庫、屬性、條目和架構)、用戶(訪問用戶配置文件和權限)、註釋(處理頁面和內聯註釋)、內容查詢(搜索工作區內容)、身份驗證(與 OAuth 2.0 的安全集成)、鏈接預覽(自定義鏈接在共享時的顯示方式)。

創建 Notion 集成,爲團隊解鎖新的可能性。

Notion集成有兩種類型:內部和公共。我們使用的內部集成。

申請 Notion API

集成安裝在 Notion 工作區中,需要用戶的明確權限才能訪問 Notion 頁面和數據庫。

權限獲取網址:https://www.notion.so/profile/integrations

獲取內部集成密鑰

我們需要將獲取的密鑰記下來。

爲Notion頁面添加集成

在右上角 ... 菜單,最底下找到 + Add Connections(集成) ,左邊出現的這個列表中,找到剛纔你新創建的集成名稱。彈出一個提示框,點擊允許即可。

爲Notion頁面添加集成

獲取遊戲清單數據庫ID

點擊數據庫右上角 ... 菜單,在底下找到拷貝視圖鏈接,點擊複製。

獲取遊戲清單數據庫的id

會獲得類似"https://www.notion.so/17cc74408a6dXXXXXXXXX9ff180c413?v=67fb31e666f742f487bcd52a49ba73c1&pvs=4"這樣的網址,我們需要的是"https://www.notion.so/"和"?v="中間的部分,即"17cc74408a6dXXXXXXXXX9ff180c413"。

以後其他部分的鏈接id獲取也如上所示。

注:一個頁面是由多個不同的塊組成,每個塊都有自己的id,使用哪個id就編輯哪個塊。若是不小心刪除了數據庫,新建後的數據庫id會與原先不同,需要重新獲取。

API請求格式(可以不看)

在講解代碼之前,對提交給API的數據有什麼樣的格式要求。

詳情請參考:https://developers.notion.com/reference/property-value-object#all-property-values

所有的頁面的屬性值都包含以下鍵:

  • id(string類型):屬性的基礎標識符。保證此標識符在屬性名稱更改時保持不變。在創建或更新頁面時,我常用的是屬性的名稱。

  • type(string類型):屬性的類型。可能的值爲:"title""rich_text""number""select""multi_select""status""date""files""url""formula""relation""rollup""people""checkbox""url""email""phone_number""created_time""created_by""last_edited_time""last_edited_by"


{   

    "屬性名稱1": {"屬性類型": 編輯/添加的內容},

    "屬性名稱2": {"屬性類型": 編輯/添加的內容},

    "屬性名稱3": {"屬性類型": 編輯/添加的內容},

}

有些類型的格式比較簡單,比如數字

number

有些就會比較複雜,比如文件

file

好在notion可以自己識別關鍵信息,就比如我們需要修改文件的鏈接地址,就可以直接提交

{"遊戲封面圖":{"files":[{"external":{"url": 修改的url}}]}}

添加屬性也是如此,不過會比修改要稍微具體一些,有些關鍵信息不能省略。

可能需要一些練習來向你的數據庫發出請求,以瞭解Notion是如何構造你的數據的。一旦你掌握了它,你會發現它是非常簡單的,說來說去依舊是字典。代碼如下:

print(json.dumps(requests.get(f"{NOTION_API_BASE_URL}/databases/{NOTION_DATABASE_GAME_LIST}",headers=NOTION_HEADERS).json(), indent=4, ensure_ascii=False))

注:代碼中的NOTION_DATABASE_GAME_LISTNOTION_HEADERS爲全局變量,下一個部分會說明。

輸出的字典中鍵名爲"properties"後面的內容就是所有已建屬性的構成。

我已經幫大家踩過雷了,可以直接使用下面提供的代碼,如果想要自定義,這部分內容則必須要掌握,可以多看上方提供的官方文檔。

Python 代碼

全局變量

我們需要在Part 1中設置的全局變量中加上下面幾行代碼。(爲了輕便,我將兩個類放在同一個python文件下,覺得雜亂的可以分兩個文件來寫)

全局變量

  • NOTION_API_BASE_URL:Notion API的訪問網址前綴,想要修改某個塊,訪問網址格式如爲:"NOTION_API_BASE_URL / 塊的類型(blocks、databases、pages等) / 塊的id"

  • NOTION_TOKEN:Notion API的授權密鑰。(字符串

  • NOTION_HEADER:響應訪問頭,可以照抄,Notion-Version更新的話,可以在https://developers.notion.com/reference/versioning的前幾行看看是哪個版本(已經很久沒變過了)。"User-Agent"的話還是可寫可不寫,詳情請看Part 1。

  • NOTION_PAGE_MAIN_PAGE:整個頁面的id,獲取方式和形式和數據庫相同,在頁面的在右上角 ... 菜單中找。

  • NOTION_DATABASE_GAME_LIST:上文獲取遊戲清單數據庫id。

注:隨着功能的增加,我們的塊ID會越來越多,變量名稱的建議寫的詳細一點,ID變量均爲字符串。

Notion API Class

類成員

Notion API Class方法函數(本期僅涉及遊戲清單的每日更新)

首先要先確認我們在單次更新中需要做什麼:

  1. 獲取steam遊戲列表(所有 / 近期遊玩)。

  2. 找出列表中哪些已收錄在遊戲清單中。

  3. 已收錄的若是遊玩時間 / 成就完成度改變,我們需要更新對應遊戲信息(遊玩時間,已達成成就,遊玩狀態)。

  4. 沒有收錄的,我們需要在清單添加對應遊戲頁面。

  5. 若是近期沒有遊玩某個遊戲,將某個遊戲的"遊玩中"標籤去掉。

  • updateGamePage():更新對應遊戲頁面

updateGamePage方法

傳入參數:pageid(需要修改的頁面的id)、appid(該頁面對應遊戲的appid)、achievementinfo(成就信息,格式與getPlayerAchievements()返回值相同)、playtime(遊玩時間)、type(更新類型)。

如果更新類型爲"Recently",沒全成就的遊戲狀態爲遊玩中;其他類型,沒全成就的遊戲狀態爲待遊玩

注:若是自己設定了其他屬性名,將data內對應的名稱更改即可,如"遊玩時長"、"遊玩狀態"等。

其他就沒什麼好講的,設置修改內容,提交即可。

  • addGamePage():添加對應遊戲頁面

addGamePage方法

傳入參數:appid(該頁面對應遊戲的appid)、geted_app_details(商店信息,格式與getGameDetails()返回值相同)、achievementinfo(成就信息,格式與getPlayerAchievements()返回值相同)、type(更新類型)。

注:若是自己設定了其他屬性名,將data內對應的名稱更改即可,如"遊玩時長"、"遊玩狀態"等。

主體上和updateGamePage()相同新建頁面所需數據更多了而已。

  • updateGameList():更新遊戲清單主體流程框架

updateGamePa方法

注:圖中黃色方框內的是關於遊玩日曆的內容,本期不會涉及,直接註釋掉即可。

輸入參數爲字符串:"Recently"或者"All",意思就是從近期遊玩還是所有遊戲中獲得遊戲列表。

  • 首次運行參數設置爲"All",將所有時長大於0的遊戲添加到遊戲清單中。

  • 如果想要將時長等於0的也添加,將376行的代碼設置爲大於-1。

  • 第一次大批量添加用時會較長,以我個人爲例,188個遊玩遊戲用時70秒左右,將時長爲0的也加入用時會更長,所以不太建議。

  • 以後運行參數設置爲"Recently",steam中時長改變的應該只有Recently中的遊戲,數量較少,遍歷時長短。

下面進行代碼的大致講解:

  • 361:後面我們會使用appid來查找遊戲清單,這一行是搜索清單的url。

  • 362-372:根據輸入參數判斷該從SteamClass的哪個方法中獲取遊戲列表。

  • 373-377:遍歷遊戲列表,如果遊玩時間爲0則跳過,不更新也不添加。

  • 378-379:設置過濾器,尋找數據庫屬性appid爲該值的頁面。

  • 382-384:若是找到(已收錄),獲取收錄的信息(遊玩時間、達成成就數)。

  • 386-387:若是收錄信息與steam獲取信息一致,則跳過不更新頁面。

  • 390-396:不一致則將steam獲取的信息處理,傳入updateGamePage()方法中。

  • 397-403:如果沒有收錄,則從Steam API Class中獲取該遊戲信息,傳入addGamePage()方法中。

  • 409-423:若傳入參數爲"Recently",設置過濾器爲含有遊玩中標籤的遊戲,獲取appid列表,與Recently列表做差集,即是需要改變標籤的遊戲,循環遍歷差集,傳入updateGamePage()方法中修改遊玩狀態。

注:單次post Notion最多返回100個結果,這也就是爲什麼我不用遊戲清單來遍歷。

首次運行

我們第一次運行,主函數設置如下:

初次運行主函數

如果一切設置正確的話,我們的遊戲清單就會像下圖一樣不停冒出遊戲了:

初始化遊戲清單

初始化約1-2分鐘,視steam遊戲庫大小而定。其中的遊戲類型和遊戲要素可以從商店裏獲取,但是個人覺得商店裏的標籤不太準確,還是選擇了自己設定。

等待程序結束後,我們只需要把notion.updateGameList()的參數設置爲"Recently"即可

常規設置

任務計劃程序

如果每日手動運行一遍程序就會與我們的初衷背道而馳,在這裏我選擇Windows自帶的任務計劃程序。打開方式如下兩種:

  • 我的電腦(此電腦)—— 點擊我的電腦(此電腦)—— 管理

  • 運行(或者cmd、powershell窗口中)—— taskschd.msc

按照下圖依此點擊:

新建任務計劃程序

輸入名稱→設置觸發器爲每天→選擇一個電腦經常啓動的時間→操作選擇啓動程序

程序或腳本選擇pythonw.exe,這個不會彈出終端(注意要將python文件夾加入環境變量)。

程序或腳本

添加參數填入我們寫的python腳本的完整地址,注意是連帶文件的,結尾應爲.py。

填寫結束後,在列表中找到剛剛新建的任務,右鍵點擊選擇屬性。

常規

按上圖步驟進行設置,第二步中在框中打入Administrators,點擊檢查名稱後確認即可,配置選擇自己的電腦系統。下面兩圖就是我的設置,可以參考。最後點擊確認即可。

條件

設置

總結

以上就是所有關於每日更新遊戲清單的內容,如果只想要遊戲的數據庫,代碼部分就差不多了,只要再看下一期的清單美化就可以結束了。但是如果還想要遊戲日曆的製作,依舊任重而道遠。

下一期我們會進行遊戲清單的美化和初步建立遊戲日曆(日表,月表,年表),有一點內容是關於數據庫函數屬性的設置,可以提前瀏覽相關內容:

瞭解notion函數:https://sspai.com/post/70713

最後,球球點贊和盒電

系列內容鏈接

『Part1 搭建基本框架&建立SteamAPI類』

『Part2 遊戲清單的每日自動更新代碼』

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com