mirror of
https://github.com/anotherhadi/gravatar-recon.git
synced 2026-10-05 19:28:25 +02:00
@@ -0,0 +1,109 @@
|
||||
package gravatar_recon
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type GravatarProfile struct {
|
||||
Hash string `json:"hash"`
|
||||
ProfileURL string `json:"profileUrl"`
|
||||
PreferredUser string `json:"preferredUsername"`
|
||||
ThumbnailURL string `json:"thumbnailUrl"`
|
||||
|
||||
Photos []struct {
|
||||
Value string `json:"value"`
|
||||
Type string `json:"type"`
|
||||
} `json:"photos"`
|
||||
|
||||
DisplayName string `json:"displayName"`
|
||||
Pronunciation string `json:"pronunciation"`
|
||||
Pronouns string `json:"pronouns"`
|
||||
AboutMe string `json:"aboutMe"`
|
||||
CurrentLocation string `json:"currentLocation"`
|
||||
JobTitle string `json:"job_title"`
|
||||
Company string `json:"company"`
|
||||
|
||||
PhoneNumbers []struct {
|
||||
Type string `json:"type"`
|
||||
Value string `json:"value"`
|
||||
} `json:"phoneNumbers"`
|
||||
|
||||
ContactInfo []struct {
|
||||
Type string `json:"type"`
|
||||
Value string `json:"value"`
|
||||
} `json:"contactInfo"`
|
||||
|
||||
Emails []struct {
|
||||
Primary string `json:"primary"`
|
||||
Value string `json:"value"`
|
||||
} `json:"emails"`
|
||||
|
||||
Accounts []struct {
|
||||
Domain string `json:"domain"`
|
||||
Display string `json:"display"`
|
||||
URL string `json:"url"`
|
||||
IconURL string `json:"iconUrl"`
|
||||
IsHidden bool `json:"is_hidden"`
|
||||
Username string `json:"username"`
|
||||
Verified bool `json:"verified"`
|
||||
Name string `json:"name"`
|
||||
Shortname string `json:"shortname"`
|
||||
} `json:"accounts"`
|
||||
|
||||
ProfileBackground struct {
|
||||
Color string `json:"color"`
|
||||
Opacity float64 `json:"opacity"`
|
||||
Size int `json:"size"`
|
||||
PrimaryColor string `json:"primary_color"`
|
||||
SurfaceColor string `json:"surface_color"`
|
||||
} `json:"profileBackground"`
|
||||
}
|
||||
|
||||
type gravatarResponse struct {
|
||||
Entry []GravatarProfile `json:"entry"`
|
||||
}
|
||||
|
||||
func md5Hash(email string) string {
|
||||
email = strings.ToLower(strings.TrimSpace(email))
|
||||
hash := md5.Sum([]byte(email))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
func GetGravatarProfiles(email string) (*[]GravatarProfile, error) {
|
||||
hash := md5Hash(email)
|
||||
url := fmt.Sprintf("https://www.gravatar.com/%s.json", hash)
|
||||
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("User-Agent", "Go-OSINT-Client/1.0")
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return nil, fmt.Errorf("no gravatar profile found (status %d)", resp.StatusCode)
|
||||
}
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var profiles gravatarResponse
|
||||
if err := json.Unmarshal(body, &profiles); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &profiles.Entry, nil
|
||||
}
|
||||
Reference in New Issue
Block a user