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

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

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

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

1回答

2192閲覧

Golangのanacondaでユーザー認証をしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2017/09/18 15:24

編集2017/09/19 04:11

anacondaを使って、ユーザー認証をした上で処理をしたいです。

anaconda.AuthorizationURL()を使って云々...というような処理なのですが、いかんせんgoを始めたばかりでよくわかりません。
httpリクエストについては理解しています。(goのhttpパッケージの某Handlerなどについては半乾きの知識しかございません)

コメントを添えて教えていただけませんか?

コールバックは、ローカルホストで済ませたいです!

#コード

自分のaccess_tokenを使う前提でapiを作るコードはかけました。

go

1package main 2 3import ( 4 "github.com/ChimeraCoder/anaconda" 5 "fmt" 6) 7 8var ( 9 //twitter for iOSのコンシューマーキーです 10 ConsumerKey = "CK" 11 ConsumerSecret = "CS" 12) 13 14func main() { 15 api := getAuth() 16 //処理 17} 18 19func getAuth() *anaconda.TwitterApi { 20 anaconda.SetConsumerKey(ConsumerKey) 21 anaconda.SetConsumerSecret(ConsumerSecret) 22 api := anaconda.NewTwitterApi("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET") 23 fmt.Println("authorize successful") 24 return api 25}

なお、teratailの利用が初めてなので、何か至らない点がございましたらすみません。。

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

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

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

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

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

mattn

2017/09/18 15:44 編集

「要は他人のアクセストークンを取得して動くようにしたいということですかね。」これはどういう意味でしょうか?またソースコードにコンシューマーキーとシークレットが書かれていますが、これ生きてる物だとすると悪用されるのでこの記事ごと消すか、もしくは Twitter 側のアプリケーションを消して下さい。
退会済みユーザー

退会済みユーザー

2017/09/18 16:20 編集

「他人のアクセストークンを取得して動くようにしたい」というのは、よく診断サービスなどである認証をしたいということです。正式には「twitter連携」というやつでしょうか。あれはその人個人のアクセストークンを取ってると思ってたんですが、違ったらすみません...。。このコンシューマーキーは流出した公式のコンシューマーキーをとりあえず貼り付けているため、私のものではないです。誤解を招くような書き方、すみませんでした。
guest

回答1

0

ベストアンサー

こんな感じです。
※出来ればもう少し作って頂いた後に質問された方が、なぜこの様なコードになるのか理解出来て良いのですが。

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "net" 7 "net/http" 8 "os" 9 10 "github.com/ChimeraCoder/anaconda" 11 "github.com/skratchdot/open-golang/open" 12) 13 14var ( 15 //twitter for iOSのコンシューマーキーです 16 ConsumerKey = "CK" 17 ConsumerSecret = "CS" 18) 19 20func init() { 21 // Twitter 側の問題で golang では http/2 を無効にしないとエラーメッセージが文字化けする。 22 godebug := os.Getenv("GODEBUG") 23 if godebug != "" { 24 godebug += "," 25 } 26 godebug += "http2client=0" 27 os.Setenv("GODEBUG", godebug) 28} 29 30func main() { 31 api, err := getAuth() 32 if err != nil { 33 log.Fatal(err) 34 } 35 //処理 36 fmt.Println(api) 37} 38 39func getAuth() (*anaconda.TwitterApi, error) { 40 // ランダムなポートで受け待つ 41 l, err := net.Listen("tcp", "127.0.0.1:0") 42 if err != nil { 43 return nil, err 44 } 45 defer l.Close() 46 47 anaconda.SetConsumerKey(ConsumerKey) 48 anaconda.SetConsumerSecret(ConsumerSecret) 49 50 // authorizationURL にアクセスして認証 URI を得る 51 uri, cred, err := anaconda.AuthorizationURL(fmt.Sprintf("http://%s/", l.Addr().String())) 52 if err != nil { 53 return nil, err 54 } 55 fmt.Println(uri) 56 open.Start(uri) 57 58 // コールバックを用意する 59 var verifier string 60 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 61 verifier = r.URL.Query().Get("oauth_verifier") 62 // リスナを閉じて処理を続行 63 l.Close() 64 }) 65 66 http.Serve(l, nil) 67 68 // 認証 69 cred, _, err = anaconda.GetCredentials(cred, verifier) 70 if err != nil { 71 return nil, err 72 } 73 74 // API クライアントを設定 75 api := anaconda.NewTwitterApi(cred.Token, cred.Secret) 76 fmt.Println("authorize successful") 77 return api, nil 78}

投稿2017/09/19 01:20

mattn

総合スコア5030

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

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

退会済みユーザー

退会済みユーザー

2017/09/19 04:10 編集

ありがとうございます???? これは、net.Listen("tcp", "127.0.0.1:0")とhttp.Serve(l, nil)を使ってハンドルしてますが、http.ListenAndServe(":0", nil)でも同じ挙動にすることが出来るんでしょうか
mattn

2017/09/19 05:19

いえ、net.Listen を使っているのはランダムポートを作りながら、そのポートを使った URL を API に渡す為です。http.ListenAndServe は起動した後どのポートで開くか分かりません(実際には調べられますが)。また少し前までの Go では一旦起動した http サーバを止める事が出来ませんでした。なので net.Listen を使われた方が後方互換があります。
mattn

2017/09/19 09:33

はい。ただそのコネクションを外からは触れないので、↑の様にしないとサーバを停止出来ないのです。go1.8 から停止出来ます。
退会済みユーザー

退会済みユーザー

2017/09/19 09:48

なるほど ありがとうございました
退会済みユーザー

退会済みユーザー

2017/09/19 10:51

あ、最後にいいですか!? os.Getenv()は環境変数の値を取得する。 os.Setenv()は環境変数をセットするというものだと思うんですが、~/.zshrcを確認してもGODEBUGが見当たりません。どこにsetしてるんですかこれは
mattn

2017/09/19 13:42

↑のコードは、GODEBUG が既に設定してあった場合に付け足すコードなので、 .zshrc に設定が無くても構いません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問