Discord OAuth2授权以及机器人监听群事件
下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。
创建应用
点击 此页面添加应用,,创建完成以后会生成应用名称,公钥,客户id等等,这些我们可以保存下来。这些应用会自动和我们的工会关联的。
创建机器人
在下面页面创建一个机器人,机器人会会生成自己的token,这个一定要保存好,注意机器人安全。
配置OAuth2
页面创建我们的OAuth2,重定向URL需要配置前端页面的URL,因为获取用户token需要重定向到前端页面,这个地方我们自定义配置即可,授权我们可以访问用户的一些功能权限。
将机器人加入我们的工会
创建工会(服务器)直接在discord聊天页面创建就好了,这个就不多说了,那么我们如何将我们的机器人拉入到我们的服务器呢?
选择OAuth2,选择bot,勾选机器人的工会权限,然后下面会生成一个链接。
打开链接会出现下图内容,我们将我们的机器人加入到我们自己的服务器即可。
我们通过上面的步骤成功的创建了我们的应用、工会和机器人,下面我们将介绍如何使用OAuth2相关功能以及操作机器人。
OAuth2功能实现
<!-- 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>
根据配置的OAuth2页面生成相关的链接,用户点击授权以后回调到前端页面,页面会带有code以及state参数,code我们用来换取token,state授权页面我们传什么参数过去会给我们带回来的一个参数,授权类似与下面的地址。
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
根据token交互用户数据
拿到token以后我们可以查询用户的信息,用户工会情况等等。
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服务")
@Transactional(isolation = Isolation.READ_COMMITTED)
public class DiscordController extends BaseComponent {@Autowiredprivate DiscordService discordService;/*** 授权回调code* @param code* @return*/@GetMapping("getDiscordByCode")@ApiOperation("获取discord的Code")public Map<String, String> getTuiteCode(String code) {Map<String, String> map = new HashMap<>();//根据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("查询我的工会列表")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("查询用户是否存在工会里面")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. 将参数设置到entity对象中entity = new UrlEncodedFormEntity(paramPairs, "UTF-8");// 5. 将entity对象设置到httppost对象中httpPost.setEntity(entity);// 6. 发送请求并回去响应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. 关闭连接,释放资源try {client.close();} catch (Exception e) {e.printStackTrace();}}return null;}/*** 根据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);// 创建URL对象DiscordDto discordDto = this.doPostForm("https://discord.com/api/oauth2/token",formData);return discordDto;} catch (Exception e) {throw new RuntimeException(e);}}/*** 获取用户的所有服务器* @param token* @return*/public List<DiscordlaborUnionDto> findLaborUnionList(String token) {try {// 设置请求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;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体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 {// 设置请求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;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体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 {// 设置请求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;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体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 {/*** 访问令牌*/private String accessToken;/*** 刷新令牌*/private String refreshToken;/*** 认证方式 Bearer*/private String tokenType;/*** 过期时间 (秒)*/private Integer expiresIn;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;/*** 获取工会列表*/
@Data
@Accessors(chain = true)
public class DiscordlaborUnionDto {/*** 工会ID*/public String id;/*** 工会名称*/public String name;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class DiscordUserDto {/*** 服务器ID*/private String guildId;/*** 服务器名称*/private String guildName;/*** 用户ID*/private String userId;/*** 用户名称*/private String userName;}
package com.odcchina.server.config;/*** Discord相关配置*/
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";
}
使用机器人监听工会会员变动情况
工会会员新加入,退出等情况监听,前期我们需要开启下面这些功能,不然机器人无法监听:
@GetMapping("botMonitor")@ApiOperation("开启机器人监听服务")public Map<String, String> botMonitor() {//启动机器人,监听成员事件try {//这里是机器人的token的,注意下String botToken = "1111.Gh00hD.1111";JDABuilder builder = JDABuilder.createDefault(botToken);//添加事件监听器builder.addEventListeners(new GuildEvent());//builder.useSharding(int shardId, int shardTotal)//工会成员 GUILD_MEMBERS TODO 这个地方在机器人里面有个选项需要开启,不然无法调用builder.enableIntents(GatewayIntent.GUILD_MEMBERS);builder.build();} catch (Exception e) {e.printStackTrace();}
当我们启动以后我们的机器人就会在线,由于我没有启动监听,所以我们的机器人在离线中的:
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) {//一个邀请被创建了}@Overridepublic void onGuildInviteDelete(@Nonnull GuildInviteDeleteEvent event) {//一个邀请被删除了}@Overridepublic void onGuildMemberJoin(@Nonnull GuildMemberJoinEvent event) {//有新成员进入公会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) {//有老成员离开公会}@Overridepublic void onGuildMemberRemove(@Nonnull GuildMemberRemoveEvent event) {//有成员被移除公会}@Overridepublic void onGuildMemberRoleAdd(@Nonnull GuildMemberRoleAddEvent event) {//公会成员添加角色}@Overridepublic void onGuildMemberRoleRemove(@Nonnull GuildMemberRoleRemoveEvent event) {//公会成员移除角色}
}
机器人其他功能调用,比如查询邀请信息,查询邀请我的频道会员
https://discord.com/api/v9/channels/工会ID/invites
关于其他机器人功能实现可以参考下面的文档,大佬写的很详细,点这里
相关文章:

Discord OAuth2授权以及机器人监听群事件
下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。 创建应用 点击 此页面添加应用,ÿ…...
微信小程序返回上一页刷新组件数据
在父页面的onShow和onHide里面添加一个标志 onShow() {this.setData({show:true})},onHide() {this.setData({show:false})}, 把这个值传给子组件 <importantList slot"importantConcern" flag"{{barSelect}}" flag2"{{show}}" /> 在子组…...

Aging Cell:匈牙利学者发现肠道微生物组的变化和衰老密切相关
基于DNA甲基化衰老时钟的开发可以准确用来测量生物年龄,生物年龄在很大程度上受生活方式、环境和遗传等因素的影响,大量证据也表明健康生活方式可以延缓衰老并延长寿命。 先前大规模微生物组分析表明,随着年龄的增长,微生物组菌群…...
837. 连通块中点的数量(acwing)
文章目录 837. 连通块中点的数量题目描述维护size的并查集 837. 连通块中点的数量 题目描述 给定一个包含 n 个点(编号为 1~n)的无向图,初始时图中没有边。 现在要进行 m 个操作,操作共有三种: C a b&a…...

【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98
故障现象,MAME启动后,游戏都没有识别 添加日志输出,重新启动wine #!/bin/bashexport WINEPREFIX$(pwd)/.wine export WINESERVER$(pwd)/bin/wineserver export WINELOADER$(pwd)/bin/wine export WINEDEBUG"file,mame,warn,err"…...

pytorch安装记录
pytorch安装记录 1 安装anconda2 安装pycharm3 安装显卡驱动4 根据显卡驱动版本下载CUDA5 cudnn安装6 根据CUDA版本安装pytorch7 pytorch卸载 1 安装anconda 下载地址: https://www.anaconda.com/download#downloads 验证是否安装成功:打开cmd, 输入 conda 验证环…...
不依赖第三方平台,用Dart语言实现 ios 消息推送
仅仅给大家提供代码,还搞不定的欢迎咨询。 void _sendIosPushNotification(BleMessage message, String deviceToken, {bool debugMode = false}) async {final Map<String, dynamic> header = {"alg": "ES256", "kid": GloabelConfigu…...

TEASEL: A transformer-based speech-prefixed language model
文章目录 TEASEL:一种基于Transformer的语音前缀语言模型文章信息研究目的研究内容研究方法1.总体框图2.BERT-style Language Models(基准模型)3.Speech Module3.1Speech Temporal Encoder3.2Lightweight Attentive Aggregation (LAA) 4.训练…...

机器学习之分类回归模型(决策数、随机森林)
回归分析 回归分析属于监督学习方法的一种,主要用于预测连续型目标变量,可以预测、计算趋势以及确定变量之间的关系等。 Regession Evaluation Metrics 以下是一些最流行的回归评估指标: 平均绝对误差(MAE):目标变量的预测值与实际值之间的平均绝对差…...
算法二刷day3
203.移除链表元素 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode *dummyHead new ListNode(0);dummyHead->next head;ListNode *cur dummyHead;while (cur->next ! nullptr) {if (cur->next->val val) {ListNode *tm…...

面具安装LSP模块时提示 Unzip error错误的解决办法
面具(Magisk Delta)安装LSP模块时提示 Unzip error错误的解决办法 如果前面的配置都正常的话,可能是LSP版本有问题重新去Github下载一个最新版的吧;我是这么解决的。 我安装1.91那个版本的LSP就是死活安装不上,下载了1.92的版本一次就…...

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作
好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…...

软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习
文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…...
cnpm install报错:报错Error: certificate has expired ,淘宝镜像证书过期了解决办法
方案1: 不校验证书 cnpm install --insecure; 方案2: 替换镜像源,比如换成华为的 cnpm confg set registry https://mirrors.huaweicloud.com/repository/npm/ 方案3: 使用http作为镜像源 cnpm confg set registry http://re…...

生成式 AI:使用 Pytorch 通过 GAN 生成合成数据
导 读 生成对抗网络(GAN)因其生成图像的能力而变得非常受欢迎,而语言模型(例如 ChatGPT)在各个领域的使用也越来越多。这些 GAN 模型可以说是人工智能/机器学习目前主流的原因; 因为它向每个人࿰…...

C#/WPF 清理任务栏托盘图标缓存
在我们开发Windows客户端程序时,往往会出现程序退出后,任务还保留之前程序的缓存图标。每打开关闭一次程序,图标会一直增加,导致托盘存放大量缓存图标。为了解决这个问题,我们可以通过下面的程序清理任务栏托盘图标缓存…...

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM科研管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…...

C# OpenCvSharp 图片批量改名
目录 效果 项目 代码 下载 C# OpenCvSharp 图片批量改名 效果 项目 代码 using NLog; using OpenCvSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_Demo { publi…...

大数据开发-Hive介绍以及安装配置
文章目录 数据库和数据仓库的区别Hive安装配置Hive使用方式Hive日志配置 数据库和数据仓库的区别 数据库:传统的关系型数据库主要应用在基本的事务处理,比如交易,支持增删改查数据仓库:主要做一些复杂的分析操作,侧重…...

指针篇章-(4)+qsort函数的模拟
学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...