抖音开放平台第三方代小程序开发,授权事件、消息与事件通知总结

news2025/1/29 14:13:38

大家好,我是小悟

关于抖音开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。

授权事件推送和消息与事件推送类型都以Event的值判断。

授权事件推送通知

在这里插入图片描述
授权事件推送包括:推送票据、授权成功、授权解除、授权码找回。抖音服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。

推送票据:在第三方平台创建审核通过后,抖音服务器会向其“授权事件接收URL” 每隔10分钟以 POST 的方式推送票据。

Event的值为PUSH

{
  "Ticket": "8c0da4968b0d1e28acbc1d738a56607d",
  "FromUserName": "ByteDanceMicroApp",
  "CreateTime": "2019-01-14 12:45:10",
  "MsgType": "Ticket",
  "Event": "PUSH"
}

授权成功:Event的值为AUTHORIZED

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "AUTHORIZED",
  "AuthorizationCode": "授权码",
  "AuthorizationCodeExpiresIn": 3600"AppName": "代创建的小程序名称",
  "AppIcon": "代创建的小程序图标",
  "CompanyName": "代创建的小程序公司主体名称",
  "AppSuperAdminEmail": "代创建的小程序超管掩码邮箱",
  "AppSuperAdminMobile": "代创建的小程序超管掩码手机号"
}

授权解除:Event的值为UNAUTHORIZED

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "UNAUTHORIZED"
}

授权码找回:
Event的值为UPDATE_AUTHORIZED

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "UPDATE_AUTHORIZED",
  "AuthorizationCode": "授权码",
  "AuthorizationCodeExpiresIn": 3600
}

出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。

@PostMapping(value = "authPushMsg")
public void authPushMsg(PostDataModel postData) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
    StringBuffer sb = new StringBuffer();
    String line;
    while ((line = br.readLine()) != null) {
      sb = sb.append(line);
    }
    String postStr = sb.toString();
    logger.warn("授权推送消息---->获得数据为postData={}", postStr);
    PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);
    try {
      logger.warn("授权推送消息,开始");
      ServerVerification serverVerification = new ServerVerification();
      String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
      if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
        MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());
        String decrypt = msgDecrypt.decrypt(postData.getEncrypt());
        logger.warn("授权推送消息,解密结果={}", decrypt);
        if (decrypt.contains("Ticket") && decrypt.contains("PUSH")) {
          logger.warn("推送ticket协议---->开始");
          // 推送ticket通知
          ComponentVerifyTicket componentVerifyTicket = JSON.parseObject(decrypt, ComponentVerifyTicket.class);
          componentVerifyTicket.setComponentVerifyTicket(componentVerifyTicket.getTicket());
          RedisService<ComponentVerifyTicket> redisService = RedisService.load();
          redisService.save(componentVerifyTicket, ComponentVerifyTicket.class);
          logger.warn("推送ticket协议---->成功,保存到缓存中的值为:{}", JSON.toJSONString(componentVerifyTicket));
        } else {
          // 授权成功、授权解除、授权码找回
          AuthPushAuthorized authPushAuthorized = JSON.parseObject(decrypt, AuthPushAuthorized.class);
          String event = authPushAuthorized.getEvent();
          if (StringUtils.equals(EventEnum.AUTHORIZED.getCode(), event)) {
            logger.warn("推送授权成功通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
          } else if (StringUtils.equals(EventEnum.UNAUTHORIZED.getCode(), event)) {
            logger.warn("推送授权解除通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
          } else if (StringUtils.equals(EventEnum.UPDATE_AUTHORIZED.getCode(), event)) {
            logger.warn("推送授权码找回通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
          }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

消息与事件推送通知
在这里插入图片描述
消息与事件推送包括:修改小程序名称、小程序名称重置、修改服务类目、修改小程序简介、修改小程序图标、版本审核结果、短视频挂载能力申请审核结果、抖音直播组件能力申请审核结果、获取用户手机号能力申请审核结果、分享模板审核结果、短视频/直播自主挂载能力审核结果通知、短视频/直播自主挂载能力抖音号绑定结果通知、短视频达人推广挂载能力审核结果通知、直播达人推广挂载能力审核结果通知。审核结果会向消息与事件接收 URL 进行事件推送。

修改小程序名称:
Event的值为MODIFY_APP_NAME

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_NAME",
  "ModifyAppNameResults": {
    "advice": "",
    "reason": "小程序名称格式不符合规范",
    "status": 0
  }
}

小程序名称重置:Event的值为
APP_NAME_RESET_NOTIFICATION

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APP_NAME_RESET_NOTIFICATION",
  "AppNameResetNotification": "您好,您管理的小程序「%s」由于长时间未提交版本审核,名称已经被重置为「名称过期%s」。如需修改,请前往配置页面重新填写名称。"
}

修改服务类目:Event的值为
MODIFY_APP_CATEGORY

{
    "AppId": "授权小程序的appid",
    "TpAppId": "第三方小程序应用appid",
    "EventTime": "2019-01-14 12:45:10",
    "Event": "MODIFY_APP_CATEGORY",
    "ModifyAppCategoryResults": [
        {
            "category": "158,159,259",
            "categoryName": "社交类-社交-直播",
            "status": 1,
            "reason": ""
        }
    ]
}

修改小程序简介:
Event的值为MODIFY_APP_INTRO

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_INTRO",
  "ModifyAppIntroResults": {
    "reason": "小程序简介格式不符合规范",
    "status": 0
  }
}

修改小程序图标:
Event的值为MODIFY_APP_ICON

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_ICON",
  "ModifyAppIconResults": {
    "reason": "小程序名称格式不符合规范",
    "status": 0
  }
}

版本审核结果:Event的值为PACKAGE_AUDIT

{
    "AppId": "授权小程序的appid",
    "TpAppId": "第三方小程序应用appid",
    "EventTime": "2019-01-14 12:45:10",
    "Event": "PACKAGE_AUDIT",
    "AuditResults": [
        {
            "hostName": "toutiao",
            "reason": ["", ""],
            "status": 1,
            "auditDetail": [
                {
                    "reason":"xxx",
                    "modifyGuide": {
                        "name":"xxx",
                        "link":"xxx"
                    },
                    "detailFile":"xxx"
                }
            ]
        }
    ]
}

短视频挂载能力申请审核结果:Event的值为APPLY_VIDEO_CAPABILITY

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_VIDEO_CAPABILITY",
  "ApplyVideoCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

抖音直播组件能力申请审核结果:Event的值为APPLY_LIVE_CAPABILITY

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_LIVE_CAPABILITY",
  "ApplyLiveCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

获取用户手机号能力申请审核结果:Event的值为
APPLY_PHONE_NUMBER_CAPABILITY

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_PHONE_NUMBER_CAPABILITY",
  "ApplyPhoneNumberCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

分享模板审核结果:
Event的值为APPLY_SHARE_TEMPLATE

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_SHARE_TEMPLATE",
  "ApplyShareTemplateResults": {
    "templateId": "xxx",
    "status": 0,
    "reason": "[\"xxx\",\"xxx\"]"
  }
}

短视频/直播自主挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

短视频/直播自主挂载能力抖音号绑定结果通知:
Event的值为SELT_MOUNT_BIND,需要结合
EventContent.capacity_key的值判断

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "SELT_MOUNT_BIND",
  "EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。
    "capacity_key": "能力key",
    "aweme_id": "抖音号",
    "user_name": "抖音用户昵称",
    "bind_status": 1
  }
}

短视频达人推广挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,video_talent_mount-短视频达人推广挂载能力。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

直播达人推广挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断

{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,ma.mount.live_talent_mountt-直播达人推广挂载能力。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。

@PostMapping(value = "eventPushMsg")
public void eventPushMsg(PostDataModel postData) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
    StringBuffer sb = new StringBuffer();
    String line;
    while ((line = br.readLine()) != null) {
      sb = sb.append(line);
    }
    String postStr = sb.toString();
    logger.warn("事件推送消息---->获得数据为postData={}", postStr);
    PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);
    try {
      logger.warn("事件推送消息,开始");
        ServerVerification serverVerification = new ServerVerification();
        String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
        if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
            MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());
            String decrypt = msgDecrypt.decrypt(postData.getEncrypt());
            logger.warn("事件推送消息,解密结果={}", decrypt);
            EventPushMsg eventPushMsg = JSON.parseObject(decrypt, EventPushMsg.class);
            String event = eventPushMsg.getEvent();
            if (StringUtils.equals(EventEnum.MODIFY_APP_NAME.getCode(), event)) {
                logger.warn("修改名称审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_NAME_RESET_NOTIFICATION.getCode(), event)) {
                logger.warn("名称重置通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_INTRO.getCode(), event)) {
                logger.warn("修改简介审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_ICON.getCode(), event)) {
                logger.warn("修改图标审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_CATEGORY.getCode(), event)) {
                logger.warn("修改服务类目审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT.getCode(), event)) {
                logger.warn("版本审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_VIDEO_CAPABILITY.getCode(), event)) {
                logger.warn("「短视频挂载」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_LIVE_CAPABILITY.getCode(), event)) {
                logger.warn("「抖音直播组件」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_PHONE_NUMBER_CAPABILITY.getCode(), event)) {
                logger.warn("「获取用户手机号」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_CAPACITY.getCode(), event)) {
                logger.warn("短视频/直播自主挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
                logger.warn("短视频达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
                logger.warn("直播达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.SELT_MOUNT_BIND.getCode(), event)) {
                logger.warn("短视频/直播自主挂载能力抖音号绑定结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 基础 IO字符流

1.汉字存储占多少字节&#xff1a; public class IoTest {public static void main(String[] args) {String str "abcd";String str1 "吴危险学java";System.out.println("字符串转为byte数组&#xff1a;" Arrays.toString(str.getBytes())…

C# RestoreFormer 图像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

Python Opencv实践 - 车辆统计(1)读取视频,移除背景,做预处理

示例中的图像的腐蚀、膨胀和闭运算等需要根据具体视频进行实验得到最佳效果。代码仅供参考。 import cv2 as cv import numpy as np#读取视频文件 video cv.VideoCapture("../../SampleVideos/Traffic.mp4") FPS 10 DELAY int(1000 / FPS) kernel cv.getStructu…

【Jenkins使用】Jenkins 与 Git

一、概述 Jenkins 与 Git 的结合使用&#xff0c;可以理解为是 Jenkins 的一个强大之处。为什么要这么说&#xff0c;简要说明一下这个工作模式就能理解&#xff1a; 一个软件项目&#xff0c;开发过程中通常都会使用到一些源码管理工具&#xff0c;来达到团队协作的目的。而 …

C++ --STL

STL STL&#xff08;Standard Template Library,标准模板库&#xff09;STL从广义上分为&#xff1a; 容器&#xff08;container&#xff09;算法 (algorithm)迭代器 (iterator) 容器 和 算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用模板类或者模板函数 1、ST…

SystemC入门学习-第8章 测试平台的编写

之前的章节&#xff0c;一直把重点放在用SystemC来描述硬件电路上&#xff0c;即如何编写SystemC 的RTL。本章的注意力集中在验证和编写测试平台上。 重点包括&#xff1a; 如何生成时钟信号和激励波形如何编写有响应能力的测试平台如何记录仿真结果 8.1 编写测试平台 测试平…

【Shell】Shell脚本入门

Shell脚本入门 疑问 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等? 答: 使用linux的内核操作计算机的硬件 Shell介绍 通过编写Shell命令发送给linux内核去执行, 操作就是计算机硬件. 所以Shell命令是用户操作计算机硬件的桥梁, Shell是命令, 类似于windows系统…

Java 抽象类与接口

一、抽象类 1.1 抽象类的声明 可以这样认为&#xff0c;抽象类就是普通类抽象化的结果&#xff0c;它与普通类相比&#xff0c;同样具有属性、方法等&#xff0c;唯一的区别就是抽象类具有抽象的效果&#xff0c;即无法被实例化&#xff08;如果可以被实例化&#xff0c;就失…

源代码漏洞监测【软件代码缺陷性检测】

本文仅供思路参考、交流 一、题目要求 利用树、图、序列等对软件源代码进行代码表征。利用深度学习实现对代码有无漏洞的分类实现检测漏洞类型调研过程 调研了一些论文,发现目前的一些论文,例如FUNDED、SemVulDet、SEVulDet、SySeVR都只能实现二分类,即有无代码漏洞,但是这…

qgis c++二次开发初始化介绍

前言 上篇文章qgis二次开发环境搭建(qgis-3.28.6qt5.15) 的末尾介绍了如何新建一个Qt工程&#xff0c;链接QGIS库并调用Qgis::releaseName()&#xff0c;工程代码在仓库qgis_cpp_api_apps中。 但是要调用更复杂的QGIS函数需要添加一些初始化函数&#xff0c;下边将介绍如何初…

【JUC】JMM

文章目录 1. 概述2. 三大特性2.1 可见性2.2 原子性2.3 有序性 3. 多线程对变量的读写过程4. 先行发生原则(happens-before) 1. 概述 CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存&#xff0c;而内存的读和写操作的时候就会造成不一致的问题 JVM规范中试图定义…

MoeCTF2023web

01http 打开题目环境 可以看到要求完成所有任务&#xff0c;这里用burp抓个包 按照要求修改可以得到flag moectf{basic_http_knowledge_HJbg427uFuznTqiJdtS1xhZNwpdsOnKU} 02 Web入门指北 直接找到结尾发现乱码&#xff0c;去解码 编码可以试试url编码和base64到16 这里用…

RISCV学习(2)玄铁C910处理器体验

笔者有幸参加了平头哥RISCV开发者大赛&#xff0c;体验了一下基于玄铁C910内核的矽速开发板。 1、开发板介绍 LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板。 TH1520 为主控核心&#xff08;4xC9101.85G&#xff0c; RV64GCV&#xff0c;4TOPSi…

毕业图形采集【个人】

毕业图形采集【个人】 前言版权推荐毕业图形采集介绍步骤如何查看个人二维码 最后 前言 2023-10-15 12:09:57 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.ne…

【C++】笔试训练(六)

目录 一、选择题二、编程题1、不要二2、把字符串转换成整数 一、选择题 1、十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A 146 B 148 C 144 D 142 答案&#xff1a;C 2、执行下面语句后的输出为 int I 1; if (I < 0)printf("…

LightGBM-平分卡

文章目录 一、数据集处理二、定义模型训练和画图 三、好人的概率/坏人的概率四、生成报告五、行为评分卡模型表现总结 一、数据集处理 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split f…

【无人机】太阳能伪卫星VoLTE无人机设计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

蓝桥杯(迷宫,C++)

输入&#xff1a; 思路&#xff1a; 1、注意输入用字符串。 2、采用广度搜素的方法来求解。 3、因为最后要求字典序最小且D<L<R<U,所以在遍历四个方向的时候&#xff0c; 先向下&#xff0c;再向左、右&#xff0c;最后向上。 #include<iostream> #include…

“历史性判决:SEC 放弃上诉!灰度赢得比特币ETF转换!“

"这一决定是在一场法律战和数月的预期之后做出的&#xff0c;可能标志着监管格局将转向批准现货比特币ETF。" 据路透社报道&#xff0c;一项重大进展是&#xff0c;美国证券交易委员会 (SEC) 决定不对最近法院支持 Grayscale Investments 比特币 ETF 转换计划的…

Python算法练习 10.15

leetcode 2130 链表的最大孪生和 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪…