PowerShell 小品 - 產生短網址 QR Code 複製到剪貼簿
3 |
最近遇到一個需求,想將網址轉成 QR Code 附在 Word 文件上。
QR Code 的複雜度與文字長度有關,為了簡化 QR Code 降低掃瞄失敗率,我打算用縮網址服務將又臭又長的 https://www.facebook.com/darkthread.net/posts/pfbid02FB837H4YHFB4DwxvvCiqh4P9e5jzbVD3Nts3rr5b1Pn7otMxiw3UaJ8AG4dyx3J8l
網址轉成 https://reurl.cc/rvY3V1
,二者 QR Code 的複雜度對照圖如下。若大家有掃密密麻麻 QR Code 掃不出來的經驗,應能體會為什麼值得多花這個功夫。
這年頭縮網址跟產生 QRCode 的免費線上服務多如牛毛,但拎杯就是想要有一個 CLI 指令能 「URL 轉短網址產生 QRCode 再 複製到剪貼簿」一氣喝成,方便我直接在 Word 貼 QR Code。
一把年紀了還這麼任性,那就自己寫一個吧! 寫就寫,誰怕誰。
我打算全部套用免費 API:
- 縮網址用 recurl.cc,它只需要用 FB 或 Google SSO 登入,免填註冊資料就能拿到 API Key,額度為每小時 100 次,日常使用綽綽有餘。
- 好用的 Google QRCode API 今年關閉了,參考 Google QR Code API 已不可用 呼叫只會顯示 404|其他可用替代方案我選擇 quickchart.io QR Code API 作為替代方案。
程式不難,我寫了一個 Atk-GenUrlQRCode.ps1 (放在 C:\Users\<userName>\Documents\WindowsPowerShell\Scripts
,從任何目錄都可執行),除了輸入 URL,再提供幾個參數:
- -NoQRCode 只縮網址複製到剪胋簿,不產生 QR Code
- -NoShorten 不縮網址只產生 QR Code 複製到剪貼簿
- -Show 產生 QR Code 後顯示圖檔
- -Size QR Code 尺寸,預設 150
recurl.cc 需要 API Key,第一次使用時程式會提示連上網站取得,並自動開啟瀏覽器,API Key 則會存入環境變數,下次便可直接使用。評估了一下,這 API Key 沒什麼盜用價值,就不做加密保護了。(延伸閱讀:如何在 .NET 工具程式安全儲存 API Key 設定)
程式範例如下:
param (
[parameter(Mandatory = $true)]
[string]$Url,
[switch]$NoShorten,
[switch]$NoQRCode,
[switch]$Show,
[int]$Size = 150
)
$envVarName = "ReurlApiKey"
$apiKey = [Environment]::GetEnvironmentVariable($envVarName, "User")
function CallRecurlApi($url, $apiKey) {
$jsonBody = @{ url = $url } | ConvertTo-Json
$headers = @{ 'reurl-api-key' = $apiKey }
$res = Invoke-RestMethod -Method Post -Uri "https://api.reurl.cc/shorten" -Body $jsonBody -Headers $headers -ContentType "application/json"
if ($res.res -ne "success") { throw ($res.code + ' ' + $res.msg) }
return $res.short_url
}
function ShortenUrl($url) {
# 若未設定 API Key,提示使用者輸入
if ([string]::IsNullOrEmpty($apiKey)) {
$reurlDevUrl = "https://reurl.cc/dev/main/tw"
Write-Host "請登入 reurl.cc 開發者介面 $reurlDevUrl 取得 API Key"
Start-Process $reurlDevUrl # 開啟瀏覽器連至 reurl.cc 開發者介面
while ($true) {
$apiKey = Read-Host "輸入 apikey: "
if ([string]::IsNullOrEmpty($apiKey)) {
Write-Host "不可空白" -ForegroundColor Brown
}
else {
try {
$shortenUrl = CallRecurlApi $url $apiKey
[Environment]::SetEnvironmentVariable($envVarName, $apiKey, "User")
return $shortenUrl
}
catch {
Write-Host $_ -ForegroundColor Red
}
}
}
}
else {
return CallRecurlApi $url $apiKey
}
}
function GenerateQRCode($text) {
$qrCodeUrl = "https://quickchart.io/qr?text=$([Uri]::EscapeDataString($text))&size=$Size"
$tempFile = [IO.Path]::GetTempFileName() + ".png"
Invoke-WebRequest -Uri $qrCodeUrl -OutFile $tempFile
Add-Type -AssemblyName System.Windows.Forms
$image = [System.Drawing.Image]::FromFile($tempFile)
[System.Windows.Forms.Clipboard]::SetImage($image)
Write-Host "QR Code 已複製到剪貼簿"
if ($Show) { Start-Process $tempFile } # 開啟圖片
}
if (!$NoShorten) {
$shortUrl = ShortenUrl $Url $apiKey
}
else {
$shortUrl = $Url
}
if ($NoQRCode) {
Set-Clipboard -Value $shortUrl
Write-Host "短網址已複製到剪貼簿: $shortUrl"
}
else {
Write-Host "短網址: $shortUrl"
GenerateQRCode $shortUrl
}
來看一下效果。
輸入 URL 執行縮網址、產生 QR Code,訊息顯示 QR Code 已存入剪貼簿。
在 Word 貼上,薑薑薑薑~~~
分享給跟我一樣愛敲指令的朋友。
This blog post explains how to create a CLI tool that converts URLs into QR Codes to be used in Word documents. It uses the recurl.cc API for URL shortening and quickchart.io for generating QR Codes.
Comments
# by ALEX
我是用 qrcode.tec-it.com var qrCodeImageUrl = $"https://qrcode.tec-it.com/API/QRCode?data="{HttpUtility.UrlEncode(url)}"&size=small&errorcorrection=L&quietzone=1&quietunit=px";
# by stingray Lien
小白提問:我是在 mac 上面 安裝 powershell 與 VS code ,請問爲什麼在 VS Code 上面可執行,可是單獨在 powershell 上面卻無法執行... 小白提問還請見諒!!
# by Jeffrey
to stingray Lien, 無法執行的狀況為何?有錯誤訊息?