当前位置: 首页 > news >正文

[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录

[Python] 为企业网站应用接入钉钉鉴权,实现钉钉客户端内自动免登授权,浏览器中手动钉钉授权登录两种逻辑。
在这里插入图片描述

操作步骤

  1. 企业内部获得 开发者权限,没有的话先申请。

  2. 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用
    在这里插入图片描述

  3. 打开应用详情页,获取 Client IDClient SecretCorpId 备用,获取方式如下图所示。
    在这里插入图片描述

  4. 编写代码,搭建相应服务(见下方示例代码)


示例代码(以Flask作为后端):

- templates/auth.html
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>auth</title><script src="https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.25/dingtalk.open.js"></script><script>// 检查是否在钉钉环境中function isDingTalk() {return /DingTalk/.test(navigator.userAgent);}if (isDingTalk()) {dd.ready(function () {dd.runtime.permission.requestAuthCode({corpId: "dingxxxxxxxxxx", // 企业idonSuccess: function (info) {console.log(info);location.href = "/demo/oauth_redirect?code=" + info.code + "&url=" + location.href;}});});} else {location.href = "/demo/oauth_redirect?url=" + location.href;}</script>
</head>
<body>
</body>
</html>
  • 需修改:corpId: "dingxxxxxxxxxx" 替换为真实的CorpId
  • 代码逻辑:若在钉钉端内,则借助钉钉免登码完成登录。反之,则跳转钉钉授权页面进行授权登录(授权页面重定向由后端控制,当然直接写在前端也可以)
- app.py
# -*- coding: utf-8 -*-
# Author: 薄荷你玩
import glob
import html
import json
import os
import random
import re
import time
import traceback
from datetime import datetime
from typing import List, Union
from flask import Flask, request, jsonify, Response, render_template, make_response, session
from utils import dingtalk_apiapp = Flask(__name__, static_folder='static')# 设置一个密钥用于加密会话数据
app.secret_key = '123456'@app.after_request
def add_cors_headers(response):response.headers['Access-Control-Allow-Origin'] = '*'  # 允许所有来源的跨域请求response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'  # 允许的 HTTP 方法response.headers['Access-Control-Allow-Headers'] = '*'  # 允许的请求头return response@app.route("/demo")
def demo():if 'user' in session:return render_template('index.html', user=session['user'])# <span style="float: right; display: flex;  align-items: center; gap: 5px;">你好,{{user.name}} <img src="{{user.avatar}}" width="25"/></span>return render_template('auth.html')@app.route("/demo/oauth_redirect")
def demo_oauth_redirect():code = request.args.get("code")url = request.args.get("url")if not code:# 重定向到钉钉授权登录页redirect_uri = url.split("demo")[0] + "demo/oauth-web"client_id = "dingyyyyyyyyyy"  # Client IDreturn app.redirect(f"https://login.dingtalk.com/oauth2/auth?redirect_uri={redirect_uri}&response_type=code&client_id={client_id}&scope=openid&state={url}&prompt=consent")else:user_info = dingtalk_api.x_get_user_info_by_app_code(code)if user_info['success']:session['user'] = user_info['data']return app.redirect(url)else:return user_info["msg"]@app.route("/demo/oauth-web")
def demo_oauth_web():""" 钉钉回调URL,配置到钉钉开发平台 """code = request.args.get("code")state = request.args.get("state")user_info = dingtalk_api.x_get_user_info_by_web_code(code)if user_info['success']:session['user'] = user_info['data']return app.redirect(state)return user_info["msg"]@app.errorhandler(500)
def internal_server_error(error):# 获取完整的 traceback 信息traceback_info = traceback.format_exc()# 返回具体的错误内容和完整的 tracebackresponse = result_map(500, False, str(error), traceback_info)return jsonify(response), 500if __name__ == '__main__':app.run(host="0.0.0.0", port=5000)
  • 需修改:client_id = "dingyyyyyyyyyy" 替换为真实的Client ID
- utils/dingtalk_api.py
# -*- coding: utf-8 -*-
# Author: 薄荷你玩
# Date: 2025/04/07import requestsDINGTALK_DOMAIN = "https://api.dingtalk.com"
CorpId = "dingxxxxxxxxxx"  # 企业ID
ClientId = "dingyyyyyyyyyy"  # Client ID
ClientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  # Client Secretdef user_info(name, avatar, unionid):return {"success": True,"data": {"name": name,"avatar": avatar,"unionid": unionid}}def get_user_token_by_web_code(code):"""获取用户Token--access_token,根据web端钉钉授权code:param code::return:"""url = DINGTALK_DOMAIN + f"/v1.0/oauth2/userAccessToken"headers = {"Content-Type": "application/json"}data = {"clientId": ClientId,"clientSecret": ClientSecret,"code": code,"refreshToken": "","grantType": "authorization_code"}response = requests.post(url, json=data, headers=headers)res = response.json()print(res)return resdef get_user_info_by_access_token(access_token):"""获取用户通讯录个人信息:param access_token::return:"""url = DINGTALK_DOMAIN + f"/v1.0/contact/users/me"headers = {"Content-Type": "application/json","x-acs-dingtalk-access-token": access_token}response = requests.get(url, headers=headers)res = response.json()print(res)return resdef x_get_user_info_by_web_code(code):res = get_user_token_by_web_code(code)if "accessToken" in res.keys():res = get_user_info_by_access_token(res["accessToken"])if "nick" in res.keys():return user_info(name=res['nick'], avatar=res['avatarUrl'], unionid=res['unionId'])return {"success": False, "msg": res}# 钉钉企业内部免登
def get_access_token():url = DINGTALK_DOMAIN + f"/v1.0/oauth2/{CorpId}/token"headers = {"Content-Type": "application/json"}data = {"client_id": ClientId,"client_secret": ClientSecret,"grant_type": "client_credentials"}response = requests.post(url, json=data, headers=headers)res = response.json()print(res)return resdef get_user_id_by_code(access_token, code):"""通过免登码获取用户userid(v2)"""url = f"https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token={access_token}"headers = {"Content-Type": "application/json"}data = {"code": code}response = requests.post(url, json=data, headers=headers)res = response.json()print(res)return resdef get_user_info_by_user_id(access_token, userid):"""通过免登码获取用户userid(v2)"""url = f"https://oapi.dingtalk.com/topapi/v2/user/get?access_token={access_token}"headers = {"Content-Type": "application/json"}data = {"userid": userid}response = requests.post(url, json=data, headers=headers)res = response.json()print(res)return resdef x_get_user_info_by_app_code(code):access_token = get_access_token()['access_token']res = get_user_id_by_code(access_token, code)if "result" in res.keys():user_id = res["result"]["userid"]res = get_user_info_by_user_id(access_token, user_id)if "result" in res.keys():return user_info(name=res['result']['name'], avatar=res['result']['avatar'],unionid=res['result']['unionid'])return {"success": False, "msg": res}if __name__ == '__main__':# res = x_get_user_info_by_app_code("{钉钉端内-免登码}")res = x_get_user_info_by_web_code("{钉钉web授权码}")print(res)
  • 需修改:
    CorpId = "dingxxxxxxxxxx"  # 企业ID
    ClientId = "dingyyyyyyyyyy"  # Client ID
    ClientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  # Client Secret
    
    替换为真实的ID或秘钥

  1. 配置回调域名,如下图所示,填写用户授权后的回调地址(如:http://192.168.2.1:5000/demo/oauth-web),实际使用中换成正式的服务域名。
    在这里插入图片描述
  2. 配置完成后,钉钉内访问 /demo (如:http://192.168.2.1:5000/demo)即可自动登录(获取姓名和头像等信息);浏览器访问会自动跳转钉钉授权登录页面,授权后完成登录。

相关文章:

[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录

[Python] 为企业网站应用接入钉钉鉴权&#xff0c;实现钉钉客户端内自动免登授权&#xff0c;浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限&#xff0c;没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…...

设计模式-单例设计模式

目录 什么是单例设计模式&#xff1f; 为什么要使用单例模式&#xff1f; 资源方面 数据一致方面 系统性能方面 代码维护方面 如何设计单例类&#xff1f; 在说模式之前&#xff0c;我们需要先知道怎么设计才可以让一个类只能有一个实例化对象呢&#xff1f; 饿汉模式…...

Nextjs15 实战 - React Notes CURD 实现

本专栏内容均可在Github&#xff1a;notes_04 找到 完整项目使用技术栈&#xff1a; Nextjs15 MySQL Redis Auth Prisma i18n strapi Docker vercel 一、本节目标 本篇我们来实现右侧笔记CURD部分。 一、效果 当点击 New 按钮的时候进入编辑界面&#xff1a; 当点击…...

【KWDB 创作者计划】架构设计与AIoT场景实践

产品定位与核心价值主张 架构设计与技术实现 分布式架构设计 多模存储引擎实现 云边端协同机制 核心技术创新解析 就地计算技术 自适应时序引擎 混合事务处理 性能优化技术体系 高效存储机制 查询加速策略 资源管理与隔离 行业解决方案与典型应用 工业物联网平台…...

DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析

4月初&#xff0c;DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术&#xff0c;粗浅分析如下&#xff1a; 与LoRA的对比 区别&#xff1a; 应用场景&#xff1a;LoRA是一种参数高效微调方法&#xff0c;主要用于在…...

Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比

一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver&#xff08;如StandardServletMultipartResolver&#xff09;需自行引入commons-fileupload等依赖无&#xff0c;默认不启用文件上传支…...

Linux网络配置与测试

目录 一.与网络配置相关的命令 1.1ifconfig命令 1.1.1作用 1.1.2网络接口的信息 接口信息的组成 1.1.3显示所有网卡包括没有启动的网卡 1.1.4查看指定网络接口 1.1.5开启或关闭网卡 1.1.6设置临时虚拟网卡 1.1.7网络通讯情况 ​编辑 1.1.8临时修改网卡属性 1.2hos…...

游戏赛季和数据处理

问题 游戏从无赛季到赛季机制会涉及哪些问题&#xff1a; 如何改动&#xff0c;增加赛季机制&#xff0c;涉及要修改的代码量最少如何改动&#xff0c;账号、角色部分数据继承问题&#xff0c;涉及要修改的代码量最少账号下角色的永久服共享或是永久服独立&#xff0c;需要做…...

京东店铺托管7*16小时全时护航

内容概要 京东店铺托管服务的*716小时全时护航模式&#xff0c;相当于给商家配了个全年无休的"运营管家"。专业团队每天从早7点到晚11点实时盯着运营数据和商品排名&#xff0c;连半夜流量波动都能通过智能系统秒级预警。这种全天候服务可不是单纯拼人力——系统自动…...

HTTP的Keep-Alive是什么?TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

HTTP的Keep-Alive&#xff1a; HTTP Keep-Alive 是一种机制&#xff0c;允许客户端和服务器在单个 TCP 连接 上发送多个 HTTP 请求 和 响应&#xff0c;而不是每次请求和响应后都关闭连接。它的主要目的是提高性能&#xff0c;减少连接的开销&#xff0c;优化通信效率。 工作…...

使用scoop一键下载jdk和实现版本切换

安装 在 PowerShell 中输入下面内容&#xff0c;保证允许本地脚本的执行&#xff1a; set-executionpolicy remotesigned -scope currentuser然后执行下面的命令安装 Scoop&#xff1a; iwr -useb get.scoop.sh | iex国内用户可以使用镜像源安装&#xff1a;powershell iwr -us…...

PPIO × UI-TARS:用自然语言操控电脑,AI Agent 的极致体验

Manus的爆火预示着AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。字节跳动近期推出的开源项目 UI-TARS Desktop 为我们展示了一种全新的可能性&#xff1a;能够通过自然语言理解和处理来控制计算机界面。这款工具代表了人工智能与人机交互领域的重大突破&#xff0c…...

PG:incorrect prev-link

目录 WAL日志中"incorrect prev-link"错误解决方案错误原因分析解决步骤典型修复案例 WAL日志中"incorrect prev-link"错误解决方案 错误原因分析 WAL日志的prev-link字段用于确保日志记录的连续性。当出现incorrect prev-link 2/754ECB0 at 2/8000028错…...

SQL Server 数据库邮件配置失败:SMTP 连接与权限问题

问题现象&#xff1a; 配置数据库邮件时&#xff0c;发送测试邮件失败&#xff0c;提示 “邮件无法发送到 SMTP 服务器&#xff0c;操作超时”&#xff08;错误 14661&#xff09;或 “服务器拒绝发件人地址”&#xff08;错误 15009&#xff09;。 快速诊断 检查数据库邮件配置…...

深入浅出动态规划:从基础到蓝桥杯实战(Java版)

引言&#xff1a;为什么你需要掌握动态规划&#xff1f; 动态规划&#xff08;DP&#xff09;是算法竞赛和面试中的常客&#xff0c;不仅能大幅提升解题效率&#xff08;时间复杂度通常为O(n)或O(n)&#xff09;[4]&#xff0c;更是解决复杂优化问题的利器。统计显示&#xff…...

获取cookie的chrome插件:Get cookies.txt LOCALLY

接上一篇&#xff0c;在下载视频的时候需要网站的cookie&#xff0c;下面介绍一款可以获取网站cookie的chrome插件 https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?utm_sourceitem-share-cb 备注需要科学上网 【使用方…...

opencv无法设置禁用RGB转换问题

树莓派连接摄像头,摄像头输出格式为YUYV(YUV422)。 通过执行 v4l2-ctl --list-formats --device/dev/video0 可以看的具体的摄像头的数据格式。 使用opencv获取视频流&#xff0c;通过cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置禁用自动转换RGB格式&#xff0c;但是打印输出…...

Ansible:roles角色

文章目录 Roles角色Ansible Roles目录编排Roles各目录作用创建 roleplaybook调用角色调用角色方法1&#xff1a;调用角色方法2&#xff1a;调用角色方法3&#xff1a; roles 中 tags 使用实战案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于层次性、结构化…...

SAP系统采购信息记录失效

问题&#xff1a;采购信息记录失效 现象&#xff1a;最初主数据导入完成之后&#xff0c;单元测试的时采购信息记录是有效的&#xff0c;中间经过配置的变化&#xff0c;集成测试初期发现采购信息记录全部失效。 原因&#xff1a; 单元测试时发现采购订单里面的条件类型…...

JavaWeb 课堂笔记 —— 04 Ajax

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…...

Pandas 库

Pandas 是一个开源的数据分析和数据处理库&#xff0c;它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具&#xff0c;特别适用于处理结构化数据&#xff0c;如表格型数据 Pandas 是数据科学和分析领域中常用的工具之一&#xff0c;它使得用户能够…...

4.8学习总结

完成摆动序列的算法题&#xff08;比较难&#xff0c;想不出方法&#xff09; 学习了HashMap,TreeMap 的源码&#xff08;看完一遍对其理解没有太清楚&#xff0c;还需再多刷几遍理解源码及其底层逻辑的概念&#xff09; 学习了可变参数和Collections工具类...

C语言之九九乘法表

一、代码展示 二、运行结果 三、代码分析 首先->是外层循环是小于等于9的 然后->是内层循环是小于等于外层循环的 最后->就是\n让九九乘法表的格式更加美观(当然 电脑不同 有可能%2d 也有可能%3d) 四、与以下素数题目逻辑相似 五、运行结果...

【Linux操作系统】:信号

Linux操作系统下的信号 一、引言 首先我们可以简单理解一下信号的概念&#xff0c;信号&#xff0c;顾名思义&#xff0c;就是我们操作系统发送给进程的消息。举个简单的例子&#xff0c;我们在写C/C程序的时候&#xff0c;当执行a / 0类似的操作的时候&#xff0c;程序直接就挂…...

skynet.call使用详解

目录 skynet.call 详细解析1. 函数签名与参数2. 内部实现机制3. 会话ID与协程调度4. 超时与错误处理5. 返回值处理6. 协议类型的影响7. skynet.call vs skynet.send8. 示例代码分析9. 最佳实践10. 总结 skynet.call 详细解析 1. 函数签名与参数 函数签名&#xff1a; skynet…...

uniapp 打包 H5 向 打包的APP 使用 @dcloudio/uni-webview-js 传值

1.安装 dcloudio/uni-webview-js npm install dcloudio/uni-webview-js -save 这个模块的 uni. 会与H5的uniapp的 uni. 冲突,所以需要改下名称,一共需要改3处 2.引入并使用 import uniWeb from dcloudio/uni-webview-js;uniWeb.postMessage({data: {action: message,content…...

c语言 文件操作

c语言 文件操作 one 打开/usr/dev.txt文件&#xff0c;在第1行 覆盖写入 "MAC1q23456789" #include <fcntl.h> #include <unistd.h> #include <string.h> int main() { const char *line_1 "MAC1q23456789\n"; // 要写入的内容…...

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标

​功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看…...

Python 序列构成的数组(序列的增量赋值)

序列的增量赋值 增量赋值运算符 和 * 的表现取决于它们的第一个操作对象。简单起 见&#xff0c;我们把讨论集中在增量加法&#xff08;&#xff09;上&#xff0c;但是这些概念对 * 和其他 增量运算符来说都是一样的。 背后的特殊方法是 iadd &#xff08;用于“就地加法”&…...

力扣hot100【链表】

160.相交链表 题目 我的思路&#xff1a;两个链表一长一短&#xff0c;先把长的提前遍历使两个链表的长度相等&#xff0c;然后同时遍历&#xff0c;如果遍历的节点相等时说明相交&#xff0c;否则不相交。 /*** Definition for singly-linked list.* struct ListNode {* …...

PyTorch 生态迎来新成员:SGLang 高效推理引擎解析

SGLang 现已正式融入 PyTorch 生态系统&#xff01;此次集成确保了 SGLang 符合 PyTorch 的技术标准与最佳实践&#xff0c;为开发者提供了一个可靠且社区支持的框架&#xff0c;助力大规模语言模型&#xff08;LLM&#xff09;实现高效且灵活的推理。 如需深入了解 PyTorch…...

C++ Primer Plus 编程练习题 第六章 分支语句和逻辑运算符

1.大小写转换 使用cctype库里的函数进行大小写转换,但要注意使用toupper或tolower时要进行强制类型转换&#xff0c;否则会输出ASCII值 #include <iostream> #include<cctype> using namespace std;int main() {cout << "请输入字符串&#xff08;大…...

一文详解OpenGL环境搭建:Windows使用CLion配置OpenGL开发环境

在计算机图形学的广阔领域中,OpenGL作为行业标准的图形库,为开发者提供了强大的工具集来创建从简单的2D图形到复杂的3D世界。然而,对于初学者和经验丰富的开发者而言,选择一个合适的开发环境是迈向成功的第一步。尤其是在Windows平台上,配置一个既支持现代C++编程实践又能…...

一次奇怪的enq: TX - row lock contention锁问题处理

某天上午客户告知数据库库有锁导致数据库卡死&#xff0c;需排查出问题的原因&#xff0c;从根本上解决问题。 按正常步骤&#xff0c;查询V$SESSION中BLOCKING_SESSION列不为空的&#xff0c;发现没有进程互相阻塞的情况&#xff1b;而查询ACTIVE会话&#xff0c;则有大量进程…...

STL常用容器整理

STL常用容器操作整理 STL常用容器操作整理&#xff08;string/vector/set/map&#xff09;一、string&#xff08;字符串&#xff09;构造函数元素访问修改操作容量操作子串与查找 二、vector&#xff08;动态数组&#xff09;构造函数元素访问修改操作容量操作 三、set&#x…...

深入 PostgreSQL 内部:5 个关键阶段拆解查询处理全流程

引言 当您向 PostgreSQL 发送查询时&#xff0c;后端会经历多个处理阶段。每个阶段承担着不同的职责&#xff0c;以确保您能在最短时间内获得准确响应。虽然这些阶段可能庞大而复杂&#xff0c;但理解它们在查询处理中的角色对 PostgreSQL 开发者至关重要。本文将概述每个查询…...

解析 LILIkoi 光纤力传感器:FBG 原理铸就耐高温抗干扰优势

LILIkoi光纤力传感器通过光纤光栅&#xff08;FBG&#xff09;技术实现高精度力测量。其核心原理基于光纤内光栅栅距的微小变化&#xff0c;用以感知外界施加的力。该传感器在高温、强辐射等恶劣环境中表现出色&#xff0c;能够有效抵抗电磁干扰和温度漂移。凭借卓越的性能&…...

SU-YOLO:基于脉冲神经网络的高效水下目标检测模型解析

论文地址:https://arxiv.org/pdf/2503.24389 目录 一、论文概述 二、创新点解析 1. 基于脉冲的水下图像去噪(SpikeDenoiser) 原理与结构 2. 分离批归一化(SeBN) 原理与结构 3. 优化的残差块(SU-Block) 原理与结构 三、代码复现指南 环境配置 模型训练 四、…...

有关eeprom以及pwm

a0 a1就是对应的 芯片的 写和读 0写 1读 使用操作 主函数读一次 然后信息里一直写入。 用level设置挡位 如 10个格子 设置2 3 这样占空比就有了...

JMeter教程|0到1学会接口性能压测第14课-JMeter接口性能测试全流程讲解

Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 本文以百度搜索接口为例,全流程讲解JMeter接口性能测试。从JMeter下载安装到编写一个…...

系统思考:问题诊断

“做事不怕困难&#xff0c;怕的是不明白困难出在哪里。” —— 亨利福特 最近发现&#xff0c;有些领导者或者团队&#xff0c;常常急于给出解决方案&#xff0c;却忽视了最关键的一步——诊断问题的根源。团队甚至在集体心智模式的影响下&#xff0c;连问题本身都搞错了方向…...

有效压缩 Hyper-v linux Centos 的虚拟磁盘 VHDX

参考&#xff1a; http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml VHDX 有个不好的问题就是&#xff0c;如果在里面存放过文件再删除&#xff0c;那么已经使用过的空间不会压缩&#xff0c;导致空间一直被占用。那么就需要想办法压缩空间。 还有一点&a…...

使用 redis 实现消息队列

方案1: 使用list做消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 2: zset实现消息队列方案 3: 发布/订阅(pub/sub)问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案 4: Stream 实现消息队列问题1: 如何保证消息不丢失问题 2: 重复消费/幂等 方案1: 使用li…...

2025 XYCTF Pwn-wp(含附件)

前言 总体来说Pwn方向题目难度属于中等,属于那种一眼看不出要咋做,但多试试又能做出来的那种,比赛的时候甚至有几只队伍AK了Pwn方向。感觉题目还是很不错的尽管比赛中有一些小意外像是有些题目附件给错了&#xff0c;但是XYCTF的师傅们都是无偿出题纯热爱向大伙分享自己的题目…...

verilog有符号数的乘法

1、单周期乘法器 对于低速要求的乘法器&#xff0c;可以简单的使用 * 实现。 module Mult(input wire [7:0] multiplicand ,input wire [7:0] multipliter ,output wire [7:0] product);assign product multiplicand * multipliter …...

【python3】关于等额本金和等额本息计算

【python3】关于等额本金和等额本息计算 1.背景2.计算3.总结4.推导 1.背景 在贷款买房的宝子们一定有了解等额本金和等额本息&#xff0c;年轻的时候只听销售在那里计算&#xff0c; 您可能听得云里雾里。 等额本金&#xff1a;每个月还的本金固定&#xff0c;利息逐渐减少。…...

git怎么删除远程分支

删除远程分支 引言删除远程分支查看远程分支查看远程分支详情删除远程分支 引言 本文旨在记录一下&#xff0c;git如何通过命令行删除远程分支。 删除远程分支 查看远程分支 使用指令&#xff1a; git branch -r查看远程分支详情 使用指令&#xff1a; git remote show …...

【C++】函数直接返回bool值和返回bool变量差异

函数直接返回bool值和返回bool变量差异 背景 在工作中遇到一个比较诡异的问题&#xff0c;场景是给业务方提供的SDK有一个获取状态的函数GetStatus&#xff0c;函数的返回值类型是bool&#xff0c;在测试过程中发现&#xff0c;SDK返回的是false&#xff0c;但是业务方拿到的…...

蓝桥杯-蓝桥幼儿园(并查集)

并查集的核心思想 并查集主要由两个操作构成&#xff1a; Find&#xff1a;查找某个元素所在集合的根节点。并查集的特点是&#xff0c;每个元素都指向它自己的父节点&#xff0c;根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作&#xff0c;即将路…...

Ensemble of differential evolution variants(EDEV)

差分进化变体的集成1 在这项研究中&#xff0c;一个基于多种群的框架&#xff08;MPF&#xff09;被提议用于多个差分进化变体的集合。与PAP2不同&#xff0c;PAP通过时间预算分配策略和个体移民算子实现算法组合&#xff0c;MPF将整个种群划分为子种群&#xff0c;包括几个指…...