最近遇到一個需求,想將網址轉成 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:

  1. 縮網址用 recurl.cc,它只需要用 FB 或 Google SSO 登入,免填註冊資料就能拿到 API Key,額度為每小時 100 次,日常使用綽綽有餘。
  2. 好用的 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, 無法執行的狀況為何?有錯誤訊息?

Post a comment