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_LIST和NOTION_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方法函數(本期僅涉及遊戲清單的每日更新)
首先要先確認我們在單次更新中需要做什麼:
獲取steam遊戲列表(所有 / 近期遊玩)。
找出列表中哪些已收錄在遊戲清單中。
已收錄的若是遊玩時間 / 成就完成度改變,我們需要更新對應遊戲信息(遊玩時間,已達成成就,遊玩狀態)。
沒有收錄的,我們需要在清單添加對應遊戲頁面。
若是近期沒有遊玩某個遊戲,將某個遊戲的"遊玩中"標籤去掉。
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
最後,球球點贊和盒電。
系列內容鏈接
更多遊戲資訊請關註:電玩幫遊戲資訊專區
電玩幫圖文攻略 www.vgover.com