Closed2

Flickr 短縮 URL を取得する

SpiegelSpiegel

たとえば Flickr の以下の写真

https://www.flickr.com/photos/spiegel/52462249619

このページの URL https://www.flickr.com/photos/spiegel/52462249619 の短縮 URL https://flic.kr/p/2nVUK4a は Web ページ上の手動操作で取得できる。

この短縮 URL 取得を自動化できないかなぁと思っていたのだが,実は末尾の 2nVUK4a 部分は写真ID 52462249619 を Base58 で符号化したものなんだって。しかも Base58 って標準規格があるわけじゃなくてアプリケーションによって微妙に違うらしい。なんだよ,それ orz

で,なんとか Go で書けないかと思っていたが,以下のパッケージを使うといいらしい。

https://github.com/itchyny/base58-go

というわけで,簡単なサンプルコードを書いてみた。

sample.go
package main

import (
    "flag"
    "fmt"
    "net/url"
    "os"
    "strings"

    "github.com/itchyny/base58-go"
)

func main() {
    // parse command-line
    flag.Parse()
    args := flag.Args()
    if len(args) == 0 {
        fmt.Fprintln(os.Stderr, os.ErrInvalid)
        return
    }

    // get Flickr URL
    u, err := url.Parse(args[0])
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    if !strings.HasSuffix(u.Hostname(), "flickr.com") {
        fmt.Fprintf(os.Stderr, "%v is not Flickr site\n", u.Hostname())
        return
    }

    // get photo ID
    dir, photoId := path.Split(strings.TrimSuffix(u.EscapedPath(), "/"))
    if !strings.HasPrefix(dir, "/photos/") {
        fmt.Fprintf(os.Stderr, "invalid URL: %v\n", u.String())
        return
    }
    if len(photoId) == 0 {
        fmt.Fprintf(os.Stderr, "cannot get photo ID in %v\n", u.String())
        return
    }

    // encode photo ID by Base58
    b, err := base58.FlickrEncoding.Encode([]byte(photoId))
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }

    // make short URL
    shorten, err := url.Parse("https://flic.kr/p/" + string(b))
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(shorten.String())
}

コマンドラインで指定した URL のチェックは簡易的なものなのであしからず。

これを実行すると

$ go run sample.go https://www.flickr.com/photos/spiegel/52462249619/
https://flic.kr/p/2nVUK4a

となった。よーし,うむうむ,よーし。

このスクラップは2022/11/24にクローズされました