[Python/Golang] 解決 Imgur 圖片下載轉址問題

Google Chrome 2025-02-12 08.33.04

最近的變動造成的問題

近期,Imgur 對其圖片連結進行了技術更新,導致直接訪問 i.imgur.com/{image_id}.jpeg 類型的 URL 時會被重定向到 imgur.com/{image_id} 頁面。這種行為使得在應用程式或網頁中直接顯示或下載圖片變得困難。此外,這種轉址機制也會影響到使用者腳本和瀏覽器擴充套件的正常運作,使得原本能夠阻止轉址的工具可能失效。因此,開發者需要找到新的方法來繞過這個限制。

解決思路

要解決這個問題,我們可以採用以下幾種策略:

  1. 設置正確的 HTTP 標頭特別是設定 Referer 標頭,以模擬從 Imgur 頁面訪問圖片。使用合理的 User-Agent 標頭,以避免被視為爬蟲請求。
  2. 使用 Imgur 官方 API透過官方 API 可以穩定地取得圖片直連 URL,但需要註冊並取得 Client ID 和 Client Secret。這種方法通常更可靠,但需要額外的手續和速率限制考量。
  3. 瀏覽器擴充套件或腳本更新更新 NoImgurRedirect 等擴充套件以適應最新變動,或撰寫自訂腳本來處理轉址問題。

範例程式碼

以下是一段 Python 程式碼示範如何設定正確標頭來下載 Imgur 圖片:

python
import requests

def download_img(image_id):
    # 構建 URL
    direct_url = f"https://i.imgur.com/{image_id}.jpeg"
    referer_url = f"https://imgur.com/{image_id}"
    
    # 設置請求頭
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Referer": referer_url
    }
    
    try:
        response = requests.get(direct_url, headers=headers)
        response.raise_for_status()
        
        if 'image' in response.headers.get('Content-Type', ''):
            filename = f"{image_id}.jpeg"
            with open(filename, 'wb') as f:
                f.write(response.content)
            print(f"圖片已成功下載:{filename}")
        else:
            print("下載失敗:返回內容不是圖片")
    
    except requests.RequestException as e:
        print(f"下載失敗:{e}")

# 測試下載(假設 image_id 為「example123」)
download_img("example123")

範例程式碼(Golang)

以下是一段 Golang 程式碼示範如何設定正確標頭來下載 Imgur 圖片:

go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func downloadImg(imageID string) error {
	directURL := fmt.Sprintf("https://i.imgur.com/%s.jpeg", imageID)
	refererURL := fmt.Sprintf("https://imgur.com/%s", imageID)

	req, err := http.NewRequest("GET", directURL, nil)
	if err != nil {
		return err
	}

	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
	req.Header.Set("Referer", refererURL)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("HTTP status code: %d", resp.StatusCode)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	filename := fmt.Sprintf("%s.jpeg", imageID)
	err = ioutil.WriteFile(filename, body, 0644)
	if err != nil {
		return err
	}

	fmt.Printf("圖片已成功下載:%s\n", filename)

	return nil
}

func main() {
	imageID := "example123"
	err := downloadImg(imageID)
	if err != nil {
		fmt.Println(err.Error())
	}
}

未來該如何小心類似的問題

  1. 關注平台更新通知 定期查看 Imgur 的官方公告和社群反饋,以便及時了解任何技術變動。
  2. 維護現有工具與庫版本 保持瀏覽器擴充套件、腳本以及相關庫版本是最新的,以確保它們能夠適應新出現的情況。
  3. 評估替代方案與備選策略 考慮使用其他第三方服務作為備選方案,並在必要時切換至不同的存儲平台以減少風險依賴性。
  4. 遵守服務條款與政策 在實施任何工作流程時,務必遵守相關平台提供者的服務條款與政策,以避免帳戶封禁等不利後果。

[生活] 日本旅遊零錢太多? 輕鬆存進 Suica 卡,手機也能用!

image-20250119115652394

(✨ 影片示範看這裡 ✨ https://youtube.com/shorts/ffbuUVK_bsE?si=LopZUGuQ7mEpRDcd)

還在為日本零錢煩惱嗎? ( ̄▽ ̄;)

每次去日本玩,是不是都有一樣的困擾? 🤔

  • 明明有 Suica 卡,卻還是收到一堆零錢! 😫
  • 日本物價高,零錢好難花! (。ŏ_ŏ) 怕麻煩乾脆不拿出來…

結果口袋越來越重,回國前還是剩一堆! 😰 別擔心!有了 Pocket Exchange,輕鬆告別零錢困擾! 😎

Pocket Exchange 是什麼?哪裡找? 🤔

image-20250119120221952

Pocket Exchange 就像個零錢 ATM,可以把你的硬幣通通存進 Suica 卡! 😮 超方便! 👍

我在成田機場第二航廈 61 登機口附近找到一台,就在咖啡廳旁邊! ☕ 其他地點可以參考官網:

常見問題 🙋‍♀️🙋‍♂️

Q:可以用手機 Suica 嗎?

A:當然可以囉! (๑•̀ㅂ•́)و✧

Q:1 元硬幣可以存嗎?

A:沒問題! ( • ̀ω•́ )✧

Q:其他硬幣呢?

A:大部分都可以,但有些可能不吃喔!建議參考機器上的說明。 😉

找不到 Pocket Exchange 怎麼辦? 😱

別慌!7-11 也有自助結帳機可以讓你清掉零錢! 😉 不過要注意,需要 1000 日圓以上才能存進卡片喔! 😅 如果零錢不夠多,那就… 買個東西花掉吧! ( ´∀`) (小心又會產生新的零錢喔! 🤣)

最後

希望這篇文章對你有幫助! 🥰 下次去日本玩,別再讓零錢成為你的負擔啦! 😄

[Playstation Portal] 如何透過 WiFi 路由器設定來讓 Portal 與 PS5 連線更加順暢

image-20250117150311115

前情提要

大家都知道,我大概一年前買入 PS Portal Remote 之後。大概也全破了不少款的遊戲。 但是原來的 TPLink 是 WiFi5 的 Router ,想要趁機換一台 WiFi6 的 Router 之後。但是卻發現讓連線狀況相當的不順,這一篇記錄一下,如何讓你的 PlayStation Portal Remote 可以更順暢的透過 WiFi 連線 Playstation 5 。

參考影片

自從把 TPLink 升級成 ASUS wifi6 router 後,一直無法讓 PS5 跟 Portal 連線順暢 用這招成功恢復速度

  1. 獨立 PS5 跟 Portal 用 5G
  2. ASUS router 對這兩個優化

[Github Copilot] 透過 Custom Instructions 讓你 Github Copilot Commit Message 更生動活潑

Google Chrome 2025-01-02 14.47.20

前情提要:

認識我的人都知道我是個 Github Copilot 的愛用者(因為開源者專案,直接獲得免費,雖然說現在也開放免費額度了)。

裡面最常使用的功能就是自動寫 Commit Message 的功能,讓我每次都不需要想我到底改了什麼,或是需要使用哪些規則來寫。

目前 Github Copilot 的 Message 比較制式的問題

但是如果想要做出一些特別的 Commit Message ,比如說:

image-20250102164133473

甚至更生動的會使用所謂的「 emoji commit message 」:

Google Chrome 2025-01-02 16.42.48

但是原來 Github Copilot 給的格式就還蠻制式的,該如何修改呢?

客製化 Commit Message (Custom instructions for GitHub Copilot )

2024 的 12月. Github 公開了新的設定 (Custom instructions for GitHub Copilot ) 可以透過設定來讓你的 Commit Message 更有特色。

  "github.copilot.chat.testGeneration.instructions": [
    {
      "text": "Always use vitest for testing React components."
    },
    {
      "text": "Use Jest for testing JavaScript code."
    },
    {
      "file": "code-style.md" // import instructions from file `code-style.md`
    }
  ],

以下提供一個範例,可以快速讓你 Commit Messsage 變成更豐富的格式。

快速修改 github copilot commit msg 的格式:

  1. 透過 vscode://settings/github.copilot.chat.commitMessageGeneration.instructions 打開 vs code

  2. 加入

    "text": "Start each commit message with an emoji representing the change type, then provide a concise summary of what changed and why."
    

Done. 改成這樣很好看啊 :)

Slack 2025-01-02 16.21.05

[年終回顧] 2024 年的回顧與展望

image-20250103132154672

2024 年度回顧

今年比較重大的事情有幾項:

  • 六月回到長灘島(第四次),想受陽光,沙灘跟海洋。
  • 七月幫女兒轉學到台北的國小,開始了一大早的通勤日子。
  • 九月總算回到日本出差,參與了 LY Tech Week 。遇到許多日本好久不見得同事們。
  • 十月開始跑健身房,現在每天早上會去內湖運動中心運動後再到公司上班。

對於健康也開始越來越在意,今年的健檢有檢查出胃食道逆流。目前開始長期吃藥來抑制,經常會有因為胃食道逆流而無法睡好的狀況。

2025 的展望

  • 希望可以保持健身的習慣(當然能瘦個幾公斤會更好)
  • 希望家人可以健健康康的快樂出遊,家人真的是最重要的。

旅遊紀錄:

  • 20250620 ~ 0625: 疫情後總算去長灘島感受陽光,沙灘跟海洋。
  • 20240726 ~ 0728: 到澎湖去追逐夏天的尾巴,也有去看看好幾年沒去過的吉貝島。
  • 20240901 ~ 0905: 總算有機會重回日本出差了,去參加了 LY Tech Week

數據總結

image-20250103112117142

  • 共閱讀了 1,814 分鐘, 16 本書 (有兩本是漫畫 :p )

    • 2023: 14 本書
    • 2022: 24 本書。
  • 部落格文章撰寫上:

    • 2024: 53 篇文章
    • 2023: 59 篇文章
    • 2022: 53 篇文章
  • 健身運動:
    • 2024: 7806 mins (YoY 120%)
    • 2023: 6207 mins
    • 2022: 6749 mins
  • Github Contribution 上面:
    • 2024: 1668
    • 2023: 1062
    • 2022: 828
  • 因為 LLM 今年有許多專案: (共有 21 個 new Repositories)

雜項數字

image-20250103131956255

image-20250103131058433

image-20250103131103855

image-20250103131109087

image-20250103131113971

[好書分享] Dyson- 詹姆斯.戴森的發明人生

Dyson - 詹姆斯.戴森的發明人生
Invention : A Life of Learning Through Failure
作者: 詹姆斯.戴森  
原文作者: James Dyson  
譯者: 林錦慧  張玉芬  
出版社:寶鼎 

買書推薦網址:

前言:

這是 2024 年第 11 本讀完的書。雖然是 2025 才補起來,因為近期看的書籍真的不太多,並且都沒有開始寫部落格記錄一下。

至於當初為什麼要讀這本書,主要就是大家都知道 Dyson 是一家以 CEO 是工程師起家作為宣傳主軸的私立公司(筆者寫文章的時候,還是沒有公開上市)。而創辦人跟執行長 Dyson 究竟是用什麼樣的理念來經營這一家具有創造力的公司,我想會是每一個創業產業與資訊業界的人都需要學習跟了解的。

內容摘要:

夢想能同時成為工程師、設計師和製造者
在報章雜誌還沒出現「設計」二字的年代,原本是老師眼中的中等生戴森,憑著美術成績取得藝術學院的入學資格,透過自學工程設計,成為英國罕見兼具設計與工程學的專家。在1970年代,21歲的戴森便會設計引擎,23歲發明至今仍能使用的高速登陸艇「海上卡車」。他這等天賦卻與當時社會重人文輕科學的氛圍格格不入,戴森想用雙手證明自己的價值。

第一次創業卻被慘遭股東趕離如同APPLE的賈伯斯
在最動盪的1970年代中期,戴森用二創發明的球形手推車開始他的第一次創業,這個紅色的球輪手推車不只驚豔消費者還得到優良設計標章的肯定,並在因緣際會下遇見一生的「摯愛」氣旋機。可惜當公司業務越來越上軌道時,慘遭股東趕離公司還失去改良手推車的專利權,雖落得身無分文,但心中卻悄悄生出革命性吸塵器的構想,成為人生轉捩點的開始。

Dyson成為知名企業前,戴森經歷5,000多次失敗
在1983年戴森成功發明世界第一台無集塵袋吸塵器「G-Force」之前,他在4年間進行5,126次失敗的實驗。研發過程中幾乎傾家蘯產,即使成功發明出真空吸塵器,卻又苦熬於專利權訴訟和耕耘市場。直到1993年,正式在英國推出第一代Dyson吸塵器「DC01」上市,成為最創新又暢銷的真空吸塵器,隨後一步步在美、日、澳、加……等國廣受歡迎,Dyson逐步扎穩家電王國的地位。

發明是終身志業,是詹姆斯・戴森一路走來的人生
Dyson從吸塵器跨足乾手機、電風扇到吹風機,每一次出手都翻新該產業的設計概念,獲得前所未有的成功,成為全球數一數二的家電品牌。可是戴森並不以成為富豪、擁有全球家電第一品牌為滿足,反而積極投入電動車研發、跨足科技農業及興辦戴森工程技術學院,因為真正驅動他的一直都是渴望以發明、創新的產品與精神,解決當前與未來的問題,並發掘渴望世界更美好的年輕人,一起攜手同行!

Chapter 1 少年時期
Chapter 2 藝術學校的生活
Chapter 3 海上卡車
Chapter 4 球輪手推車
Chapter 5 馬車庫
Chapter 6 DC01
Chapter 7 開創核心科技的先鋒
Chapter 8 邁向全球
Chapter 9 進軍汽車設計
Chapter 10 支持可持續發展農業
Chapter 11 教育:培育年輕人才的搖籃
Chapter 12 塑造未來

心得:

詹姆斯・戴森 是 Dyson 這間私營企業公司的執行長更是主要創辦人之一,他是一個相當實事求是的工程師,對於優化與實驗有著異常執著與專注的精神。 可以從他 5126 次失敗的馬達實驗中看出來,並且他也很願意分享他的想法,在英國創立了許多設計學院,讓 Dyson 這個需要高度人力與智力的產業,依舊可以在英國扎根。

這本書也分享很多關於 Dyson 他自己的看法(書中寫得相當生氣)就是關於風扇烘手機的概念,因為當初受到許多衛生紙公司的攻擊,並且跟學校聯合給出一些不公平的測試報告。 這件事情也在這本書有了相當清楚的解釋。 不過不愧是工程師,對於自己家的產品都可以使用專利或是相關論文加以反擊。

如果你想要了解,這樣的以工程設計起家的公司老闆究竟如何評斷自己的公司。你應該要看看,他是如何在書中將不段反覆的實驗。寫成每一次美好的經驗。相當的令人佩服。