編輯嚴選
[突發專案] 創作懶懶病良藥?|試寫 Vocus 最後文章發布時間計數器

2023/10/20閱讀時間約 13 分鐘

文前碎碎念

又是一個突發的異想天開專案,不知道大家在經營方格子的時候,有沒有一個固定的發文時程,或是想發就發,做個自由的靈魂呢?

雖然寫隨發的創作模式,相對較沒有發表進度的壓力,但相隔的時間一久,所謂拖延症發病的機率也就越大,最終惡化成停更或棄坑的機率也就越大,也因為如此,適時的投藥督促,也就成為持續下去的重要課題之一。

但作為一個不願受到排程束縛的人,要如何時刻提醒自己不能鬆懈太久,何時該動筆了呢?


或許,又是時候該借助科技的力量來變強了。

基礎構想

說到最能警惕自己動身的東西,大概就是時間的流逝了吧,尤其是看著日子一天天過去,轉眼間才發現距離上一篇發文時間,已經超過一個月那種震驚感。

滴答⋯滴答⋯

滴答⋯滴答⋯

雖然方格子已經有一套每月彙整系統,可以提醒創作者們已經許久沒更新專題內容了,但以現實面來看,似乎還是不夠即時。

對⋯對不起嘛⋯ QwQ

對⋯對不起嘛⋯ QwQ

因此這次計畫,就是以時刻能看到自己距離最終發表時間,已經過了多久為目標,來製作一個即時的追蹤工具。


藉由視覺化的計數,來時時為自己創造前進的壓力(?

初步架構

如果要得知上一篇發文時間是多久前的事,那首要步驟就是要先知道最後一篇文章的確切發布時間。

而獲取這項資訊的方法,其一就是直接使用爬蟲掃描自己的資訊頁面,並回傳最新一篇的紀錄日期。

每篇文章下方都會有發布日期紀錄

每篇文章下方都會有發布日期紀錄

這個方法雖然簡單暴力又直覺,但一想到要去處理那些讓人眼花撩亂的網頁語法,並從茫茫資訊海中撈出那行日期來,就覺得豆頁疼痛不已。

幸好,方格子預設提供了另一個更加簡便,並相對乾淨的管道可以讓我們達成目的,就是那個位於自己頭像下方,像廣播的神祕按鈕。

就是它!

就是它!

沒錯,這次我們要使用的是 RSS Feed 裡面所發的內容,來做為這次計算日期的資料來源。


一切準備就緒之,接著就是實際摳頂時間!

摳頂時間

這次專案所使用的,依然是熟悉的 Python 語言,而如果我們想要從 RSS 中取得所需的內容,首先就是要找到一個能夠解析其內容的套件(Package)。

解析 RSS

這裡使用的是 「feedparser」這個套件,我們可以透過它來讀取由方格子首頁複製下來的 RSS Feed 並解析成類似字典(Dictionary)的格式。

import feedparser

# Your RSS Feed Url
urssurl = "https://vocus.cc/rss/user/62138beefd89780001b831e8/articles"

# Parse RSS Feed
feed = feedparser.parse(urssurl)

而解析出來的格式大致上如下圖,看起來頗為複雜,但其實我們只要大致整理一下,就可以找到我們所需的部分。

raw-image

這裡如果仔細觀察內容的話,就可以看到藉由 RSS 推送出來的文章列表,是儲存在「entries」這個項目中,並且是以列表形式記錄,而單篇文章則是以字典形式存在,最新的文章會存在第零位

取得日期

接著我們取出我最近發布的一篇內容來觀察,可以得到像下面這樣的內容。

{
'title': '[開箱] 手機背著輕薄小垃圾?|未來實驗室 MagnaS 磁吸行動電源卡',
'title_detail':{
'type': 'text/plain',
'language': None,
'base': 'https://vocus.cc/rss/user/62138beefd89780001b831e8/articles',
'value': '[開箱] 手機背著輕薄小垃圾?|未來實驗室 MagnaS 磁吸行動電源卡'
},
'links': [
{
'rel': 'alternate',
'type': 'text/html',
'href': 'https://vocus.cc/article/65252cc8fd89780001c150b1'
}
],
'link': 'https://vocus.cc/article/65252cc8fd89780001c150b1',
'summary': '不知道有多少人跟我一樣有種電量焦慮的毛病,只要一出門,哪怕只是一兩小時,都還是會順手帶上一塊厚重行動電源作保險,不過今天開箱的這類產品,或許能緩解這種情況?',
'summary_detail':{
'type': 'text/html',
'language': None,
'base': 'https://vocus.cc/rss/user/62138beefd89780001b831e8/articles',
'value': '不知道有多少人跟我一樣有種電量焦慮的毛病,只要一出門,哪怕只是一兩小時,都還是會順手帶上一塊厚重行動電源作保險,不過今天開箱的這類產品,或許能緩解這種情況?'
},
'id': '65252cc8fd89780001c150b1',
'guidislink': False,
'authors': [{'name': 'Mercteria'}],
'author': 'Mercteria',
'author_detail': {'name': 'Mercteria'},
'published': 'Tue, 10 Oct 2023 14:44:07 GMT',
'published_parsed': time.struct_time(tm_year=2023, tm_mon=10, tm_mday=10, tm_hour=14, tm_min=44, tm_sec=7, tm_wday=1, tm_yday=283, tm_isdst=0),
'updated': '2023-10-10T22:44:07+08:00',
'updated_parsed': time.struct_time(tm_year=2023, tm_mon=10, tm_mday=10, tm_hour=14, tm_min=44, tm_sec=7, tm_wday=1, tm_yday=283, tm_isdst=0)
}

內容基本上就是關於單篇文章的基本資訊,一般來說是推送出來給 RSS 閱讀器去讀取解析的。

而我們這裡所需要的,其實就只有「published」欄位,也就是該篇文章的發布日期,因此只要以下列格式就能從字典取得。

catim = feed['entries'][0]['published']

時間計算

取得發布時間之後,接著下一步就是要把它轉成程式看得懂的格式。

這裡我們為了省去判斷時間格式的步驟,因此同樣直接借助套件之力,直接使用「dateutil」中的「parser.parse()」功能,來將文字格式的時間,轉換成 Datetime 格式

from dateutil import parser
pbt = parser.parse(catim)

接著我們使用「datetime」中的「datetime.datetime.now()」來取得目前系統時間,不過要注意的是,我們取得 RSS 中的發布日期是以 GMT 標準時間紀錄,因此我們還要用「datetime.timezone.utc」這個參數來轉換指定時區。

import datetime
utc = datetime.datetime.now(datetime.timezone.utc)

轉換完畢後,就可以直接進行計算拉,這樣就可以知道自己最後發布文章是多久的事了。

# Print Range
print(utc-pbt)

執行結果

不過使用這個方法所計算出來的時間,直接印出來的話,會是一整串從日到毫秒的文字。

raw-image

以這種又臭又長的資訊內容,一般人直接看上去,應該也還是會完全無感,甚至直接忽略,這樣便可能無法達到所想要的效果。


嗯,既然要做就要做到好,不如我們就來美化一下吧!

細部打磨

做到這裡,我們已經可以實際計算出時間間隔了,接下來的目標,就是要讓自己一眼看上去,就會產生緊張感(?)。

而為了達成此一目的,我們便需要將這種程式化的輸出,轉換成一般人類的語言,不過由於這部分,大家的觀點都不盡相同,因此這裡就直接上我自己的實作方式給大家參考吧!

註:此部分接續上方取得時間後的語法。
# Transform Calculate Result to Seconds
tmcal = (utc-pbt).total_seconds()

# Reference Dictionary
sctr = {
"sec":{"sec":1,"uni":"S"},
"min":{"sec":60,"uni":"M"},
"hor":{"sec":3600,"uni":"H"},
"day":{"sec":86400,"uni":"D"},
}

# Search From Reference to Check Eligible Conditions
srh = [k for k,v in sctr.items() if tmcal > v["sec"]]

# If Any Matches
if srh:
srh = srh[-1]
res = {"val":int(tmcal/sctr[srh]["sec"]),"uni":sctr[srh]["uni"]}
else:
res = {"val":"<1","uni":"S"}

# Print Message
msg = " ".join(["最後發文",str(res["val"]),res["uni"],"前"])

這裡主要是先將計算出的結果先轉換成秒數,接著根據預設好的字典來換算數值及單位後,再組合成完整的句子,最後輸出結果就會像這樣。

# 假設發文時間:2023-10-17 02:55:24
# 目前測試時間:2023-10-19 14:58:21
# 輸出結果
# ———
最後發文 2 D

是不是直覺多了呢,這樣就大致上完成核心的部分,可以即時得知最後一次發文是距今多久以前的事囉!


不過總感覺好像還少了些甚麼,有點空虛⋯

加碼應用

雖說是寫好主要功能了,但要執行它每次都需要下指令的繁瑣步驟,好像還是無法阻擋懶懶病蔓延。

不如就來直接加碼一下,把它打包成一個獨立運作的小工具讓大家玩玩吧!

Windows

使用方法也很簡單,從 [這裡] 下載完解壓縮,並開啟應用後,它就會跳出一個視窗讓你輸入自己的 RSS Feed 網址。

raw-image

按下 Login 之後,就可以看到天數啦,原則上只要不把程式關掉,它就會在背景定時掃描 RSS 內容並更新日數。

raw-image

不過程式重開後 RSS 就要重新輸入,這點仍有待修正中,系統部分也只支援 Windows,還請見諒。

PS Code: mercteria@Vocus

iOS / iPadOS

另外,如果之前有參考我這篇 [應用] 隨時都要來點摳頂 | Pythonista 行動 Python IDE 工具推坑 ( IOS ) 而購入「Pythonista」這套工具的朋友,也可以藉由它內建的 Widget 功能,把這個計數器放到 iPhone / iPad 上使用喔。

raw-image

實際效果就像這樣,手機上的 Widget 會由系統自行更新內容,便能達到實時追蹤的效果,而不用另外寫迴圈。


嗯,看到這裡,是不是整個壓力感就上來了呢,真是太棒了呢(誤

結語

好啦,這次突發專案就到這裡結束,原本只是無意間腦袋撞出的想法,沒想到最後還是幫他寫了這麼多呢,也希望這篇能為大家帶來一些有用的東西囉。

題外話,由於方格子最近更新了編輯器,還有文章的排版方式,目前還在摸索習慣中,因此如果這篇排版有甚麼較雜亂的部分,也歡迎留下意見喔。


《全文。終了》

25會員
170內容數
偽命名並非無名,是為了意識的生存,取得身份的代號,成為數位生命的新載具。
留言0
查看全部
發表第一個留言支持創作者!