2025年4月6日 星期日

Python 學習筆記 : 用 Telegram Bot 取代 LINE Notify (一)

由於 LINE Notify 服務已於 2025-04-01 終止, 必須為我的眾多爬蟲找尋替代方案, 比較之後覺得還是改用免費的 Telegram 好了, 實作方式也比 LINE 簡單得多, 作法參考 :


Telgram Bot 的優點摘要整理如下 :
  • 免費且無流量限制, 提供完整的通知服務
  • Telegram Bot 設定步驟簡單, 使用 HTTP 呼叫 API 即可傳遞訊息
  • 支援文字, 圖片, 影片, 文件等多媒體格式訊息
  • 支持自定義的訊息格式, 按鈕回應和群組通知, 可應用於即時提醒, 客服回應, 排程通知等
雖然 Telegram 是免費, 但為了防止濫用仍有如下用量之限制 :
  • 每個 Bot 每秒最多只能發出 30 個訊息
  • 每個 Bot 每分鐘最多只能發出 20 個訊息給每個聊天室 (包含群組和頻道)
  • 每個 Bot 每小時最多只能發出 1000 個訊息給每個聊天室 (包含群組和頻道)
  • 每個 Bot 每天最多只能發出 50000 個訊息
參考書籍 :


其他 Telegram Bot 教學 :



1. 安裝 Telegram App : 

建立 Telgram 機器人之前要先安裝 Telgram App, 它就像 LINE 一樣是接收/傳送/顯示即時訊息的 UI 介面. 在手機開啟 Google Play 或 App Store 搜尋 Telegram 後安裝 App (注意, 此 App 沒有中文介面, 用預設的英文介面就好) : 




開啟 Telegram App :




接下來會傳簡訊驗證手機號碼, 按 Continue 繼續 :




要求撥打電話給你, 按 "允許" : 




選擇國家 Taiwan, 輸入手機號碼 :




要求允許讀取通話紀錄以便自動讀取驗證簡訊, 按 Continue : 




輸入姓名按右下角的右箭頭 : 




允許 Telegram 傳送通知 :




這樣就完成 App 的安裝了 : 




按左上角的三條槓點選 Contacts :




按 Continue 允許 Telegram 讀取通訊錄 :




按允許 : 




這樣通訊錄上已有 Telegram 帳戶的人就會出現在 Telegram 聯絡人列表上了 :




可以按右下角的 + 鈕新增連絡人. 


2. 建立 Telegram Bot 取得 API token 與 Chat ID : 

建立 Telgram 機器人先安裝 Telgram App, 到 Google Play 或 App Store 搜尋 Telegram 後安裝 (此 App 沒有中文介面, 用預設的英文介面就好), 完成後執行此 App, 按右上角的搜尋鈕 :




輸入 BatFather 會出現一堆 BatFather 名稱的帳號, 找有藍勾勾且 users 數超過 275 萬的那個才是正宗機器人之父, 其他全部是假的不要點 (如果找不到可以只輸入部分例如 BotFa) :




點選 BatFather 後進入其聊天室, 按底下的 START 鈕 :




在最底下輸入 /newbot 指令 (Telegram 的指令都是用 / 開始) 後按右邊發送鈕建立機器人 :





這時他會問你這個機器人要取甚麼名字 (name), 在底下輸入名稱後按右邊發送鈕 :




接下來要為機器人取一個使用者名稱 (username), 在底下輸入名稱後按右邊發送鈕 :




結果 twstock_bot 這個 username 已經被別人用了, 所以我改用 twstock168_bot :




收到如下回應表示 username 已設定完成, 回應裡面的 HTTP API 就是呼叫 Telegram API 時必須提供的權杖 (token), 請將其複製到文字檔中儲存備用 : 




接下來還必須取得聊天室的識別碼 (ID), 先回到 App 首頁, 按右上方的搜尋鈕, 輸入 @userinfobot  搜尋 userinfobot 這個系統機器人, 注意, 必須是如下圖所示的 userinfobot@userinfobot 這個才是正宗, 其他都是假的 (不要亂點, 以免帳號被盜) :



進入 userinfobot 機器人聊天室後按底下的 START 鈕, 它就會傳回你的聊天室 ID : 





請將此 ID 複製貼到文字檔案中儲存備用, 例如我是將其與其他 API Key 或 Token 一起放在目前工作目錄下的純文字檔 .env 裡面的 TELEGRAM_TOKEN 與 TELEGRAM_ID 變數中 : 




然後用 dotenv 套件將其讀進環境變數中, 然後用 os 模組讀取環境變數 : 

>>> from dotenv import load_dotenv   
>>> load_dotenv()    
True 
>>> import os    
>>> token=os.environ.get('TELEGRAM_TOKEN')   
>>> chat_id=os.environ.get('TELEGRAM_ID')     

接下來只要在呼叫 Telegram API 時將 token 與 chat_id 傳給伺服器, 認證成功就可以將訊息傳出去了. 


3. 利用 HTTP 的 GET/POST 方法傳送訊息 : 

Telegram Bot API 是一個 RESTful API, 可以透過 HTTP 的 GET 或 POST 方法與 Telegram 的伺服器互動, 其介面簡潔易用, 非常適合專案開發, IoT 應用, 以及伺服器監控等用途. 

使用 GET 方法時變數是全部放在網址中傳遞, 網址格式如下 :

https://api.telegram.org/bot{token}/sendMessage?chat_id={chat_id}&text={text} 

可見 Telegram API 的參數有兩個 (網址中 ? 後面的就是攜帶的變數) : chat_id (聊天室識別碼) 與 text (要傳的訊息). 使用 requests 的 get() 函式時也可以將參數放在字典中, 然後將其傳給 params 變數. 

使用 POST 方法時變數 (chat_id 與 text 訊息) 是放在 body 中傳遞, 網址格式如下 :

https://api.telegram.org/bot{token}/sendMessage

變數則放在字典中 :

data={
    'chat_id': chat_id,
    'text': text
    }

然後在呼叫 post() 函式時將此字典傳給 data 參數即可 (注意是 data 不是 params). 

首先匯入 requests 模組 :呼叫 Telegram Bot API 來傳送即時訊息 :

>>> import requests

定義要傳送的訊息 text 並且將它與 token 以及 chat_id 一起嵌入 API 的網址變數 url 中 :

>>> text='Hello! 你好'  
>>> url=f'https://api.telegram.org/bot{token}/sendMessage?chat_id={chat_id}&text={text}'    

這裡用 f 字串嵌入上面用 dotenv 載入的環境變數 token (Telegram 權杖) 與聊天室識別碼 chat_id, 輸出 url 內容如下 :

>>> url   
'https://api.telegram.org/bot<權杖>/sendMessage?chat_id=<聊天室識別碼>&text=Hello! 你好'

然後呼叫 requests 的 get() 函式向 Telegram 伺服器提出 GET 請求就會將訊息 text 傳送到聊天室了, 它會傳回一個類 JSON 格式的 Response 物件, 呼叫其 json() 方法可以轉成字典 :

>>> r=requests.get(url)   
>>> type(r)   
<class 'requests.models.Response'>
>>> data=r.json()     
>>> data   
{'ok': True, 'result': {'message_id': 4, 'from': {'id': 7938146214, 'is_bot': True, 'first_name': 'twstock', 'username': 'twstock168_bot'}, 'chat': {'id': <MyChatID>, 'first_name': '77960', 'type': 'private'}, 'date': 1743950717, 'text': 'Hello! 你好'}}
>>> type(data)   
<class 'dict'>

可見傳回值就是與這次傳送相關的資訊, 其中 from 屬性的 id 就是權杖的編號. 這時去查看 Telegram 會發現收到機器人轉發的訊息 : 




也可以將變數放在一個字典中, 然後在呼叫 requests.get() 時將字典傳給 params 參數 :

>>> params={'chat_id': chat_id, 'text': text}     
>>> params    
{'chat_id': '<MyChatID>', 'text': 'Hello! 你好'}

這時網址就不用攜帶變數了 : 

>>> url=f'https://api.telegram.org/bot{token}/sendMessage'    
>>> r=requests.get(url, params=params)   
>>> r.json()   
{'ok': True, 'result': {'message_id': 5, 'from': {'id': 7938146214, 'is_bot': True, 'first_name': 'twstock', 'username': 'twstock168_bot'}, 'chat': {'id': <MyChatID>, 'first_name': '77960', 'type': 'private'}, 'date': 1743951580, 'text': 'Hello! 你好'}}

這樣就收到了一則相同的訊息 :




也可以用 POST 方法傳送訊息, 這時變數字典要用 data 傳送 (不是 params) :

>>> data={'chat_id': chat_id, 'text': text}  
>>> data  
{'chat_id': '<MyChatID>', 'text': 'Hello! 你好'}  

這個 data 變數字典與上面的 params 內容是完全相同的, 只是為了遷就 post() 的參數名稱改為 data 而已. 網址與上面無變數的一樣 : 

>>> url=f'https://api.telegram.org/bot{token}/sendMessage'   
>>> r=requests.post(url, data=data)    
>>> r.json()   
{'ok': True, 'result': {'message_id': 6, 'from': {'id': 7938146214, 'is_bot': True, 'first_name': 'twstock', 'username': 'twstock168_bot'}, 'chat': {'id': <MyChatID>, 'first_name': '77960', 'type': 'private'}, 'date': 1743952234, 'text': 'Hello! 你好'}}

這時 Telegram App 再次收到同樣的訊息 :




我將上面的程序寫成如下的函式 :

import requests

def telegram_msg(token, chat_id, text):
    url=f'https://api.telegram.org/bot{token}/sendMessage'
    data={'chat_id': chat_id, 'text': text}
    try:
        with requests.post(url, data=data, timeout=10) as r:
            r.raise_for_status()  # 若 status_code != 2xx 會拋出例外
            result=r.json()
            if result.get('ok'):
                print('Message sent successfully.')
                return True
            else:
                print(f'Telegram API Error: {result}')
                return False
    except requests.exceptions.RequestException as e:
        print(f'Request error: {e}')
        return False

此函式加入了例外捕捉並使用 with 語法, 這樣當 with 區塊結束時就會自動關閉 Response 物件了, 測試結果 OK :

>>> text='你是在說哈囉嗎?'   
>>> telegram_msg(token, chat_id, text)     
Message sent successfully.
True

檢視 App 確實有收到訊息 : 



2025年4月5日 星期六

關於 LINE Notify 終止服務之替代方案

LINE Notify 已經在 4/1 終止服務了, 我之前寫的爬蟲程式 (圖書館借書預約, 台股市況, 樹莓派 Pi 3 主機 IP, 太陽能儲能系統監控, ...) 都是使用 LINE Notify 推播服務的, 目前都已停擺了. 趁清明連假最後兩天抽空檢視了之前在臉書或網路上看到而記錄下來的替代方案, 歸納起來有如下作法 :
  • 改用推播訊息完全免費的聊天 App : Slack/Telegram, 改平台如果是自用我覺得無妨, 但如果是群組就變成成員都要一起轉移陣地, 有切換上的不習慣.
  • 改用 LINE Messaging API, 但每月免費 200 則, 超過須付費, 每月 800 元. 
個人應用部分例如圖書館借書預約爬蟲因每天 2 則, 可以改寫為 LINE Bot 免費使用; 股票追蹤機器人訊息量大目前較傾向改用 Slack/Telegram, 屆時也只好叫群組成員改換平台. 


2025-04-07 補充 :

Telegram Bot API 的用法參考 :



2025-04-08 補充 :

今天找到下面這個 YT 教學, 展示如何立用 Google App Script 當後臺來透過 LINE Messaging API 傳送訊息 :




紫微斗數學習筆記 : 排命盤

我從學生時代就開始看紫微斗數了, 但就只是看看而已, 並沒有做系統化研究, 更別說整理筆記了. 最近從市圖借到下面這本大耕老師寫的斗數書, 看著看著就興起寫筆記念頭了 :


以前排命盤要翻書, 根據出生時辰與性別在 12 宮位中填入主星, 副星, 以及四化等元素, 排一張命盤要花上數小時, 手動排命盤可參考下面紫微研究苑的 12 篇文章 :


這 12 篇鉅細靡遺地描述排命盤的方法, 想要手工排盤就不用再翻書了. 

本系列之前的文章參考 :



1. 十二宮位 : 

一個命盤的基本結構如下 : 


姓名 :    
陽曆生辰 :
農曆生辰 :
生肖 :
命宮 :    身宮 :
命主 :    身主 :


周圍的 12 格代表 12 個宮位, 分別用 12 地支表示 (地支宮位), 右下角是地支的最後一個 (亥), 其左邊一格是起始宮位, 從子宮開始順時針繞一圈至右下角的亥宮結束. 注意, 地支在 12 個宮位的位置是固定的, 所有的命盤右下角都是亥宮. 

手工排盤第一步是先找出命宮位置, 先從寅宮 (左下角宮位, 代表正月) 開始順時針數到出生月份, 再從那裏逆時針數到出生時辰之宮位即是命宮所在. 12 個月份與地支的對映關係如下表 : 


月份 正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 冬月 臘月
地支


以一個模擬的男性命主生辰 1965 年 11 月 19 日丑時為例, 從左下角寅宮 (一月) 順時針走 11 格會到達子宮, 從這裡由地支的子開始逆時針往回走到生時的丑時, 也就是往回走一格到右下角的亥宮即為命宮所在 :




找出命宮後就可以按順時鐘順序排出其他的 11 個宮位 :

命宮 > 父母宮 > 福德宮 > 田宅宮 > 官祿宮 > 僕役宮(朋友宮) > 遷移宮 > 疾厄宮 > 財帛宮 > 子女宮 > 夫妻宮 > 兄弟宮 (順時鐘)

以上面的命主為例, 12 宮位就定位出來了 : 




因為生辰與性別不同, 每個人的 12 宮位位置也就不同 (命盤相同的機率以人口數據專家推算在千萬分之一以下), 即使命盤完全一樣的雙胞胎, 命運仍會因為後天的選擇與心態而有所不同. 


2. 排盤軟體 : 

12 宮位確定之後, 接下來就是安主星副星與四化, 這些都有既定規則推演. 但其實網路上有非常多的電腦排盤軟體, 不用這麼累手工排盤, 例如 : 


進入 AI 時代後我們可以借助 ChatGPT 等 AI 工具來輔助學習, 不過 AI 生成的數據需要查尋 Google 或書籍來驗證資訊正確性, 跟寫程式一樣, AI 解盤結果不見得正確, 例如給 ChatGPT 農曆生辰讓它排命盤, 結果它換算出來的陽曆生辰居然是錯的, 命盤排錯了當然是滿盤皆錯. 

依據生辰與性別排出來的命盤稱為本命盤 (又稱原局), 可以從主星與副星在 12 宮位的位置, 以及觀察四化與格局來判斷一個人的先天命格, 性格特質, 人生潛能等基本命運格局, 本命盤是固定不變的. 

此外還有所謂運限盤, 這是隨時間變化的命盤, 包含大限盤 (每 10 年一大限), 小限盤 (每年一小限), 與流年盤 (每年命宮位置隨年而變) 三種, 它們是配合本命盤根據不同的時間流轉 (如年齡) 所推導出來的, 用來觀察不同人生階段的運勢波動與時運吉凶. 運限盤宮位的排法是根據命宮起點與五行局, 年齡或年度來推算. 


3. 陰陽五行與 60 花甲子 : 

以上面模擬的男性命主為例, 命盤最中央除生辰外還有一些推演出來的資訊 : 




首先看出生年天干的陰陽屬性, 陰男表示命主為男性, 其出生年的天干為乙, 屬於陰性的乙, 丁, 己, 辛, 癸這五者之一 (出生年天干若為甲, 丙, 戊, 庚, 壬則為陽性). 

農曆的序年採用 10 天干與 12 地支前後配對共有 60 個組合, 稱為 60 花甲子, 前面為天干, 其陰陽五行屬性如下表 (天干無生肖屬性) :


天干
五行
陰陽


60 花甲子的後面是 12 地支, 其陰陽五行屬性與生肖配對如下表 :


地支
五行
陰陽
生肖


下表即 60 花甲子組合, 從甲子年開始, 接著乙丑, 丙寅, 丁卯, .... 直到癸亥共 60 年一個循環, 然後再回到甲子年展開新的輪迴 :


天干地支的一個循環 (六十甲子)
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥


參考 :


其實生年天干與地支都可以依據西元年經過簡單的計算規則來推算, 算法如下 :
  • 生年天干 :
    可由西元年尾數來判斷, 尾數 1 為辛, 尾數 2 為壬, 尾數 3 為癸, 尾數 4 為甲, 尾數 5 為乙, 尾數 6 為丙, 尾數 7 為丁, 尾數 8 為戊, 尾數 9 為己, 尾數 10 為庚. 
  • 生年地支 :
    計算規則為西元年減 4 再除以 12 取餘數, 0 為子, 1 為丑, 2 為寅, 3 為卯, 4 為辰, 5 為巳, 6 為午, 7 為未, 8 為申, 9 為酉, 10 為戌, 11 為氦. 
以命主 1965 年生為例, 尾數為 5 故天干為乙; 1965 減 4 為 1961, 除以 12 得餘數 5, 故生年地支為巳, 查萬年曆 1965 年確實為乙巳年, 天干為乙屬陰, 故為陰男. 


4. 五行局 : 

五行局是由五行 (金木水火土) 加上局數 (2~6, 起運年齡) 組成的, 一共有 5 個 : 
  • 水二局 : 兩歲起運
  • 木三局 : 三歲起運
  • 金四局 : 四歲起運
  • 土五局 : 五歲起運
  • 火六局 : 六歲起運 
命盤中的五行局是由生年天干及命宮地支決定的, 如下表所示 :


生年干 / 命宮支 子丑 寅卯 辰巳 午未 申酉 戌亥
甲己 水二局 火六局 木三局土五局 金四局 火六局
乙庚 火六局 土五局 金四局 木三局 水二局 土五局
丙辛 土五局 木三局 水二局 金四局 火六局 木三局
丁壬 木三局 金四局 火六局 水二局 土五局 金四局
戊癸 金四局 水二局 土五局 火六局 木三局 水二局


以上面的模擬命盤為例, 命主生年為乙巳年, 生年天干為乙, 命宮位置為亥宮, 地支為亥, 由上表可知其五行局為土五局, 即五歲起運, 大限由此開始每十年一個階段. 

五行局是用來確定命宮星曜與大限流年排布的關鍵, 命格的五行局會影響命盤的結構, 例如安紫微星時就是利用五行局與出生日來決定的, 如下表所示 : 


五行局 / 日期 123 456 789 101112 131415
水二局
木三局
金四局
土五局
火六局

五行局 / 日期 161718 192021 222324 252627 282930
水二局
木三局
金四局
土五局
火六局


以上面模擬命主為土五局生日為 19 日為例, 其紫微星位於辰宮. 接下來就可以逆時針排布紫微系的六顆主星 : 

紫微星 > 天機星 > 跳一格 > 太陽星 > 武曲星 > 天同星 > 跳二格 > 廉貞星

接下來是安天府星, 其位置在紫微星的 45 度斜對角, 若紫微在右上角的申宮或左下角的寅宮, 則天府與紫微同宮. 以上面模擬命主紫微星位於辰宮為例, 則其天府星在子宮. 安好天府星後即可按順時針方向排布天府星系的其他七顆星, 順序如下 : 

天府星 > 太陰星 > 貪狼星 > 巨門星 > 天相星 > 天梁星 > 七殺星 > 跳三格 > 破軍星

這樣 14 顆主星的位置就排出來了 :




以上是五行局對本命盤結構的影響, 此外五行局的局數則決定幾歲開始起運, 例如土五局就是五歲開始起運, 這也同時決定每個大限的時間範圍, 例如土五局第一個大限就是 5~14 歲, 第二個大限是 15~24 歲 ... 依此類推. 同理, 水二局的人兩歲就起大運了. 


5. 身宮 : 

命宮代表一個人的天賦, 本性與命運架構, 而身宮代表一個人後天的行為模式, 發展方向與應對環境的方式, 也可以說是想要自我實現的目標, 會在成年具有獨立思考能力後顯現, 參考 :


身宮的找法參考 :


即從左下角的寅宮開始 (寅月為正月), 順時針走到出生月的宮位, 以該宮位為子時繼續順時針走到出生時辰即為身宮所在. 

以上面命主生辰 11 月 19 日丑時為例, 從寅宮順時針走 11 個月到達子宮, 以此為子時走到生時丑時到達丑宮, 故身宮為丑宮, 該命主的丑宮為福德宮, 因此也可以說身宮在福德宮. 身宮在福德宮的人, 重視內在感受, 內心世界豐富, 喜歡思考, 對人生有比較多哲學與靈性層面的想法, 喜歡獨處或享受安靜空間, 常透過沉思冥想或閱讀來充實自己, 是個用心靈在過日子的人. 

2025年4月3日 星期四

Stable Diffusion 學習筆記 (二) : 下載其他模型

昨晚成功安裝 Stable Diffusion 後利用預設的 v1.5 基礎模型試畫了一張圖, 今天要來下載不同風格的模型以嘗試更多種繪圖可能, 以下紀錄下載與安裝模型的方法. 

有一個 Civitai 網站蒐集了許多 Stable Diffusion (簡稱 SD) 模型, 網址如下 :


首頁會顯示使用者最新上傳的 SD 繪圖作品, 按左上角的 Model 連結 :




這頁會顯示所有模型列表, 上方有一排模型分類連結, 可點選喜歡的類型, 或用最上面的搜尋框輸入關鍵字去搜尋 :




這些模型可分成三類 :
  • Checkpoint : 完整模型 (檔案較大), 它會修改整個神經網路參數. 
  • LoRA : 需搭配基礎模型或 Checkpoint 模型使用的簡化小模型.
  • VAE : 需搭配基礎模型或 Checkpoint 模型使用的圖像補強模型.
先找尋完整的 Checkpoint 模型來下載, 例如擅長繪製亞洲女性的 majicMIX :





案右上角的下載鈕下載此模型 (約 2GB), 檔名為 majicmixRealistic_v7.safetensors, 將其複製到 sd.webui\webui\models\Stable-diffusion 資料夾下 (如果是 LoRA 模型就複製到 models\LoRA 下) :





然後按模型選單旁邊的更新鈕就可以看到 majicmixRealistic_v7.safetensors 這個模型的選項了 :




我叫 ChatGPT 給我一個此模型的 prompt 範例 : 

請給我一個 stable diffusion 模型 majicmixRealistic_v7 的 prompt 範例

正向提示詞 :

((masterpiece)), ((best quality)), ((realistic)), ((detailed skin texture)), ((cinematic lighting)), 
((8K UHD)), highly detailed, beautiful woman, natural skin, soft lighting, 
sharp focus, depth of field, looking at camera, neutral expression, ultra-detailed face

負向提示詞 :

(worst quality:1.4), (low quality:1.4), (jpeg artifacts), (blurry), (text), (cropped), 
(ugly), (deformed), (bad anatomy), (poorly drawn face), (disfigured), (mutation), 
(extra limbs), (fused fingers), (missing fingers), (bad hands), (bad proportions)

生圖設定建議 :
  • Steps: 30~50
  • Sampler: DPM++ 2M Karras 或 DPM++ SDE
  • CFG Scale: 7~9
  • Resolution: 512x768 或 768x1024(高解析更細緻)
  • Hires. fix: 開啟,倍率 1.5~2(可提升細節)



結果花了近 10 分鐘生成如下怪物 : 



Stable Diffusion 學習筆記 (一) : 安裝軟體與基礎模型

去年買了搭 RTX-3060 顯卡 (12 GB VRAM) 的 MSI 新桌機後曾興沖沖地安裝 PyTorch 與 Cuda 函式庫, 想要在本機跑 Stable Diffusion, 但是後來再安裝 WebUI 時因為版本不匹配問題而卡關, 試了幾個解決方案都未能順利將 WebUI 安裝起來. 

今天在旗標的 "AI 繪圖夢工廠 (2024 版)" 第四章看到利用杰克艾米立的懶人包在本機安裝 Stable Diffusion 的方法, 晚上忙完後就來試試看, 果然安裝成功, 以下紀錄操作程序 :

首先連線下列旗標提供的短網址下載安裝包壓縮檔 sd.webui.zip :


解壓縮 sd.webui.zip 會出現一個 sd.webui 資料夾 :




開啟 sd.webui 資料夾, 點擊 update.bat 批次檔進行更新 :




這時會彈出一個安全性警告視窗 : 




按 "其他資訊" 後右下角會出現 "仍要執行" 鈕, 按此鈕會開啟命令提示字元視窗開始更新懶人包 : 




當出現 "按任意鍵繼續" 時表示更新完成, 按任意鍵會關閉此視窗 : 




書中介紹的程序說接下來要編輯 webui-user.bat 這個檔的 set COMMANDLINE_ARGS= 後面加入如下優化命令 (用途是降低 VRAM 消耗) :

set COMMANDLINE_ARGS=--xformers 

但我開啟該檔卻沒有該設定, 可能是版本更新了, 況且我的顯卡有 12GB VRAM, 應該不需優化, 所以此步驟跳過. 接下來點擊執行 run.bat 批次檔 :




與上面一樣會彈出一個安全性警告視窗, 同樣按 "其他資訊" 後右下角會出現 "仍要執行" 鈕, 按此鈕會開啟命令提示字元視窗開始下載 Stable Diffusion 的模型與 WebUI 介面, 需要大約 20 分鐘, 完成後會自動開啟 WebUI 網頁介面 : 




耶! 終於安裝成功啦!

馬上用書上的提示詞範例來測試文生圖功能, 先在頁面左上角 "Stable Diffusion checkpoint" 欄位勾選模型, 預設只有一個預設模型選項 "v1-5-pruned-emaonly.safetensors", 接著在 "txt2img" 頁籤輸入框填入下列 prompt : 

8k portrait of beautiful cyborg, bown hair, intricate, elegant

然後按右方大大的 Generate 鈕即可在右下方看到生成結果 : 





這是使用左下角的預設設定生成的結果, 大約只花了 5 秒鐘不到就完成了. 

關閉 Stable Diffusion 不要直接關閉瀏覽器, 應該在原先啟動 SD 的命令提示字元視窗按 CTRL+C, 這時會出現"要終止批次工作嗎 (Y/N)?" 的詢問 : 




按下 Y 與 Enter 就可關閉命令提示字元視窗, SD 的 http://127.0.0.1:7860/ 網頁就會消失無法連線, 這才是關閉 SD 的正確方式. 

2025年4月2日 星期三

市圖還書 2 本 (PyQT)

本周市圖還書兩本 : 
No.1 這本很不錯, 但我目前沒有使用 QT 的需要, Tkinter 就很夠用; No.2 這本幾乎都是 code dumps, 感覺像是專案報告, 根本不適合自修, 我現在對深智從中國引進的殘體翻正體書評價越來越差, 我幾乎都只買旗標與碁峰的書. 


光世代數據機 (小烏龜) 換新

昨天下午接到中華電信外包工程師電話, 說鄉下老家的光世代數據機 (俗稱小烏龜) 機型要換新, 但如果有裝監視器的話要重新設定固定 IP, 因為監視器現在都用 MQTT 毋須使用固定 IP, 已經被我拿來架設網站用了. 果然換好後連線我的網站已經無法連線, 要等連假回去將 Mapleboard 重開機才會抓到新 IP, 還要去 Namecheap 更新網域名稱對映的 IP, 參考 : 

Mapleboard MP510-50 測試 (二十一) : Hinet 浮動制固定 IP 異動




原來更換數據機也會造成固定 IP 變化, 不只是機房卡板更換而已. 

Canva 學習筆記 (一) : 註冊帳戶與操作介面簡介

自 2022 年 ChatGPT 問世以來, 我大概參加過的 Canva 的課程超過 10 場, 但只是聽聽而已並未認真去學 (因為工作上已經很少需要做簡報了). 前陣子在 Felo 的內訓課程裡再度遇見 Canva, 這回充分認識到 Canva 素材豐富的價值, 在製作上課教材時非常好用, 加上從母校借到兩本 Canva 的好書, 所以決定來學學這個與 AI 深度結合的好工具. 

關於 Canva 的背景知識摘要如下 :
  • Canva 是一個線上平面設計平台, 提供豐富素材與範本讓使用者可免費快速創建圖片, 影片, 簡報, 海報, 文件, 電子書, 一頁式網站等多媒體作品, 透過分享連結可以進行團隊協作. 
  • Canva 於 2012 年由 Melanie Perkins, Cameron Adams 與 Clifford Obrecht 等人於澳洲雪梨創立, 經過多輪投資與併購 (例如知名的 Pixabay 與 Leonardo.ai), 已成為營業額超過 23 億美元市值達 400 億美元規模的企業. 
  • Canva 可在手機 App, 電腦瀏覽器, 與應用程式三種介面上執行. 
  • 高中師生可用 edu 信箱註冊教育版 Canva, 除可使用付費版全功能外, 還有專為教學專用的特製功能. 
  • 免費版用戶享有 5GB 儲存, 可使用超過 25 萬個範本, 100 多個設計類型, 超過 550 萬張圖片與素材, 也可使用部分 AI 工具, 例如寫作, 翻譯, 生圖等 (有次數限制), 付費版則可使用全部素材與 AI 工具. 
參考 :


參考書籍 :

# 用 Canva 設計超值感超快 (碁峰 2024, 文淵閣工作室)
剛剛好的 Canva 設計教本 (旗標 2024, 張宣婕)


1. 註冊免費帳戶 : 

首先連線官網註冊一個免費版帳號 :


按右上角的 "註冊" 鈕 : 




可以用 Google 或 FB 帳號快速註冊, 我習慣用 Email 註冊 :





設定帳號後按登入即完成註冊 :





這樣便可以開始來用 Canva 做設計了. 


2. 操作介面簡介 : 

完成註冊登入後顯示首頁如下 :




最左邊的功能主選單會一直常駐, 最上面的三條槓按鈕可用來展開或縮合右邊的自定義工作區 (按一下縮合, 再按則展開), 自定義工作區裡有一個 "建立設計" 鈕可新增一個設計專案, 下方則會顯示最近的設計專案. 右上角為個人選單區, 包含個人資訊與帳號相關設定 (例如名稱, Email 之編輯與新增團隊); 下方為快速新增設計專案. 


2025-04-02 補充 :

今天在 YT 找到很棒的 Canva 教學 :


Papaya 電腦教室是 YT 上點閱率很高的資訊教學頻道, 淺顯易懂, 非常適合小白入門 :


2025年4月1日 星期二

高科大還書 1 本 : Word 365全方位排版實務

昨天 Canva 預約書到館, 拿下面這本去換 :


其實我兩年前就買過這本書的前一版 (非 365), 借來式想比較看看哪裡不同. 打算用 Word 來寫 Gradio 與 Streamlit 的書, 需要了解一下模板用法 (很早以前就想寫書了, 但時間很少騰不出手, 打個比方, 研究好比是生吃, 寫書是曬乾保存, 生吃都不夠了哪來曬乾).