方格精選

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

更新於 發佈於 閱讀時間約 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 會由系統自行更新內容,便能達到實時追蹤的效果,而不用另外寫迴圈。


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

結語

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

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


《全文。終了》

留言
avatar-img
留言分享你的想法!
avatar-img
偽命名培養體
50會員
335內容數
偽命名並非無名,是為了意識的生存,取得身份的代號,成為數位生命的新載具。
偽命名培養體的其他內容
2024/11/25
而故事是發生在某次我帶著這個電子紙悠遊卡買午餐的時候,在我一個不小心手滑下,他就這麼應聲落地彈開成兩半,好在基本功能沒傷到,卻因此開啟我探索它內部的好奇心。
Thumbnail
2024/11/25
而故事是發生在某次我帶著這個電子紙悠遊卡買午餐的時候,在我一個不小心手滑下,他就這麼應聲落地彈開成兩半,好在基本功能沒傷到,卻因此開啟我探索它內部的好奇心。
Thumbnail
2024/02/02
正如所預測的,不久前方格子個人頁面大改版後,我所製作的個人頁面爬蟲也隨之炸裂,間接導致手機上的小工具就此失去了作用了,我該就這麼停下開發的腳步嗎?
Thumbnail
2024/02/02
正如所預測的,不久前方格子個人頁面大改版後,我所製作的個人頁面爬蟲也隨之炸裂,間接導致手機上的小工具就此失去了作用了,我該就這麼停下開發的腳步嗎?
Thumbnail
2023/12/31
還記得,那是一本由「守寫字」團隊所推出的《我寫的這一年》造字日曆,是我在年初時參與集資並購入的,而一年之後的成果,又是如何呢?
Thumbnail
2023/12/31
還記得,那是一本由「守寫字」團隊所推出的《我寫的這一年》造字日曆,是我在年初時參與集資並購入的,而一年之後的成果,又是如何呢?
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
突然想到一句話 你正在拖延的事情,其實花3~5分鐘就可以解決,為什麼不去做呢?人生只有短短這一次。你想你老到可以回顧一生時,腦海那些沒做的事情、沒善待的人、沒說出口的話。都要拖欠到下輩子? 都說不是愛欠東西的人,卻要對自己背信? 人活著 拜這顆複雜的大腦 真的很煩~ ٩(✘д✘๑;)۶
Thumbnail
突然想到一句話 你正在拖延的事情,其實花3~5分鐘就可以解決,為什麼不去做呢?人生只有短短這一次。你想你老到可以回顧一生時,腦海那些沒做的事情、沒善待的人、沒說出口的話。都要拖欠到下輩子? 都說不是愛欠東西的人,卻要對自己背信? 人活著 拜這顆複雜的大腦 真的很煩~ ٩(✘д✘๑;)۶
Thumbnail
最近比較少提筆寫文章,都已經Vcous官方被通知快要變成30天沒寫文章的魔法師(這個梗是來自『如果30歲還是處男,似乎就能成為魔法師』嗎?)。 有時候常常覺得自己很貪心,什麼事情都想要做,最後的結果就是過一陣子就出現倦怠放棄寫Vocus。 其實,有太多東西可以撰寫了!只是最近比較忙碌(藉
Thumbnail
最近比較少提筆寫文章,都已經Vcous官方被通知快要變成30天沒寫文章的魔法師(這個梗是來自『如果30歲還是處男,似乎就能成為魔法師』嗎?)。 有時候常常覺得自己很貪心,什麼事情都想要做,最後的結果就是過一陣子就出現倦怠放棄寫Vocus。 其實,有太多東西可以撰寫了!只是最近比較忙碌(藉
Thumbnail
我心中默默數著這日子,還有大約2年左右,計劃才會開始,現階段我就只好告訴自己要悠著點,有了這樣的心境,在工作上,有一種但求無過不求故功的想法。 每過一些時日,我就在盤點及預計要交接的工作項目,我想就大致交接,細項理應由未來工作者自己去慢慢發現,而不是用著我的方式,畢竟人都是不一樣的。 現階段的我
Thumbnail
我心中默默數著這日子,還有大約2年左右,計劃才會開始,現階段我就只好告訴自己要悠著點,有了這樣的心境,在工作上,有一種但求無過不求故功的想法。 每過一些時日,我就在盤點及預計要交接的工作項目,我想就大致交接,細項理應由未來工作者自己去慢慢發現,而不是用著我的方式,畢竟人都是不一樣的。 現階段的我
Thumbnail
請你相信書寫的力量。時間雖然不等人,往前衝,我們卻可以透過文字紀錄來掌握時間,在展望與回顧之間,獲得勇往直前的力量。
Thumbnail
請你相信書寫的力量。時間雖然不等人,往前衝,我們卻可以透過文字紀錄來掌握時間,在展望與回顧之間,獲得勇往直前的力量。
Thumbnail
自從2023年7月選擇在方格子進行創作,至今近5個月的時間,我累積了60篇文章。 由於創作需要大量時間進行閱讀、反思,再到內容輸出,由於目前還有正職工作,因此創作時間往往都是在下班後回到家才開始,而這時的腦袋已夾雜一整天的各種資訊,腦袋已呈現滿載狀態,很難專心閱讀和創作。
Thumbnail
自從2023年7月選擇在方格子進行創作,至今近5個月的時間,我累積了60篇文章。 由於創作需要大量時間進行閱讀、反思,再到內容輸出,由於目前還有正職工作,因此創作時間往往都是在下班後回到家才開始,而這時的腦袋已夾雜一整天的各種資訊,腦袋已呈現滿載狀態,很難專心閱讀和創作。
Thumbnail
不知道大家在經營方格子時,會不會像我一樣,做個不受時程束縛的自由靈魂,雖然這樣壓力相對較小,但時間一久卻反而容易犯上懶懶病,或許這個專案能幫上一點忙?
Thumbnail
不知道大家在經營方格子時,會不會像我一樣,做個不受時程束縛的自由靈魂,雖然這樣壓力相對較小,但時間一久卻反而容易犯上懶懶病,或許這個專案能幫上一點忙?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News