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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

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

Google API

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

import

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

Q&A

1回答

2796閲覧

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

mhy

総合スコア6

Go

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

Google API

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

import

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

0グッド

0クリップ

投稿2017/10/22 11:18

お願いします。

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)

以下の通りです。

Go

1// calendar.go 2package main 3 4import ( 5 "flag" 6 "fmt" 7 "log" 8 "runtime" 9 10 "code.google.com/p/goauth2/oauth" 11 "github.com/masahide/get-cybozu-schedule/lib" 12) 13 14func main() { 15 16 flag.Usage = lib.Usage 17 flag.Parse() 18 19 if *lib.Version { 20 fmt.Printf("%s\n", lib.ShowVersion()) 21 return 22 } 23 24 // ClientID等を読み込む 25 config, err := lib.Parse("google.json") 26 if err != nil { 27 log.Fatalf("Error Server: %v", err) 28 return 29 } 30 31 port := 3000 32 transport := oauth.Transport{ 33 Config: &oauth.Config{ 34 ClientId: config.Installed.ClientID, 35 ClientSecret: config.Installed.ClientSecret, 36 RedirectURL: fmt.Sprintf("%s:%d", "http://localhost", port), 37 Scope: "https://www.googleapis.com/auth/calendar", 38 AuthURL: config.Installed.AuthURL, 39 TokenURL: config.Installed.TokenURL, 40 TokenCache: oauth.CacheFile("cache.json"), 41 }, 42 } 43 44 // OAuthを実行 45 err = lib.GoogleOauth(&lib.GoogleToken{&transport}, lib.LocalServerConfig{port, 30, runtime.GOOS}) 46 if err != nil { 47 log.Fatalf("Error Server: %v", err) 48 return 49 } 50 51 // ここからやっとカレンダーAPIを使い始める 52 svc, err := calendar.New(transport.Client()) 53 if err != nil { 54 log.Fatalf("Error calendar.New: %v", err) 55 return 56 } 57 58 // カレンダー一覧を取得 59 cl, err := svc.CalendarList.List().Do() 60 if err != nil { 61 log.Fatalf("Error CalendarList.List(): %v", err) 62 return 63 } 64 65 fmt.Printf("--- Your calendars ---\n") 66 for _, item := range cl.Items { 67 fmt.Printf("%# v\n", item) 68 } 69 70} 71

Go

1// google-auth.go 2package lib 3 4import ( 5 "fmt" 6 "net" 7 "net/http" 8 "os/exec" 9 "strings" 10 "time" 11 12 "code.google.com/p/goauth2/oauth" 13) 14 15type LocalServerConfig struct { 16 Port int 17 Timeout int 18 OS string 19} 20 21type RedirectResult struct { 22 Code string 23 Err error 24} 25 26type Redirect struct { 27 Result chan RedirectResult 28 ServerStart chan bool 29 ServerStop chan bool 30 Listener net.Listener 31} 32 33// 各種OSでのブラウザ起動コマンドとURLのエスケープコード置換文字列 34type OpenBrowser struct { 35 EscapeAnd string 36 arg []string 37} 38 39var openBrowser = map[string]OpenBrowser{ 40 "windows": {`&`, []string{"cmd", "/c", "start"}}, 41 "darwin": {`&`, []string{"open", "-a", "safari"}}, 42 "test1": {`&`, []string{"echo", "", ""}}, 43 "test2": {`&`, []string{"fugafuga", "", ""}}, 44} 45 46func NewRedirect(result chan RedirectResult) *Redirect { 47 return &Redirect{result, make(chan bool, 1), make(chan bool, 1), nil} 48} 49 50type AuthToken interface { 51 GetTokenCache() error 52 GetAuthCodeURL() string 53 GetAuthToken(string) error 54} 55 56type GoogleToken struct { 57 Transport *oauth.Transport 58} 59 60// テストしやすいようにAuth系APIを隠蔽する 61func (this *GoogleToken) GetTokenCache() error { 62 _, err := this.Transport.Config.TokenCache.Token() 63 return err 64} 65func (this *GoogleToken) GetAuthCodeURL() string { 66 return this.Transport.Config.AuthCodeURL("") 67} 68func (this *GoogleToken) GetAuthToken(code string) error { 69 _, err := this.Transport.Exchange(code) 70 return err 71} 72 73// アクセストークンを取得 74func GoogleOauth(transport AuthToken, localServerConfig LocalServerConfig) (err error) { 75 76 // キャッシュからトークンファイルを取得 77 err = transport.GetTokenCache() 78 if err == nil { 79 return 80 } 81 url := transport.GetAuthCodeURL() 82 code, err := getAuthCode(url, localServerConfig) 83 if err != nil { 84 err = fmt.Errorf("Error getAuthCode: %#v", err) 85 return 86 } 87 // 認証トークンを取得する。(取得後、キャッシュへ) 88 err = transport.GetAuthToken(code) 89 if err != nil { 90 err = fmt.Errorf("Exchange: %#v", err) 91 } 92 return 93} 94 95// アクセスコード取得 96func (this *Redirect) GetCode(w http.ResponseWriter, r *http.Request) { 97 //defer this.Listener.Stop() 98 code := r.URL.Query().Get("code") 99 100 if code == "" { 101 fmt.Fprintf(w, `Erorr`) 102 this.Result <- RedirectResult{Err: fmt.Errorf("codeを取得できませんでした。")} 103 return 104 } 105 106 fmt.Fprintf(w, `<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> </head> 107 <body onload="window.open('about:blank','_self').close();">ブラウザが自動で閉じない場合は手動で閉じてください。</body> 108 </html> `) 109 this.Result <- RedirectResult{Code: code} 110} 111 112// localhostのhttpサーバー 113func (this *Redirect) Server(port int) { 114 mux := http.NewServeMux() 115 mux.HandleFunc("/", this.GetCode) 116 host := fmt.Sprintf("localhost:%d", port) 117 fmt.Printf("Start Listen: %s\n", host) 118 var err error 119 this.Listener, err = net.Listen("tcp", host) 120 if err != nil { 121 this.Result <- RedirectResult{Err: err} 122 return 123 } 124 server := http.Server{} 125 server.Handler = mux 126 go server.Serve(this.Listener) 127 this.ServerStart <- true 128 <-this.ServerStop 129 this.Listener.Close() 130 this.Result <- RedirectResult{Err: err} 131 return 132} 133func (this *Redirect) Stop() { 134 this.ServerStop <- true 135} 136 137// サーバー起動 -> ブラウザ起動 -> コード取得 138func getAuthCode(url string, localServerConfig LocalServerConfig) (string, error) { 139 140 var cmd *exec.Cmd 141 142 //os := runtime.GOOS 143 os := localServerConfig.OS 144 var browser *OpenBrowser 145 for key, value := range openBrowser { 146 if os == key { 147 browser = &value 148 break 149 } 150 } 151 if browser == nil { 152 return "", fmt.Errorf("まだ未対応です・・・\n%s\n", url) 153 } 154 155 redirect := NewRedirect(make(chan RedirectResult, 1)) 156 go redirect.Server(localServerConfig.Port) 157 158 // set redirect timeout 159 redirectTimeout := time.After(time.Duration(localServerConfig.Timeout) * time.Second) 160 <-redirect.ServerStart 161 162 url = strings.Replace(url, "&", browser.EscapeAnd, -1) 163 // ブラウザ起動 164 165 //fmt.Printf("%v %v %v %v", browser.arg[0], browser.arg[1], browser.arg[2], url) 166 cmd = exec.Command(browser.arg[0], browser.arg[1], browser.arg[2], url) 167 if err := cmd.Start(); err != nil { 168 return "", fmt.Errorf("Error: start browser: %v, browser: %v\n", err, browser) 169 } 170 171 defer redirect.Stop() 172 var result RedirectResult 173 174 select { 175 case result = <-redirect.Result: 176 //ブラウザ側の応答があればなにもしない 177 case <-redirectTimeout: 178 // タイムアウト 179 return "", fmt.Errorf("リダイレクト待ち時間がタイムアウトしました") 180 } 181 182 if result.Err != nil { 183 return "", fmt.Errorf("Error: リダイレクト: %v\n", result.Err) 184 } 185 186 fmt.Printf("code: %v\n", result.Code) 187 188 return result.Code, nil 189} 190

GOPATHは

C:\GO\Projects

GOROOTは

C:\GO

です。

OSはWindows10です。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

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

投稿2017/10/23 01:08

yuki-saito

総合スコア928

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問