中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

中糧網(wǎng)站是哪個(gè)公司做的上海高端seo公司

中糧網(wǎng)站是哪個(gè)公司做的,上海高端seo公司,做網(wǎng)站寶雞,1免費(fèi)做網(wǎng)站下面文章講解獲取OAuth2授權(quán)整個(gè)流程,創(chuàng)建機(jī)器人,使用機(jī)器人監(jiān)聽(tīng)工會(huì)(工會(huì)就是創(chuàng)建的服務(wù)器)成員變化等等,對(duì)接國(guó)外的都是需要VPN的哦,對(duì)接的時(shí)候記得提前準(zhǔn)備。 創(chuàng)建應(yīng)用 點(diǎn)擊 此頁(yè)面添加應(yīng)用,&#xff…

下面文章講解獲取OAuth2授權(quán)整個(gè)流程,創(chuàng)建機(jī)器人,使用機(jī)器人監(jiān)聽(tīng)工會(huì)(工會(huì)就是創(chuàng)建的服務(wù)器)成員變化等等,對(duì)接國(guó)外的都是需要VPN的哦,對(duì)接的時(shí)候記得提前準(zhǔn)備。

創(chuàng)建應(yīng)用

點(diǎn)擊?此頁(yè)面添加應(yīng)用,,創(chuàng)建完成以后會(huì)生成應(yīng)用名稱,公鑰,客戶id等等,這些我們可以保存下來(lái)。這些應(yīng)用會(huì)自動(dòng)和我們的工會(huì)關(guān)聯(lián)的。

創(chuàng)建機(jī)器人

在下面頁(yè)面創(chuàng)建一個(gè)機(jī)器人,機(jī)器人會(huì)會(huì)生成自己的token,這個(gè)一定要保存好,注意機(jī)器人安全。


配置OAuth2

頁(yè)面創(chuàng)建我們的OAuth2,重定向URL需要配置前端頁(yè)面的URL,因?yàn)楂@取用戶token需要重定向到前端頁(yè)面,這個(gè)地方我們自定義配置即可,授權(quán)我們可以訪問(wèn)用戶的一些功能權(quán)限。

將機(jī)器人加入我們的工會(huì)

?創(chuàng)建工會(huì)(服務(wù)器)直接在discord聊天頁(yè)面創(chuàng)建就好了,這個(gè)就不多說(shuō)了,那么我們?nèi)绾螌⑽覀兊臋C(jī)器人拉入到我們的服務(wù)器呢?

選擇OAuth2,選擇bot,勾選機(jī)器人的工會(huì)權(quán)限,然后下面會(huì)生成一個(gè)鏈接。

打開(kāi)鏈接會(huì)出現(xiàn)下圖內(nèi)容,我們將我們的機(jī)器人加入到我們自己的服務(wù)器即可。?

我們通過(guò)上面的步驟成功的創(chuàng)建了我們的應(yīng)用、工會(huì)和機(jī)器人,下面我們將介紹如何使用OAuth2相關(guān)功能以及操作機(jī)器人。

OAuth2功能實(shí)現(xiàn)

<!-- Discord4J  依賴 -->
<dependency><groupId>com.discord4j</groupId><artifactId>discord4j-core</artifactId><version>3.2.1</version>
</dependency><dependency><groupId>net.dv8tion</groupId><artifactId>JDA</artifactId><version>5.0.0-beta.12</version>
</dependency>

根據(jù)配置的OAuth2頁(yè)面生成相關(guān)的鏈接,用戶點(diǎn)擊授權(quán)以后回調(diào)到前端頁(yè)面,頁(yè)面會(huì)帶有code以及state參數(shù),code我們用來(lái)?yè)Q取token,state授權(quán)頁(yè)面我們傳什么參數(shù)過(guò)去會(huì)給我們帶回來(lái)的一個(gè)參數(shù),授權(quán)類似與下面的地址。

https://discord.com/oauth2/authorize?client_id=1215207180614246411&state=%E9%9A%8F%E6%9C%BA%E5%8F%82%E6%95%B0&response_type=code&redirect_uri=http%3A%2F%2F9cxuu6.natappfree.cc%2Fdiscord%2FgetDiscordByCode&scope=identify+guilds+email+guilds.join+connections+guilds.members.read
?

根據(jù)token交互用戶數(shù)據(jù)

拿到token以后我們可以查詢用戶的信息,用戶工會(huì)情況等等。

package com.odcchina.server.api;import com.odcchina.common.config.BaseComponent;
import com.odcchina.server.dto.DiscordDto;
import com.odcchina.server.service.DiscordService;
import com.odcchina.server.service.GuildEvent;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.requests.GatewayIntent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
@RequestMapping("/discord")
@Api(tags = "discord服務(wù)")
@Transactional(isolation = Isolation.READ_COMMITTED)
public class DiscordController extends BaseComponent {@Autowiredprivate DiscordService discordService;/*** 授權(quán)回調(diào)code* @param code* @return*/@GetMapping("getDiscordByCode")@ApiOperation("獲取discord的Code")public Map<String, String> getTuiteCode(String code) {Map<String, String> map = new HashMap<>();//根據(jù)code換取tokenDiscordDto discordDto = discordService.getToken(code,null);map.put("code", code);map.put("access_token", discordDto.getAccessToken());map.put("refresh_token", discordDto.getRefreshToken());return map;}@GetMapping("findLaborUnionList")@ApiOperation("查詢我的工會(huì)列表")public Map<String, String> findLaborUnionList(String token) {Map<String, String> map = new HashMap<>();try {discordService.findLaborUnionList(token);} catch (Exception e) {throw new RuntimeException(e);}return map;}@GetMapping("findUserLaborUnion")@ApiOperation("查詢用戶是否存在工會(huì)里面")public Map<String, String> findUserLaborUnion(String token,String guildId) {Map<String, String> map = new HashMap<>();try {discordService.findUserLaborUnion(token,guildId);} catch (Exception e) {throw new RuntimeException(e);}return map;}@GetMapping("findUser")@ApiOperation("查詢用戶信息")public Map<String, String> findUser(String token) {Map<String, String> map = new HashMap<>();try {discordService.findUser(token);} catch (Exception e) {throw new RuntimeException(e);}return map;}}
package com.odcchina.server.service;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.scribejava.apis.DiscordApi;
import com.odcchina.server.config.DiscordConfig;
import com.odcchina.server.dto.DiscordDto;
import com.odcchina.server.dto.DiscordlaborUnionDto;
import com.odcchina.server.dto.UserDto;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;@Slf4j
@Service
public class DiscordService {/*** form表單提交* @param url* @param map* @return*/public DiscordDto doPostForm(String url, Map<String, Object> map) {String strResult = "";CloseableHttpClient client = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");List<BasicNameValuePair> paramPairs = new ArrayList<>();Set<String> keySet = map.keySet();for (String key : keySet) {Object val = map.get(key);paramPairs.add(new BasicNameValuePair(key, val.toString()));}UrlEncodedFormEntity entity;try {// 4. 將參數(shù)設(shè)置到entity對(duì)象中entity = new UrlEncodedFormEntity(paramPairs, "UTF-8");// 5. 將entity對(duì)象設(shè)置到httppost對(duì)象中httpPost.setEntity(entity);// 6. 發(fā)送請(qǐng)求并回去響應(yīng)CloseableHttpResponse resp = client.execute(httpPost);try {HttpEntity respEntity = resp.getEntity();strResult = EntityUtils.toString(respEntity, "UTF-8");JSONObject json = JSON.parseObject(strResult.toString());Object access_token = json.get("access_token");Object refresh_token = json.get("refresh_token");Object token_type = json.get("token_type");Object expires_in = json.get("expires_in");if(access_token == null || refresh_token == null){return null;}DiscordDto discordDto = new DiscordDto();discordDto.setAccessToken(access_token.toString());discordDto.setRefreshToken(refresh_token.toString());discordDto.setTokenType(token_type.toString());discordDto.setExpiresIn(Integer.parseInt(expires_in.toString()));return discordDto;} finally {resp.close();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 10. 關(guān)閉連接,釋放資源try {client.close();} catch (Exception e) {e.printStackTrace();}}return null;}/*** 根據(jù)code換取token** @param code* @return*/public DiscordDto getToken(String code,String refreshToken) {try {Map<String, Object> formData = new HashMap<>();if(!StringUtils.isBlank(code)){formData.put("grant_type", "authorization_code");formData.put("code", code);}if(!StringUtils.isBlank(refreshToken)){formData.put("refresh_token", refreshToken);formData.put("grant_type", "refresh_token");}//TODO 重定向配置的URL,一定要和重定向里面的地址保持一致formData.put("redirect_uri", 重定向配置的地址URL");formData.put("client_id", DiscordConfig.CLIENT_ID);formData.put("client_secret", DiscordConfig.CLIENT_SECRET);// 創(chuàng)建URL對(duì)象DiscordDto discordDto = this.doPostForm("https://discord.com/api/oauth2/token",formData);return discordDto;} catch (Exception e) {throw new RuntimeException(e);}}/*** 獲取用戶的所有服務(wù)器* @param token* @return*/public List<DiscordlaborUnionDto> findLaborUnionList(String token) {try {// 設(shè)置請(qǐng)求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me/guilds");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客戶端執(zhí)行(發(fā)送)Post請(qǐng)求response = httpClient.execute(httpPost);// 從響應(yīng)模型中獲取響應(yīng)實(shí)體HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONArray jsonArray = JSON.parseArray(responseJson);List<DiscordlaborUnionDto> jsonArrayToStringList = JSONObject.parseArray(jsonArray.toJSONString(),DiscordlaborUnionDto.class);return jsonArrayToStringList;}} catch (Exception e) {e.printStackTrace();}return null;}public Boolean findUserLaborUnion(String token, String guildId) {try {// 設(shè)置請(qǐng)求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me/guilds/" + guildId+"/member");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客戶端執(zhí)行(發(fā)送)Post請(qǐng)求response = httpClient.execute(httpPost);// 從響應(yīng)模型中獲取響應(yīng)實(shí)體HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONObject jsonArray = JSON.parseObject(responseJson);if(jsonArray.get("user") != null){return true;}}} catch (Exception e) {e.printStackTrace();}return false;}/*** 查詢用戶信息* @param token* @return*/public UserDto findUser(String token) {try {// 設(shè)置請(qǐng)求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客戶端執(zhí)行(發(fā)送)Post請(qǐng)求response = httpClient.execute(httpPost);// 從響應(yīng)模型中獲取響應(yīng)實(shí)體HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONObject jsonArray = JSON.parseObject(responseJson);UserDto userDto = JSON.toJavaObject(jsonArray, UserDto.class);return userDto;}} catch (Exception e) {e.printStackTrace();}return null;}}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class DiscordDto {/*** 訪問(wèn)令牌*/private String accessToken;/*** 刷新令牌*/private String refreshToken;/*** 認(rèn)證方式 Bearer*/private String tokenType;/*** 過(guò)期時(shí)間 (秒)*/private Integer expiresIn;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;/*** 獲取工會(huì)列表*/
@Data
@Accessors(chain = true)
public class DiscordlaborUnionDto {/*** 工會(huì)ID*/public String id;/*** 工會(huì)名稱*/public String name;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class DiscordUserDto {/*** 服務(wù)器ID*/private String guildId;/*** 服務(wù)器名稱*/private String guildName;/*** 用戶ID*/private String userId;/*** 用戶名稱*/private String userName;}
package com.odcchina.server.config;/*** Discord相關(guān)配置*/
public class DiscordConfig {/*** 客戶id和客戶私鑰*/public static final String CLIENT_ID = "111111";public static final String CLIENT_SECRET = "nL8gLAmZEFZYtQQ2mqE3tEYWC111111";public static final String PUBLIC_CLIENT_SECRET = "feca6db06a1af3c5ebff8fb3710213b86651f6401623d103a5111111";public static final String TOKEN_ENDPOINT = "https://discord.com/api/oauth2/token";
}

使用機(jī)器人監(jiān)聽(tīng)工會(huì)會(huì)員變動(dòng)情況

工會(huì)會(huì)員新加入,退出等情況監(jiān)聽(tīng),前期我們需要開(kāi)啟下面這些功能,不然機(jī)器人無(wú)法監(jiān)聽(tīng):

    @GetMapping("botMonitor")@ApiOperation("開(kāi)啟機(jī)器人監(jiān)聽(tīng)服務(wù)")public Map<String, String> botMonitor() {//啟動(dòng)機(jī)器人,監(jiān)聽(tīng)成員事件try {//這里是機(jī)器人的token的,注意下String botToken = "1111.Gh00hD.1111";JDABuilder builder = JDABuilder.createDefault(botToken);//添加事件監(jiān)聽(tīng)器builder.addEventListeners(new GuildEvent());//builder.useSharding(int shardId, int shardTotal)//工會(huì)成員 GUILD_MEMBERS TODO 這個(gè)地方在機(jī)器人里面有個(gè)選項(xiàng)需要開(kāi)啟,不然無(wú)法調(diào)用builder.enableIntents(GatewayIntent.GUILD_MEMBERS);builder.build();} catch (Exception e) {e.printStackTrace();}

當(dāng)我們啟動(dòng)以后我們的機(jī)器人就會(huì)在線,由于我沒(méi)有啟動(dòng)監(jiān)聽(tīng),所以我們的機(jī)器人在離線中的:

package com.odcchina.server.service;import com.odcchina.server.dto.DiscordUserDto;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteCreateEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteDeleteEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleAddEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleRemoveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import javax.annotation.Nonnull;public class GuildEvent extends ListenerAdapter {@Overridepublic void onGuildInviteCreate(@Nonnull GuildInviteCreateEvent event) {//一個(gè)邀請(qǐng)被創(chuàng)建了}@Overridepublic void onGuildInviteDelete(@Nonnull GuildInviteDeleteEvent event) {//一個(gè)邀請(qǐng)被刪除了}@Overridepublic void onGuildMemberJoin(@Nonnull GuildMemberJoinEvent event) {//有新成員進(jìn)入公會(huì)Guild guild = event.getGuild();User user = event.getUser();DiscordUserDto discordUserDto = new DiscordUserDto();discordUserDto.setGuildId(guild.getId());discordUserDto.setGuildName(guild.getName());discordUserDto.setUserId(user.getId());discordUserDto.setUserName(user.getName());}@Overridepublic void onGuildLeave(@Nonnull GuildLeaveEvent event) {//有老成員離開(kāi)公會(huì)}@Overridepublic void onGuildMemberRemove(@Nonnull GuildMemberRemoveEvent event) {//有成員被移除公會(huì)}@Overridepublic void onGuildMemberRoleAdd(@Nonnull GuildMemberRoleAddEvent event) {//公會(huì)成員添加角色}@Overridepublic void onGuildMemberRoleRemove(@Nonnull GuildMemberRoleRemoveEvent event) {//公會(huì)成員移除角色}
}

機(jī)器人其他功能調(diào)用,比如查詢邀請(qǐng)信息,查詢邀請(qǐng)我的頻道會(huì)員

https://discord.com/api/v9/channels/工會(huì)ID/invites

關(guān)于其他機(jī)器人功能實(shí)現(xiàn)可以參考下面的文檔,大佬寫(xiě)的很詳細(xì),點(diǎn)這里?

http://www.risenshineclean.com/news/5783.html

相關(guān)文章:

  • 長(zhǎng)春二道網(wǎng)站建設(shè)百度明星搜索量排行榜
  • 響應(yīng)式網(wǎng)站wordpress攝影家居seo整站優(yōu)化方案
  • 網(wǎng)站開(kāi)發(fā)量計(jì)算百度一下你就知道移動(dòng)官網(wǎng)
  • 如何做商業(yè)推廣網(wǎng)站提高關(guān)鍵詞排名的軟文案例
  • 網(wǎng)站站點(diǎn)文件夾權(quán)限設(shè)置青島網(wǎng)站關(guān)鍵詞優(yōu)化公司
  • 中國(guó)做網(wǎng)站推廣哪家好武漢外包seo公司
  • 浦東新區(qū)消息今天淘寶seo什么意思
  • 網(wǎng)站怎么做三級(jí)的游戲優(yōu)化大師
  • 建行網(wǎng)站登錄不了荊門網(wǎng)絡(luò)推廣
  • 深圳網(wǎng)站制作必選祥奔科技域名訪問(wèn)網(wǎng)站怎么進(jìn)入
  • 長(zhǎng)沙理財(cái)網(wǎng)站建設(shè)魔方優(yōu)化大師官網(wǎng)
  • 網(wǎng)站做推廣頁(yè)需要什么軟件注冊(cè)公司
  • 在putty上怎樣安裝wordpress刷關(guān)鍵詞優(yōu)化排名
  • 如何給網(wǎng)站做301重定向搜索引擎有哪幾個(gè)網(wǎng)站
  • 一個(gè)公司做兩個(gè)網(wǎng)站的好處seo上海培訓(xùn)
  • 自助建站系統(tǒng)源碼下載大慶網(wǎng)絡(luò)推廣
  • 錦州做網(wǎng)站廣州做網(wǎng)站的公司哪家好
  • 獨(dú)立網(wǎng)站優(yōu)化廣告寧波seo網(wǎng)絡(luò)推廣渠道介紹
  • 統(tǒng)一社會(huì)信用代碼查詢廈門網(wǎng)站seo哪家好
  • 做網(wǎng)站怎么兼職網(wǎng)絡(luò)公司網(wǎng)絡(luò)營(yíng)銷推廣方案
  • 青浦區(qū)網(wǎng)站建設(shè)費(fèi)用企業(yè)營(yíng)銷策略
  • 網(wǎng)站建設(shè)技術(shù)交流免費(fèi)發(fā)外鏈
  • 做外鏈的網(wǎng)站如何推廣app
  • 百度的網(wǎng)站關(guān)鍵詞被篡改友情鏈接交易平臺(tái)
  • wap網(wǎng)站的開(kāi)發(fā)域名ip查詢查網(wǎng)址
  • 網(wǎng)站空間選擇企查查在線查詢
  • 做外貿(mào)網(wǎng)站推廣什么比較好以下屬于網(wǎng)站seo的內(nèi)容是
  • 營(yíng)銷型網(wǎng)站的建設(shè)要求都有什么影響東莞寮步最新通知
  • 網(wǎng)站建站費(fèi)用多少手機(jī)百度app下載
  • 給彩票網(wǎng)站做代理違法嗎百度站長(zhǎng)工具是什么意思