東京生まれHOUSE MUSIC育ち

悪そうな奴はだいたい友達なの?

はてなAPIを使用して「はてなフォトライフ」の情報を取得する


スポンサードリンク

f:id:padobure:20210529231814p:plain

背景

はてなAPIを使用して、はてなフォトライフに写真をアップロードしようと考えています。というのも、slackに投稿している1日分の内容をはてなブログにまとめてポストしようと考えていまして。

アップロードで使用するPUTメソッドは色々とやらなければならないようなので、まずははてなフォトライフにある写真の情報を取得するコードを書きました。

コード

以下のような感じです。WSSEではなく、oauthを使用しています。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "strings"

    "github.com/gomodule/oauth1/oauth"
)

func main() {
    oauthClient := &oauth.Client{
        Credentials: oauth.Credentials{
            Token:  "xxxxx",
            Secret: "xxxxx",
        },
        TemporaryCredentialRequestURI: "https://www.hatena.com/oauth/initiate",
        ResourceOwnerAuthorizationURI: "https://www.hatena.com/oauth/authorize",
        TokenRequestURI:               "https://www.hatena.com/oauth/token",
    }

    accessToken := oauth.Credentials{
        Token:  "xxxxx",
        Secret: "xxxxx",
    }

    scope := url.Values{"scope": {"read_public", "write_public", "read_private", "write_private"}}

    req, err := http.NewRequest("GET", "https://f.hatena.ne.jp/atom/edit/20210529213650", strings.NewReader(scope.Encode()))
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    if err := oauthClient.SetAuthorizationHeader(req.Header, &accessToken, req.Method, req.URL, scope); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }

    if err != nil {
        log.Fatal("Get Err: ", err)
        panic(-1)
    }

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
    }

    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

実行結果

以下のように情報が出力されます。

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#">
  <title>sample</title>
  <link rel="alternate" type="text/html" href="http://f.hatena.ne.jp/padobure/20210529213650"/>
  <link rel="service.edit" type="application/x.atom+xml" href="http://f.hatena.ne.jp/atom/edit/20210529213650" title="sample"/>
  <issued>2021-05-29T21:36:50+09:00</issued>
  <author>
    <name>padobure</name>
  </author>
  <generator url="http://f.hatena.ne.jp/" version="1.0">Hatena::Fotolife</generator>
  <id>tag:hatena.ne.jp,2005:fotolife-padobure-20210529213650</id>
  <hatena:imageurl>https://cdn-ak.f.st-hatena.com/images/fotolife/p/padobure/20210529/20210529213650.jpg</hatena:imageurl>
  <hatena:imageurlmedium>https://cdn-ak.f.st-hatena.com/images/fotolife/p/padobure/20210529/20210529213650_120.jpg</hatena:imageurlmedium>
  <hatena:imageurlsmall>https://cdn-ak.f.st-hatena.com/images/fotolife/p/padobure/20210529/20210529213650_m.jpg</hatena:imageurlsmall>
  <hatena:syntax>f:id:padobure:20210529213650j:image</hatena:syntax>

参考にした記事

以下の記事を参考にさせていただきました。

golang.hateblo.jp