質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Google API

    528questions

    Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

  • Go

    512questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • import

    97questions

    自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

【Golang】google calendar api v3 を使おうとしてパッケージが見つからないエラー

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 346

mhy

score 2

お願いします。

Goで、google calendar api v3 を使おうと、
https://qiita.com/yamasaki-masahide/items/f4eb7cd17a9ea1fe5467
こちらのサイトを参考にしてみたのですが、以下のエラーが出ています。

calendar.go:9:2: cannot find package "code.google.com/p/goauth2/oauth" in any of:
C:\Go\src\code.google.com\p\goauth2\oauth (from $GOROOT)
C:\Go\Projects\src\code.google.com\p\goauth2\oauth (from $GOPATH)
calendar.go:10:2: cannot find package "github.com/masahide/get-cybozu-schedule/lib" in any of:
C:\Go\src\github.com\masahide\get-cybozu-schedule\lib (from $GOROOT)
C:\Go\Projects\src\github.com\masahide\get-cybozu-schedule\lib (from $GOPATH)

以下の通りです。

// calendar.go
package main

import (
    "flag"
    "fmt"
    "log"
    "runtime"

    "code.google.com/p/goauth2/oauth"
    "github.com/masahide/get-cybozu-schedule/lib"
)

func main() {

    flag.Usage = lib.Usage
    flag.Parse()

    if *lib.Version {
        fmt.Printf("%s\n", lib.ShowVersion())
        return
    }

    // ClientID等を読み込む
    config, err := lib.Parse("google.json")
    if err != nil {
        log.Fatalf("Error Server: %v", err)
        return
    }

    port := 3000
    transport := oauth.Transport{
        Config: &oauth.Config{
            ClientId:     config.Installed.ClientID,
            ClientSecret: config.Installed.ClientSecret,
            RedirectURL:  fmt.Sprintf("%s:%d", "http://localhost", port),
            Scope:        "https://www.googleapis.com/auth/calendar",
            AuthURL:      config.Installed.AuthURL,
            TokenURL:     config.Installed.TokenURL,
            TokenCache:   oauth.CacheFile("cache.json"),
        },
    }

    // OAuthを実行
    err = lib.GoogleOauth(&lib.GoogleToken{&transport}, lib.LocalServerConfig{port, 30, runtime.GOOS})
    if err != nil {
        log.Fatalf("Error Server: %v", err)
        return
    }

    // ここからやっとカレンダーAPIを使い始める
    svc, err := calendar.New(transport.Client())
    if err != nil {
        log.Fatalf("Error calendar.New: %v", err)
        return
    }

    // カレンダー一覧を取得
    cl, err := svc.CalendarList.List().Do()
    if err != nil {
        log.Fatalf("Error CalendarList.List(): %v", err)
        return
    }

    fmt.Printf("--- Your calendars ---\n")
    for _, item := range cl.Items {
        fmt.Printf("%# v\n", item)
    }

}
// google-auth.go
package lib

import (
    "fmt"
    "net"
    "net/http"
    "os/exec"
    "strings"
    "time"

    "code.google.com/p/goauth2/oauth"
)

type LocalServerConfig struct {
    Port    int
    Timeout int
    OS      string
}

type RedirectResult struct {
    Code string
    Err  error
}

type Redirect struct {
    Result      chan RedirectResult
    ServerStart chan bool
    ServerStop  chan bool
    Listener    net.Listener
}

// 各種OSでのブラウザ起動コマンドとURLのエスケープコード置換文字列
type OpenBrowser struct {
    EscapeAnd string
    arg       []string
}

var openBrowser = map[string]OpenBrowser{
    "windows": {`&`, []string{"cmd", "/c", "start"}},
    "darwin":  {`&`, []string{"open", "-a", "safari"}},
    "test1":   {`&`, []string{"echo", "", ""}},
    "test2":   {`&`, []string{"fugafuga", "", ""}},
}

func NewRedirect(result chan RedirectResult) *Redirect {
    return &Redirect{result, make(chan bool, 1), make(chan bool, 1), nil}
}

type AuthToken interface {
    GetTokenCache() error
    GetAuthCodeURL() string
    GetAuthToken(string) error
}

type GoogleToken struct {
    Transport *oauth.Transport
}

// テストしやすいようにAuth系APIを隠蔽する
func (this *GoogleToken) GetTokenCache() error {
    _, err := this.Transport.Config.TokenCache.Token()
    return err
}
func (this *GoogleToken) GetAuthCodeURL() string {
    return this.Transport.Config.AuthCodeURL("")
}
func (this *GoogleToken) GetAuthToken(code string) error {
    _, err := this.Transport.Exchange(code)
    return err
}

// アクセストークンを取得
func GoogleOauth(transport AuthToken, localServerConfig LocalServerConfig) (err error) {

    // キャッシュからトークンファイルを取得
    err = transport.GetTokenCache()
    if err == nil {
        return
    }
    url := transport.GetAuthCodeURL()
    code, err := getAuthCode(url, localServerConfig)
    if err != nil {
        err = fmt.Errorf("Error getAuthCode: %#v", err)
        return
    }
    // 認証トークンを取得する。(取得後、キャッシュへ)
    err = transport.GetAuthToken(code)
    if err != nil {
        err = fmt.Errorf("Exchange: %#v", err)
    }
    return
}

// アクセスコード取得
func (this *Redirect) GetCode(w http.ResponseWriter, r *http.Request) {
    //defer this.Listener.Stop()
    code := r.URL.Query().Get("code")

    if code == "" {
        fmt.Fprintf(w, `Erorr`)
        this.Result <- RedirectResult{Err: fmt.Errorf("codeを取得できませんでした。")}
        return
    }

    fmt.Fprintf(w, `<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> </head>
            <body onload="window.open('about:blank','_self').close();">ブラウザが自動で閉じない場合は手動で閉じてください。</body>
            </html> `)
    this.Result <- RedirectResult{Code: code}
}

// localhostのhttpサーバー
func (this *Redirect) Server(port int) {
    mux := http.NewServeMux()
    mux.HandleFunc("/", this.GetCode)
    host := fmt.Sprintf("localhost:%d", port)
    fmt.Printf("Start Listen: %s\n", host)
    var err error
    this.Listener, err = net.Listen("tcp", host)
    if err != nil {
        this.Result <- RedirectResult{Err: err}
        return
    }
    server := http.Server{}
    server.Handler = mux
    go server.Serve(this.Listener)
    this.ServerStart <- true
    <-this.ServerStop
    this.Listener.Close()
    this.Result <- RedirectResult{Err: err}
    return
}
func (this *Redirect) Stop() {
    this.ServerStop <- true
}

// サーバー起動 -> ブラウザ起動 -> コード取得
func getAuthCode(url string, localServerConfig LocalServerConfig) (string, error) {

    var cmd *exec.Cmd

    //os := runtime.GOOS
    os := localServerConfig.OS
    var browser *OpenBrowser
    for key, value := range openBrowser {
        if os == key {
            browser = &value
            break
        }
    }
    if browser == nil {
        return "", fmt.Errorf("まだ未対応です・・・\n%s\n", url)
    }

    redirect := NewRedirect(make(chan RedirectResult, 1))
    go redirect.Server(localServerConfig.Port)

    // set redirect timeout
    redirectTimeout := time.After(time.Duration(localServerConfig.Timeout) * time.Second)
    <-redirect.ServerStart

    url = strings.Replace(url, "&", browser.EscapeAnd, -1)
    // ブラウザ起動

    //fmt.Printf("%v %v %v %v", browser.arg[0], browser.arg[1], browser.arg[2], url)
    cmd = exec.Command(browser.arg[0], browser.arg[1], browser.arg[2], url)
    if err := cmd.Start(); err != nil {
        return "", fmt.Errorf("Error:  start browser: %v, browser: %v\n", err, browser)
    }

    defer redirect.Stop()
    var result RedirectResult

    select {
    case result = <-redirect.Result:
        //ブラウザ側の応答があればなにもしない
    case <-redirectTimeout:
        // タイムアウト
        return "", fmt.Errorf("リダイレクト待ち時間がタイムアウトしました")
    }

    if result.Err != nil {
        return "", fmt.Errorf("Error: リダイレクト: %v\n", result.Err)
    }

    fmt.Printf("code: %v\n", result.Code)

    return result.Code, nil
}

GOPATHは

C:\GO\Projects

GOROOTは

C:\GO

です。

OSはWindows10です。

Goのimportに関する知識があまりなく、調べてはいるのですが原因が分かりません。
原因と対処法を教えていただきたいです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

だいぶ古い記事のようですね。
今は"golang.org/x/oauth2"を使う方が良さそうです。

それだと実装の仕方も変わってしまうようなので
この辺りの記事など参考にならないでしょうか。

https://qiita.com/konojunya/items/e2611a65d98a9abf1bf7

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google API

    528questions

    Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

  • Go

    512questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • import

    97questions

    自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。