增加twitter头像的返回和保存
This commit is contained in:
parent
b49bed2bc5
commit
dba4eddee7
@ -6,8 +6,8 @@ import { AuthRecord, PlatEnum } from 'modules/AuthRecord'
|
|||||||
import { DiscordSvr } from 'services/discord.svr'
|
import { DiscordSvr } from 'services/discord.svr'
|
||||||
import { hmacsha256 } from 'utils/security.util'
|
import { hmacsha256 } from 'utils/security.util'
|
||||||
|
|
||||||
const checkSign = (params: {address?: string, sign?: string}) => {
|
const checkSign = (params: { address?: string; sign?: string }) => {
|
||||||
const {address, sign} = params;
|
const { address, sign } = params
|
||||||
if (!address || !sign) {
|
if (!address || !sign) {
|
||||||
throw new ZError(10, 'invalid params')
|
throw new ZError(10, 'invalid params')
|
||||||
}
|
}
|
||||||
@ -44,6 +44,7 @@ class MainController extends BaseController {
|
|||||||
result.twitter = {
|
result.twitter = {
|
||||||
id: record.openId,
|
id: record.openId,
|
||||||
username: record.username,
|
username: record.username,
|
||||||
|
avatar: record.avatar,
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 7:
|
case 7:
|
||||||
@ -85,18 +86,18 @@ class MainController extends BaseController {
|
|||||||
return { verified }
|
return { verified }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@role(ROLE_ANON)
|
@role(ROLE_ANON)
|
||||||
@router('get /activity/twitter/:address')
|
@router('get /activity/twitter/:address')
|
||||||
async checkTwitterFollow(req) {
|
async checkTwitterFollow(req) {
|
||||||
let { address } = req.params
|
let { address } = req.params
|
||||||
checkSign(req.params);
|
checkSign(req.params)
|
||||||
address = address.toLowerCase()
|
address = address.toLowerCase()
|
||||||
let record = await AuthRecord.findOne({ address, platform: PlatEnum.TWITTER })
|
let record = await AuthRecord.findOne({ address, platform: PlatEnum.TWITTER })
|
||||||
let result: any = { }
|
let result: any = {}
|
||||||
if (!!record) {
|
if (!!record) {
|
||||||
result.username = record.username
|
result.username = record.username
|
||||||
result.userid = record.openId
|
result.userid = record.openId
|
||||||
|
result.avatar = record.avatar
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@ -105,10 +106,10 @@ class MainController extends BaseController {
|
|||||||
@router('get /activity/discord/:address')
|
@router('get /activity/discord/:address')
|
||||||
async checkDiscord(req) {
|
async checkDiscord(req) {
|
||||||
let { address } = req.params
|
let { address } = req.params
|
||||||
checkSign(req.params);
|
checkSign(req.params)
|
||||||
address = address.toLowerCase()
|
address = address.toLowerCase()
|
||||||
let record = await AuthRecord.findOne({ address, platform: PlatEnum.DISCORD })
|
let record = await AuthRecord.findOne({ address, platform: PlatEnum.DISCORD })
|
||||||
let result: any = { }
|
let result: any = {}
|
||||||
if (!!record) {
|
if (!!record) {
|
||||||
result.verified = record.condition
|
result.verified = record.condition
|
||||||
result.username = record.username
|
result.username = record.username
|
||||||
@ -122,17 +123,17 @@ class MainController extends BaseController {
|
|||||||
@router('get /activity/discord/svr/:id')
|
@router('get /activity/discord/svr/:id')
|
||||||
async checkDiscordJoin(req) {
|
async checkDiscordJoin(req) {
|
||||||
let { id } = req.params
|
let { id } = req.params
|
||||||
checkSign(req.params);
|
checkSign(req.params)
|
||||||
let verified = new DiscordSvr().checkUser(id)
|
let verified = new DiscordSvr().checkUser(id)
|
||||||
return {verified}
|
return { verified }
|
||||||
}
|
}
|
||||||
|
|
||||||
@role(ROLE_ANON)
|
@role(ROLE_ANON)
|
||||||
@router('get /activity/discord/role/:id')
|
@router('get /activity/discord/role/:id')
|
||||||
async checkDiscordRole(req) {
|
async checkDiscordRole(req) {
|
||||||
let { id } = req.params
|
let { id } = req.params
|
||||||
checkSign(req.params);
|
checkSign(req.params)
|
||||||
let verified = new DiscordSvr().checkUserRole(id)
|
let verified = new DiscordSvr().checkUserRole(id)
|
||||||
return {verified}
|
return { verified }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
|
|
||||||
import BaseController, { ROLE_ANON } from 'common/base.controller'
|
import BaseController, { ROLE_ANON } from 'common/base.controller'
|
||||||
import { role, router } from 'decorators/router'
|
import { role, router } from 'decorators/router'
|
||||||
|
|
||||||
class OauthController extends BaseController {
|
class OauthController extends BaseController {
|
||||||
|
|
||||||
@role(ROLE_ANON)
|
@role(ROLE_ANON)
|
||||||
@router('get /oauth/redirect')
|
@router('get /oauth/redirect')
|
||||||
@router('post /oauth/redirect')
|
@router('post /oauth/redirect')
|
||||||
|
@ -34,6 +34,9 @@ class TwitterController extends BaseController {
|
|||||||
record.nickname = uinfo.data?.name
|
record.nickname = uinfo.data?.name
|
||||||
record.username = uinfo.data?.username
|
record.username = uinfo.data?.username
|
||||||
record.openId = uinfo.data?.id
|
record.openId = uinfo.data?.id
|
||||||
|
if (uinfo.data?.profile_image_url) {
|
||||||
|
record.avatar = uinfo.data?.profile_image_url.replace('_normal', '')
|
||||||
|
}
|
||||||
await record.save()
|
await record.save()
|
||||||
}
|
}
|
||||||
if (stateArr.length > 2) {
|
if (stateArr.length > 2) {
|
||||||
|
@ -32,6 +32,8 @@ export class AuthRecordClass extends BaseModule {
|
|||||||
|
|
||||||
@prop()
|
@prop()
|
||||||
public username?: string
|
public username?: string
|
||||||
|
@prop()
|
||||||
|
public avatar?: string
|
||||||
// 对应discord上的discriminator
|
// 对应discord上的discriminator
|
||||||
@prop()
|
@prop()
|
||||||
public discriminator?: string
|
public discriminator?: string
|
||||||
|
@ -45,10 +45,32 @@ export class DiscordSvr {
|
|||||||
private guild: Guild
|
private guild: Guild
|
||||||
public async init() {
|
public async init() {
|
||||||
console.log('DiscordSvr init')
|
console.log('DiscordSvr init')
|
||||||
this.client = new Client({ intents: [GatewayIntentBits.Guilds] })
|
this.client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers] })
|
||||||
this.client.once(Events.ClientReady, async c => {
|
this.client.once(Events.ClientReady, async c => {
|
||||||
console.log(`Ready! Logged in as ${c.user.tag}`)
|
console.log(`Ready! Logged in as ${c.user.tag}`)
|
||||||
this.guild = await this.client.guilds.fetch(process.env.DISCROD_GUILD_ID)
|
this.guild = await this.client.guilds.fetch(process.env.DISCROD_GUILD_ID)
|
||||||
|
console.log('guild', this.guild)
|
||||||
|
await this.guild.members.fetch()
|
||||||
|
for (const member of this.guild.members.cache.values()) {
|
||||||
|
console.log(member.user)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.client.on(Events.GuildMemberUpdate, async (oldMember, newMember) => {
|
||||||
|
console.log('GuildMemberUpdate', oldMember, newMember)
|
||||||
|
// Check if the member's roles have changed
|
||||||
|
// if (oldMember.roles.cache.size !== newMember.roles.cache.size) {
|
||||||
|
// // Get the added and removed roles
|
||||||
|
// const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id))
|
||||||
|
// const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id))
|
||||||
|
// console.log('addedRoles', addedRoles)
|
||||||
|
// console.log('removedRoles', removedRoles)
|
||||||
|
// }
|
||||||
|
})
|
||||||
|
this.client.on(Events.GuildMemberAdd, async member => {
|
||||||
|
console.log('GuildMemberAdd', member)
|
||||||
|
})
|
||||||
|
this.client.on(Events.GuildMemberRemove, async member => {
|
||||||
|
console.log('GuildMemberRemove', member)
|
||||||
})
|
})
|
||||||
this.client.login(process.env.DISCORD_BOT_TOKEN)
|
this.client.login(process.env.DISCORD_BOT_TOKEN)
|
||||||
}
|
}
|
||||||
@ -66,10 +88,13 @@ export class DiscordSvr {
|
|||||||
if (!this.guild) {
|
if (!this.guild) {
|
||||||
throw new ZError(10, 'DiscordSvr not init')
|
throw new ZError(10, 'DiscordSvr not init')
|
||||||
}
|
}
|
||||||
|
for (const member of this.guild.members.cache.values()) {
|
||||||
|
console.log(member.user)
|
||||||
|
}
|
||||||
return this.guild.members.cache.has(uid)
|
return this.guild.members.cache.has(uid)
|
||||||
}
|
}
|
||||||
|
|
||||||
public async checkUserRole(uid: string) {
|
public checkUserRole(uid: string) {
|
||||||
if (!this.guild) {
|
if (!this.guild) {
|
||||||
throw new ZError(10, 'DiscordSvr not init')
|
throw new ZError(10, 'DiscordSvr not init')
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,37 @@ export async function exchangeTwitterCodeForToken(code: string, vcode: string) {
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code
|
||||||
|
* @param refreshToken
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export async function refreshToken(refreshToken: string) {
|
||||||
|
const url = 'https://api.twitter.com/2/oauth2/token'
|
||||||
|
const credentials = Buffer.from(`${consumerKey}:${consumerSecret}`).toString('base64')
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
Authorization: `Basic ${credentials}`,
|
||||||
|
},
|
||||||
|
body: new URLSearchParams({
|
||||||
|
grant_type: 'refresh_token',
|
||||||
|
refresh_token: refreshToken,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
const data = await response.json()
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://developer.twitter.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me
|
||||||
|
* User rate limit (User context): 75 requests per 15-minute window per each authenticated user
|
||||||
|
* @param accessToken
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
export async function getTwitterUserInfo(accessToken: string) {
|
export async function getTwitterUserInfo(accessToken: string) {
|
||||||
const url = 'https://api.twitter.com/2/users/me'
|
const url = 'https://api.twitter.com/2/users/me?user.fields=profile_image_url'
|
||||||
const response = await fetch(url, {
|
const response = await fetch(url, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user