Closed2
Flickr 短縮 URL を取得する
ピン留めされたアイテム
自ブログに清書しました。
たとえば Flickr の以下の写真
このページの URL https://www.flickr.com/photos/spiegel/52462249619
の短縮 URL https://flic.kr/p/2nVUK4a
は Web ページ上の手動操作で取得できる。
この短縮 URL 取得を自動化できないかなぁと思っていたのだが,実は末尾の 2nVUK4a
部分は写真ID 52462249619
を Base58 で符号化したものなんだって。しかも Base58 って標準規格があるわけじゃなくてアプリケーションによって微妙に違うらしい。なんだよ,それ orz
で,なんとか 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にクローズされました