312 lines
7.0 KiB
TypeScript
312 lines
7.0 KiB
TypeScript
import type { OAuthConfig, OAuthUserConfig } from "."
|
|
|
|
export interface VkProfile {
|
|
// https://dev.vk.com/reference/objects/user
|
|
response: Array<{
|
|
id: number
|
|
first_name: string
|
|
last_name: string
|
|
photo_100: string
|
|
can_access_closed: boolean
|
|
is_closed: boolean
|
|
deactivated?: string
|
|
sex?: 0 | 1 | 2
|
|
screen_name?: string
|
|
photo_50?: string
|
|
online?: 0 | 1
|
|
online_mobile?: 0 | 1
|
|
online_app?: number
|
|
verified?: 0 | 1
|
|
trending?: 0 | 1
|
|
friend_status?: 0 | 1 | 2 | 3
|
|
first_name_nom?: string
|
|
first_name_gen?: string
|
|
first_name_dat?: string
|
|
first_name_acc?: string
|
|
first_name_ins?: string
|
|
first_name_abl?: string
|
|
last_name_nom?: string
|
|
last_name_gen?: string
|
|
last_name_dat?: string
|
|
last_name_acc?: string
|
|
last_name_ins?: string
|
|
last_name_abl?: string
|
|
nickname?: string
|
|
maiden_name?: string
|
|
domain?: string
|
|
bdate?: string
|
|
city?: {
|
|
id: number
|
|
title: string
|
|
}
|
|
country?: {
|
|
id: number
|
|
title: string
|
|
}
|
|
timezone?: number
|
|
photo_200?: string
|
|
photo_max?: string
|
|
photo_200_orig?: string
|
|
photo_400_orig?: string
|
|
photo_max_orig?: string
|
|
photo_id?: string
|
|
has_photo?: 0 | 1
|
|
has_mobile?: 0 | 1
|
|
is_friend?: 0 | 1
|
|
can_post?: 0 | 1
|
|
can_see_all_posts?: 0 | 1
|
|
can_see_audio?: 0 | 1
|
|
connections?: {
|
|
facebook?: string
|
|
skype?: string
|
|
twitter?: string
|
|
livejournal?: string
|
|
instagram?: string
|
|
}
|
|
photo_400?: string
|
|
wall_default?: "owner" | "all"
|
|
interests?: string
|
|
books?: string
|
|
tv?: string
|
|
quotes?: string
|
|
about?: string
|
|
games?: string
|
|
movies?: string
|
|
activities?: string
|
|
music?: string
|
|
can_write_private_message?: 0 | 1
|
|
can_send_friend_request?: 0 | 1
|
|
contacts?: {
|
|
mobile_phone?: string
|
|
home_phone?: string
|
|
}
|
|
site?: string
|
|
status_audio?: {
|
|
access_key?: string
|
|
artist: string
|
|
id: number
|
|
owner_id: number
|
|
title: string
|
|
url?: string
|
|
duration: number
|
|
date?: number
|
|
album_id?: number
|
|
genre_id?: number
|
|
performer?: string
|
|
}
|
|
status?: string
|
|
last_seen?: {
|
|
platform?: 1 | 2 | 3 | 4 | 5 | 6 | 7
|
|
time?: number
|
|
}
|
|
exports?: {
|
|
facebook?: number
|
|
livejournal?: number
|
|
twitter?: number
|
|
instagram?: number
|
|
}
|
|
crop_photo?: {
|
|
photo: {
|
|
access_key?: string
|
|
album_id: number
|
|
date: number
|
|
height?: number
|
|
id: number
|
|
images?: Array<{
|
|
height?: number
|
|
type?: "s" | "m" | "x" | "l" | "o" | "p" | "q" | "r" | "y" | "z" | "w"
|
|
url?: string
|
|
width?: number
|
|
}>
|
|
lat?: number
|
|
long?: number
|
|
owner_id: number
|
|
photo_256?: string
|
|
can_comment?: 0 | 1
|
|
place?: string
|
|
post_id?: number
|
|
sizes?: Array<{
|
|
height: number
|
|
url: string
|
|
src?: string
|
|
type:
|
|
| "s"
|
|
| "m"
|
|
| "x"
|
|
| "o"
|
|
| "p"
|
|
| "q"
|
|
| "r"
|
|
| "k"
|
|
| "l"
|
|
| "y"
|
|
| "z"
|
|
| "c"
|
|
| "w"
|
|
| "a"
|
|
| "b"
|
|
| "e"
|
|
| "i"
|
|
| "d"
|
|
| "j"
|
|
| "temp"
|
|
| "h"
|
|
| "g"
|
|
| "n"
|
|
| "f"
|
|
| "max"
|
|
width: number
|
|
}>
|
|
text?: string
|
|
user_id?: number
|
|
width?: number
|
|
has_tags: boolean
|
|
}
|
|
crop: {
|
|
x: number
|
|
y: number
|
|
x2: number
|
|
y2: number
|
|
}
|
|
rect: {
|
|
x: number
|
|
y: number
|
|
x2: number
|
|
y2: number
|
|
}
|
|
}
|
|
followers_count?: number
|
|
blacklisted?: 0 | 1
|
|
blacklisted_by_me?: 0 | 1
|
|
is_favorite?: 0 | 1
|
|
is_hidden_from_feed?: 0 | 1
|
|
common_count?: number
|
|
occupation?: {
|
|
id?: number
|
|
name?: string
|
|
type?: "work" | "school" | "university"
|
|
}
|
|
career?: {
|
|
group_id?: number
|
|
company?: string
|
|
country_id?: number
|
|
city_id?: number
|
|
city_name?: string
|
|
from?: number
|
|
until?: number
|
|
position?: string
|
|
}
|
|
military?: {
|
|
country_id: number
|
|
from?: number
|
|
unit: string
|
|
unit_id: number
|
|
until?: number
|
|
}
|
|
education?: {
|
|
university?: number
|
|
university_name?: string
|
|
faculty?: number
|
|
faculty_name?: string
|
|
graduation?: number
|
|
}
|
|
home_town?: string
|
|
relation?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
|
|
relation_partner?: {
|
|
deactivated?: string
|
|
first_name: string
|
|
hidden?: number
|
|
id: number
|
|
last_name: string
|
|
can_access_closed?: boolean
|
|
is_closed?: boolean
|
|
}
|
|
personal?: {
|
|
alcohol?: 1 | 2 | 3 | 4 | 5
|
|
inspired_by?: string
|
|
langs?: string[]
|
|
life_main?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
|
|
people_main?: 1 | 2 | 3 | 4 | 5 | 6
|
|
political?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|
|
religion?: string
|
|
smoking?: 1 | 2 | 3 | 4 | 5
|
|
}
|
|
universities?: Array<{
|
|
chair?: number
|
|
chair_name?: string
|
|
city?: number
|
|
country?: number
|
|
education_form?: string
|
|
education_status?: string
|
|
faculty?: number
|
|
faculty_name?: string
|
|
graduation?: number
|
|
id?: number
|
|
name?: string
|
|
university_group_id?: number
|
|
}>
|
|
schools?: Array<{
|
|
city?: number
|
|
class?: string
|
|
country?: number
|
|
id?: string
|
|
name?: string
|
|
type?: number
|
|
type_str?: string
|
|
year_from?: number
|
|
year_graduated?: number
|
|
year_to?: number
|
|
speciality?: string
|
|
}>
|
|
relatives?: Array<{
|
|
id?: number
|
|
name?: string
|
|
type: "parent" | "child" | "grandparent" | "grandchild" | "sibling"
|
|
}>
|
|
counters?: {
|
|
albums?: number
|
|
videos?: number
|
|
audios?: number
|
|
photos?: number
|
|
notes?: number
|
|
friends?: number
|
|
groups?: number
|
|
online_friends?: number
|
|
mutual_friends?: number
|
|
user_videos?: number
|
|
followers?: number
|
|
pages?: number
|
|
}
|
|
is_no_index?: 0 | 1
|
|
}>
|
|
}
|
|
|
|
export default function VK<P extends Record<string, any> = VkProfile>(
|
|
options: OAuthUserConfig<P>
|
|
): OAuthConfig<P> {
|
|
const apiVersion = "5.131" // https://vk.com/dev/versions
|
|
|
|
return {
|
|
id: "vk",
|
|
name: "VK",
|
|
type: "oauth",
|
|
authorization: `https://oauth.vk.com/authorize?scope=email&v=${apiVersion}`,
|
|
client: {
|
|
token_endpoint_auth_method: "client_secret_post",
|
|
},
|
|
token: `https://oauth.vk.com/access_token?v=${apiVersion}`,
|
|
userinfo: `https://api.vk.com/method/users.get?fields=photo_100&v=${apiVersion}`,
|
|
profile(result: P) {
|
|
const profile = result.response?.[0] ?? {}
|
|
return {
|
|
id: profile.id,
|
|
name: [profile.first_name, profile.last_name].filter(Boolean).join(" "),
|
|
email: null,
|
|
image: profile.photo_100,
|
|
}
|
|
},
|
|
style: { logo: "/vk.svg", bg: "#07F", text: "#fff" },
|
|
options,
|
|
}
|
|
}
|