main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "strconv"
  9. "golang.org/x/oauth2"
  10. "golang.org/x/oauth2/vk"
  11. )
  12. const (
  13. APP_ID = "7065390" // вам надо заменить это значение на свое на https://vk.com/apps?act=manage https://dev.vk.com/ru/api/getting-started
  14. APP_KEY = "cQZe3Vvo4mHotmetUdXK" // вам надо заменить это значение на свое на https://vk.com/apps?act=manage https://dev.vk.com/ru/api/getting-started
  15. APP_SECRET = "1bbf49951bbf49951bbf49953b1bd486bb11bbf1bbf4995468b3d76e2cb2114610654e0"
  16. API_URL = "https://api.vk.com/method/users.get?fields=email,photo_50&access_token=%s&v=5.131"
  17. AUTH_URL = "https://oauth.vk.com/authorize?client_id=7065390&redirect_uri=http://localhost:8080/&response_type=code&scope=email"
  18. )
  19. type Response struct {
  20. Response []struct {
  21. FirstName string `json:"first_name"`
  22. Photo string `json:"photo_50"`
  23. }
  24. }
  25. // https://oauth.vk.com/authorize?client_id=7065390&redirect_uri=http://localhost:8080/&response_type=code&scope=email
  26. func main() {
  27. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  28. ctx := r.Context()
  29. code := r.FormValue("code")
  30. if code == "" {
  31. w.Write([]byte(`<div><a href="` + AUTH_URL + `">authorize</a></div>`))
  32. return
  33. }
  34. conf := oauth2.Config{
  35. ClientID: APP_ID,
  36. ClientSecret: APP_KEY,
  37. RedirectURL: "http://localhost:8080/",
  38. Endpoint: vk.Endpoint,
  39. }
  40. token, err := conf.Exchange(ctx, code)
  41. if err != nil {
  42. log.Println("cannot exchange", err)
  43. http.Error(w, err.Error(), 500)
  44. return
  45. }
  46. email := token.Extra("email").(string)
  47. userIDraw := token.Extra("user_id").(float64)
  48. userID := int(userIDraw)
  49. w.Write([]byte(`
  50. <div> Oauth token:<br>
  51. ` + fmt.Sprintf("%#v", token) + `
  52. </div>
  53. <div>Email: ` + email + `</div>
  54. <div>UserID: ` + strconv.Itoa(userID) + `</div>
  55. <br>
  56. `))
  57. client := conf.Client(ctx, token)
  58. resp, err := client.Get(fmt.Sprintf(API_URL, token.AccessToken))
  59. if err != nil {
  60. log.Println("cannot request data", err)
  61. http.Error(w, err.Error(), 500)
  62. return
  63. }
  64. defer resp.Body.Close()
  65. body, err := ioutil.ReadAll(resp.Body)
  66. if err != nil {
  67. log.Println("cannot read buffer", err)
  68. http.Error(w, err.Error(), 500)
  69. return
  70. }
  71. data := &Response{}
  72. err = json.Unmarshal(body, data)
  73. if err != nil {
  74. log.Println("cannot json.Unmarshal", err)
  75. http.Error(w, err.Error(), 500)
  76. return
  77. }
  78. w.Write([]byte(`
  79. <div>
  80. <img src="` + data.Response[0].Photo + `"/>
  81. ` + data.Response[0].FirstName + `
  82. </div>
  83. `))
  84. })
  85. log.Println("starting server at :8080")
  86. http.ListenAndServe(":8080", nil)
  87. }