Files

251 lines
85 KiB
HTML
Raw Permalink Normal View History

2026-01-22 17:37:01 +00:00
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-rc.24" />
<style>
:root {
--vp-c-bg: #fff;
}
[data-theme='dark'] {
--vp-c-bg: #1b1b1f;
}
html,
body {
background-color: var(--vp-c-bg);
}
</style>
<script>
const useChoice = localStorage.getItem('vuepress-color-scheme')
const systemStatus =
'matchMedia' in window
? window.matchMedia('(prefers-color-scheme: dark)').matches
: false
if (useChoice === 'light') {
document.documentElement.dataset.theme = 'light'
} else if (useChoice === 'dark' || systemStatus) {
document.documentElement.dataset.theme = 'dark'
}
</script>
<link rel="icon" href="/bilibili-API-collect/logo2.jpg"><title>APP API 签名与鉴权 | BAC Document</title><meta name="description" content="社区开源的第三方哔哩哔哩 API 文档">
<link rel="preload" href="/bilibili-API-collect/assets/style-D1PJH1oj.css" as="style"><link rel="stylesheet" href="/bilibili-API-collect/assets/style-D1PJH1oj.css">
<link rel="modulepreload" href="/bilibili-API-collect/assets/app-Dgsdh8A6.js"><link rel="modulepreload" href="/bilibili-API-collect/assets/APP.html-CuPBHwrB.js">
<link rel="prefetch" href="/bilibili-API-collect/assets/CONTRIBUTING.html-Dg5RrJ0s.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-CyFjrwOB.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-DfGFo93u.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/splash.html-DTxmsPVe.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ver.html-BK7Hl968.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-CRFYL4xy.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-67H6b90D.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-CkX_wc45.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/activity_list.html-Bekn3Lxe.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-DMnsBsuq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-CBuhzqhd.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/recommend_author.html-DBwItBdc.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-C0ql065z.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/articles.html-zLkcz3pu.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/card.html-wL4C5GKc.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/category.html-Xldy-aPs.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-CB0fSHFP.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/view.html-COrufaKB.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-BeujPZDG.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-DvFa4PRS.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/music_list.html-DeijlME4.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/musicstream_url.html-qq6CNfyp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/rank.html-DT2C28KO.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/status_number.html-DEiPXucy.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/follow.html-DOVJW4CZ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BLypTc8g.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/season_index.html-BSNCSXU1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/timeline.html-CzpzQzIG.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videostream_url.html-DlvjAVi_.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/banlist.html-Bx6m-UTQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-BMdR7u31.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/video_room.html-CJ-aNxn7.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BHbw7wWp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videostream_url.html-DnLcd0On.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ip.html-BZmNmhHk.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-D_ydhzqh.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-D36gw51A.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-BN64GETH.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/opus.html-CoQ5EdO3.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/railgun.html-2O05GCD4.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/season.html-B_fCwBA8.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/statistics_data.html-BWH8OqIZ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/upload.html-DvDEkxhj.js" as="script"><link rel="prefetch" href="/bilibili-API-
</head>
<body>
<div id="app"><!--[--><div class="vp-theme-container external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/bilibili-API-collect/"><img class="vp-site-logo" src="/bilibili-API-collect/logo2.jpg" alt="BAC Document"><span class="vp-site-name vp-hide-mobile" aria-hidden="true">BAC Document</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/#🍴目录" aria-label="目录"><!--[--><!--[--><!--]--><!--]-->目录<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/CONTRIBUTING.html" aria-label="贡献指南"><!--[--><!--[--><!--]--><!--]-->贡献指南<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="right arrow"></span></button><ul class="vp-navbar-dropdown" style="display:none;"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&amp;k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&amp;authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&amp;noverify=0&amp;group_code=191187164" aria-label="QQ交流群(综合技术交流)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->QQ交流群(综合技术交流)<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://t.me/bilibili_API_collect_community" aria-label="Telegram交流群(Github Bot推送)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Telegram交流群(Github Bot推送)<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/SocialSisterYi/bilibili-API-collect" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.0
<span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> urllib.parse</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">def</span><span style="color:#DCDCAA;"> appsign</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">appkey</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">appsec</span><span style="color:#D4D4D4;">):</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;为请求参数进行 APP 签名&#39;</span></span>
<span class="line"><span style="color:#D4D4D4;"> params.update({</span><span style="color:#CE9178;">&#39;appkey&#39;</span><span style="color:#D4D4D4;">: appkey})</span></span>
<span class="line"><span style="color:#D4D4D4;"> params = </span><span style="color:#4EC9B0;">dict</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">sorted</span><span style="color:#D4D4D4;">(params.items())) </span><span style="color:#6A9955;"># 按照 key 重排参数</span></span>
<span class="line"><span style="color:#D4D4D4;"> query = urllib.parse.urlencode(params) </span><span style="color:#6A9955;"># 序列化参数</span></span>
<span class="line"><span style="color:#D4D4D4;"> sign = hashlib.md5((query+appsec).encode()).hexdigest() </span><span style="color:#6A9955;"># 计算 api 签名</span></span>
<span class="line"><span style="color:#D4D4D4;"> params.update({</span><span style="color:#CE9178;">&#39;sign&#39;</span><span style="color:#D4D4D4;">:sign})</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> params</span></span>
<span class="line"></span>
<span class="line"><span style="color:#D4D4D4;">appkey = </span><span style="color:#CE9178;">&#39;1d8b6e7d45233436&#39;</span></span>
<span class="line"><span style="color:#D4D4D4;">appsec = </span><span style="color:#CE9178;">&#39;560c52ccd288fed045859ed18bffd973&#39;</span></span>
<span class="line"><span style="color:#D4D4D4;">params = {</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;id&#39;</span><span style="color:#D4D4D4;">:</span><span style="color:#B5CEA8;">114514</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;str&#39;</span><span style="color:#D4D4D4;">:</span><span style="color:#CE9178;">&#39;1919810&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;test&#39;</span><span style="color:#D4D4D4;">:</span><span style="color:#CE9178;">&#39;いいよ,こいよ&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"><span style="color:#D4D4D4;">signed_params = appsign(params, appkey, appsec)</span></span>
<span class="line"><span style="color:#D4D4D4;">query = urllib.parse.urlencode(signed_params)</span></span>
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(signed_params)</span></span>
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(query)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>输出内容分别是进行 APP 签名的后参数的 key-Value 以及 url query 形式</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-"><span class="line"><span>{&#39;appkey&#39;: &#39;1d8b6e7d45233436&#39;, &#39;id&#39;: 114514, &#39;str&#39;: &#39;1919810&#39;, &#39;test&#39;: &#39;いいよ,こいよ&#39;, &#39;sign&#39;: &#39;01479cf20504d865519ac50f33ba3a7d&#39;}</span></span>
<span class="line"><span>appkey=1d8b6e7d45233436&amp;id=114514&amp;str=1919810&amp;test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88&amp;sign=01479cf20504d865519ac50f33ba3a7d</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-java"><span class="line"><span style="color:#569CD6;">package</span><span style="color:#D4D4D4;"> io.github.cctyl;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.nio.charset.StandardCharsets;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.util.HashMap;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.util.Map;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.security.MessageDigest;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.security.NoSuchAlgorithmException;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.net.URLEncoder;</span></span>
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.util.TreeMap;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/**</span></span>
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@author</span><span style="color:#6A9955;"> cctyl</span></span>
<span class="line"><span style="color:#6A9955;"> */</span></span>
<span class="line"><span style="color:#569CD6;">public</span><span style="color:#569CD6;"> class</span><span style="color:#4EC9B0;"> AppSigner</span><span style="color:#D4D4D4;"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;"> private</span><span style="color:#569CD6;"> static</span><span style="color:#569CD6;"> final</span><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> APP_KEY</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">&quot;1d8b6e7d45233436&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#569CD6;"> private</span><span style="color:#569CD6;"> static</span><span style="color:#569CD6;"> final</span><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> APP_SEC</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">&quot;560c52ccd288fed045859ed18bffd973&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> String</span><span style="color:#DCDCAA;"> appSign</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">Map</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">&gt; </span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#6A9955;"> // 为请求参数进行 APP 签名</span></span>
<span class="line"><span style="color:#9CDCFE;"> params</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">put</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;appkey&quot;</span><span style="color:#D4D4D4;">, APP_KEY);</span></span>
<span class="line"><span style="color:#6A9955;"> // 按照 key 重排参数</span></span>
<span class="line"><span style="color:#4EC9B0;"> Map</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">&gt; </span><span style="color:#9CDCFE;">sortedParams</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#4EC9B0;"> TreeMap</span><span style="color:#D4D4D4;">&lt;&gt;(params);</span></span>
<span class="line"><span style="color:#6A9955;"> // 序列化参数</span></span>
<span class="line"><span style="color:#4EC9B0;"> StringBuilder</span><span style="color:#9CDCFE;"> queryBuilder</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> StringBuilder</span><span style="color:#D4D4D4;">();</span></span>
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#D4D4D4;"> (</span><span style="color:#4EC9B0;">Map</span><span style="color:#D4D4D4;">.</span><span style="color:#4EC9B0;">Entry</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">&gt; </span><span style="color:#9CDCFE;">entry</span><span style="color:#C586C0;"> :</span><span style="color:#9CDCFE;"> sortedParams</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">entrySet</span><span style="color:#D4D4D4;">()) {</span></span>
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#D4D4D4;"> (</span><span style="color:#9CDCFE;">queryBuilder</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">length</span><span style="color:#D4D4D4;">() &gt; </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> queryBuilder</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&#39;&amp;&#39;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#D4D4D4;"> queryBuilder</span></span>
<span class="line"><span style="color:#D4D4D4;"> .</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">URLEncoder</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">encode</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">entry</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getKey</span><span style="color:#D4D4D4;">(), </span><span style="color:#9CDCFE;">StandardCharsets</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">UTF_8</span><span style="color:#D4D4D4;">))</span></span>
<span class="line"><span style="color:#D4D4D4;"> .</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&#39;=&#39;</span><span style="color:#D4D4D4;">)</span></span>
<span class="line"><span style="color:#D4D4D4;"> .</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">URLEncoder</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">encode</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">entry</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getValue</span><span style="color:#D4D4D4;">(), </span><span style="color:#9CDCFE;">StandardCharsets</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">UTF_8</span><span style="color:#D4D4D4;">));</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#DCDCAA;"> generateMD5</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">queryBuilder</span><span style="color:#D4D4D4;"> .</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(APP_SEC).</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">());</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;"> private</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> String</span><span style="color:#DCDCAA;"> generateMD5</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#9CDCFE;"> input</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#C586C0;"> try</span><span style="color:#D4D4D4;"> {</span></span>
<span class="line"><span style="color:#4EC9B0;"> MessageDigest</span><span style="color:#9CDCFE;"> md</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">MessageDigest</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getInstance</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;MD5&quot;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#4EC9B0;"> byte</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">digest</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">md</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">digest</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">input</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getBytes</span><span style="color:#D4D4D4;">());</span></span>
<span class="line"><span style="color:#4EC9B0;"> StringBuilder</span><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> StringBuilder</span><span style="color:#D4D4D4;">();</span></span>
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#D4D4D4;"> (</span><span style="color:#4EC9B0;">byte</span><span style="color:#9CDCFE;"> b</span><span style="color:#C586C0;"> :</span><span style="color:#D4D4D4;"> digest) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">String</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">format</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;%02x&quot;</span><span style="color:#D4D4D4;">, b));</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">();</span></span>
<span class="line"><span style="color:#D4D4D4;"> } </span><span style="color:#C586C0;">catch</span><span style="color:#D4D4D4;"> (</span><span style="color:#4EC9B0;">NoSuchAlgorithmException</span><span style="color:#9CDCFE;"> e</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> e</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">printStackTrace</span><span style="color:#D4D4D4;">();</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#569CD6;"> null</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> void</span><span style="color:#DCDCAA;"> main</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">args</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#4EC9B0;"> Map</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">&gt; </span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#4EC9B0;"> HashMap</span><span style="color:#D4D4D4;">&lt;&gt;();</span></span>
<span class="line"><span style="color:#9CDCFE;"> params</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">put</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;id&quot;</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">&quot;114514&quot;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#9CDCFE;"> params</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">put</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;str&quot;</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">&quot;1919810&quot;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#9CDCFE;"> params</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">put</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;test&quot;</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">&quot;いいよ,こいよ&quot;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#9CDCFE;"> System</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">out</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">println</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">appSign</span><span style="color:#D4D4D4;">(params));</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>输出结果为:01479cf20504d865519ac50f33ba3a7d</p><h3 id="typescript-javascript" tabindex="-1"><a class="header-anchor" href="#typescript-javascript"><span>TypeScript/JavaScript</span></a></h3><div class="language-typescript line-numbers-mode" data-highlighter="shiki" data-ext="typescript" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-typescript"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> { </span><span style="color:#9CDCFE;">createHash</span><span style="color:#D4D4D4;"> } </span><span style="color:#C586C0;">from</span><span style="color:#CE9178;"> &#39;node:crypto&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">type</span><span style="color:#4EC9B0;"> Params</span><span style="color:#D4D4D4;"> = </span><span style="color:#4EC9B0;">Record</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">string</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">any</span><span style="color:#D4D4D4;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">const</span><span style="color:#DCDCAA;"> md5</span><span style="color:#D4D4D4;"> = (</span><span style="color:#9CDCFE;">str</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">string</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">=&gt;</span><span style="color:#DCDCAA;"> createHash</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&#39;md5&#39;</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">update</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">str</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">digest</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&#39;hex&#39;</span><span style="color:#D4D4D4;">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/**</span></span>
<span class="line"><span style="color:#6A9955;"> * 为请求参数进行 APP 签名</span></span>
<span class="line"><span style="color:#6A9955;"> */</span></span>
<span class="line"><span style="color:#C586C0;">export</span><span style="color:#569CD6;"> function</span><span style="color:#DCDCAA;"> appSign</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">Params</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">appkey</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">string</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">appsec</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">string</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> params</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">appkey</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">appkey</span></span>
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> searchParams</span><span style="color:#D4D4D4;"> = </span><span style="color:#569CD6;">new</span><span style="color:#DCDCAA;"> URLSearchParams</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">)</span></span>
<span class="line"><span style="color:#9CDCFE;"> searchParams</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">sort</span><span style="color:#D4D4D4;">()</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#DCDCAA;"> md5</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">searchParams</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">() + </span><span style="color:#9CDCFE;">appsec</span><span style="color:#D4D4D4;">)</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#9CDCFE;">console</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">log</span><span style="color:#D4D4D4;">(</span></span>
<span class="line"><span style="color:#DCDCAA;"> appSign</span><span style="color:#D4D4D4;">(</span></span>
<span class="line"><span style="color:#D4D4D4;"> {</span></span>
<span class="line"><span style="color:#9CDCFE;"> id:</span><span style="color:#B5CEA8;"> 114514</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#9CDCFE;"> str:</span><span style="color:#CE9178;"> &#39;1919810&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#9CDCFE;"> test:</span><span style="color:#CE9178;"> &#39;いいよ,こいよ&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#D4D4D4;"> },</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;1d8b6e7d45233436&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;560c52ccd288fed045859ed18bffd973&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#D4D4D4;"> ),</span></span>
<span class="line"><span style="color:#CE9178;"> &#39;01479cf20504d865519ac50f33ba3a7d&#39;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#D4D4D4;">)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>输出结果为:01479cf20504d865519ac50f33ba3a7d</p><h3 id="swift" tabindex="-1"><a class="header-anchor" href="#swift"><span>Swift</span></a></h3><div class="language-swift line-numbers-mode" data-highlighter="shiki" data-ext="swift" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-swift"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#4EC9B0;"> Foundation</span></span>
<span class="line"><span style="color:#C586C0;">import</span><span style="color:#4EC9B0;"> CommonCrypto</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">//Swift标准库没有MD5函数,所以我们要自己实现一个</span></span>
<span class="line"><span style="color:#569CD6;">func</span><span style="color:#DCDCAA;"> MD5</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">string</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">) -&gt; </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;"> {</span></span>
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#D4D4D4;"> length = </span><span style="color:#4EC9B0;">Int</span><span style="color:#D4D4D4;">(CC_MD5_DIGEST_LENGTH)</span></span>
<span class="line"><span style="color:#569CD6;"> var</span><span style="color:#D4D4D4;"> digest = [</span><span style="color:#4EC9B0;">UInt8</span><span style="color:#D4D4D4;">](</span><span style="color:#DCDCAA;">repeating</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">, </span><span style="color:#DCDCAA;">count</span><span style="color:#D4D4D4;">: length)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#569CD6;"> let</span><span style="color:#D4D4D4;"> d = string.</span><span style="color:#DCDCAA;">data</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">using</span><span style="color:#D4D4D4;">: .</span><span style="color:#9CDCFE;">utf8</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> _</span><span style="color:#D4D4D4;"> = d.</span><span style="color:#DCDCAA;">withUnsafeBytes</span><span style="color:#D4D4D4;"> { body -&gt; </span><span style="color:#4EC9B0;">String</span><span style="color:#C586C0;"> in</span></span>
<span class="line"><span style="color:#DCDCAA;"> CC_MD5</span><span style="color:#D4D4D4;">(body.</span><span style="color:#9CDCFE;">baseAddress</span><span style="color:#D4D4D4;">, </span><span style="color:#DCDCAA;">CC_LONG</span><span style="color:#D4D4D4;">(d.</span><span style="color:#9CDCFE;">count</span><span style="color:#D4D4D4;">), &amp;digest)</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#CE9178;"> &quot;&quot;</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> (</span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">..&lt;length).</span><span style="color:#DCDCAA;">reduce</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;&quot;</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#569CD6;"> $0</span><span style="color:#D4D4D4;"> + </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">format</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">&quot;%02x&quot;</span><span style="color:#D4D4D4;">, digest[</span><span style="color:#569CD6;">$1</span><span style="color:#D4D4D4;">])</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">func</span><span style="color:#DCDCAA;"> appSign</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">params</span><span style="color:#D4D4D4;">: [</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">:</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">],</span><span style="color:#DCDCAA;">appKey</span><span style="color:#D4D4D4;">:</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">,</span><span style="color:#DCDCAA;">appSec</span><span style="color:#D4D4D4;">:</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">) -&gt; </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;"> {</span></span>
<span class="line"><span style="color:#569CD6;"> var</span><span style="color:#D4D4D4;"> signedParams = params</span></span>
<span class="line"><span style="color:#D4D4D4;"> signedParams[</span><span style="color:#CE9178;">&quot;appkey&quot;</span><span style="color:#D4D4D4;">] = appKey</span></span>
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#D4D4D4;"> sortedParams = signedParams.</span><span style="color:#DCDCAA;">sorted</span><span style="color:#D4D4D4;"> { </span><span style="color:#569CD6;">$0</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;"> &lt; </span><span style="color:#569CD6;">$1</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;"> }</span></span>
<span class="line"><span style="color:#6A9955;"> //在制作成query时,需要显式addingPercentEncoding转换</span></span>
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#D4D4D4;"> query = sortedParams.</span><span style="color:#DCDCAA;">map</span><span style="color:#D4D4D4;"> { </span><span style="color:#CE9178;">&quot;</span><span style="color:#569CD6;">\($0</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">key</span><span style="color:#569CD6;">)</span><span style="color:#CE9178;">=</span><span style="color:#569CD6;">\($0</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">value</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">addingPercentEncoding</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">withAllowedCharacters</span><span style="color:#D4D4D4;">: .</span><span style="color:#9CDCFE;">urlQueryAllowed</span><span style="color:#D4D4D4;">)!</span><span style="color:#569CD6;">)</span><span style="color:#CE9178;">&quot;</span><span style="color:#D4D4D4;"> }.</span><span style="color:#DCDCAA;">joined</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">separator</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">&quot;&amp;&quot;</span><span style="color:#D4D4D4;">)</span></span>
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#D4D4D4;"> sign = </span><span style="color:#DCDCAA;">MD5</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">string</span><span style="color:#D4D4D4;">: query+appSec)</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> sign</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">//testSign</span></span>
<span class="line"><span style="color:#569CD6;">let</span><span style="color:#D4D4D4;"> appKey = </span><span style="color:#CE9178;">&quot;1d8b6e7d45233436&quot;</span></span>
<span class="line"><span style="color:#569CD6;">let</span><span style="color:#D4D4D4;"> appSec = </span><span style="color:#CE9178;">&quot;560c52ccd288fed045859ed18bffd973&quot;</span></span>
<span class="line"><span style="color:#569CD6;">let</span><span style="color:#D4D4D4;"> signResult = </span><span style="color:#DCDCAA;">appSign</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">params</span><span style="color:#D4D4D4;">: [</span></span>
<span class="line"><span style="color:#CE9178;"> &quot;id&quot;</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">&quot;114514&quot;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#CE9178;"> &quot;str&quot;</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">&quot;1919810&quot;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#CE9178;"> &quot;test&quot;</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">&quot;いいよ,こいよ&quot;</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#D4D4D4;">],</span><span style="color:#DCDCAA;">appKey</span><span style="color:#D4D4D4;">:appKey,</span><span style="color:#DCDCAA;">appSec</span><span style="color:#D4D4D4;">:appSec)</span></span>
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(signResult)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>输出结果为:01479cf20504d865519ac50f33ba3a7d</p><h3 id="cplusplus" tabindex="-1"><a class="header-anchor" href="#cplusplus"><span>CplusPlus</span></a></h3><p>需要 c++ 23 标准库,<a href="https://github.com/libcpr/cpr" target="_blank" rel="noopener noreferrer">cpr</a>、<a href="https://github.com/weidai11/cryptopp" target="_blank" rel="noopener noreferrer">cryptopp</a>、<a href="https://github.com/nlohmann/json" target="_blank" rel="noopener noreferrer">nlohmann/json</a> 等依赖</p><div class="language-c++ line-numbers-mode" data-highlighter="shiki" data-ext="c++" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-c++"><span class="line"><span style="color:#C586C0;">#include</span><span style="color:#CE9178;"> &lt;print&gt;</span><span style="color:#6A9955;"> // std::println</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/// thrid party libraries</span></span>
<span class="line"><span style="color:#C586C0;">#include</span><span style="color:#CE9178;"> &lt;cpr/cpr.h&gt;</span><span style="color:#6A9955;"> // cpr::util::urlEncode()</span></span>
<span class="line"><span style="color:#C586C0;">#include</span><span style="color:#CE9178;"> &lt;cryptopp/md5.h&gt;</span></span>
<span class="line"><span style="color:#C586C0;">#include</span><span style="color:#CE9178;"> &lt;cryptopp/hex.h&gt;</span></span>
<span class="line"><span style="color:#C586C0;">#include</span><span style="color:#CE9178;"> &lt;nlohmann/json.hpp&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/*</span></span>
<span class="line"><span style="color:#6A9955;"> * 注意,假定不会发生错误!</span></span>
<span class="line"><span style="color:#6A9955;"> */</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/* 获取 md5 hex(lower) */</span></span>
<span class="line"><span style="color:#4EC9B0;">std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#DCDCAA;"> Get_md5_hex</span><span style="color:#D4D4D4;">(</span><span style="color:#569CD6;">const</span><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">Input_str</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#4EC9B0;"> CryptoPP</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">Weak1</span><span style="color:#D4D4D4;">::MD5 hash;</span></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::string md5_hex;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#4EC9B0;"> CryptoPP</span><span style="color:#D4D4D4;">::StringSource </span><span style="color:#DCDCAA;">ss</span><span style="color:#D4D4D4;">(Input_str, </span><span style="color:#569CD6;">true</span><span style="color:#D4D4D4;">,</span></span>
<span class="line"><span style="color:#C586C0;"> new</span><span style="color:#4EC9B0;"> CryptoPP</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">HashFilter</span><span style="color:#D4D4D4;">(hash,</span></span>
<span class="line"><span style="color:#C586C0;"> new</span><span style="color:#4EC9B0;"> CryptoPP</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">HexEncoder</span><span style="color:#D4D4D4;">(</span></span>
<span class="line"><span style="color:#C586C0;"> new</span><span style="color:#4EC9B0;"> CryptoPP</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">StringSink</span><span style="color:#D4D4D4;">(md5_hex)</span></span>
<span class="line"><span style="color:#D4D4D4;"> )</span></span>
<span class="line"><span style="color:#D4D4D4;"> )</span></span>
<span class="line"><span style="color:#D4D4D4;"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">ranges</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">for_each</span><span style="color:#D4D4D4;">(md5_hex, [](</span><span style="color:#569CD6;">char</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">x</span><span style="color:#D4D4D4;">) { x = </span><span style="color:#4EC9B0;">std</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">tolower</span><span style="color:#D4D4D4;">(x); });</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> md5_hex;</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;">/* 将 json 转换为 url 编码字符串 */</span></span>
<span class="line"><span style="color:#4EC9B0;">std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#DCDCAA;"> Json_to_url_encode_str</span><span style="color:#D4D4D4;">(</span><span style="color:#569CD6;">const</span><span style="color:#4EC9B0;"> nlohmann</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">json</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">Json</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::string encode_str;</span></span>
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#D4D4D4;"> (</span><span style="color:#569CD6;">const</span><span style="color:#569CD6;"> auto</span><span style="color:#D4D4D4;"> &amp;[key, value]: </span><span style="color:#9CDCFE;">Json</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">items</span><span style="color:#D4D4D4;">()) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> encode_str</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(key).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;=&quot;</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">cpr</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">util</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">urlEncode</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">value</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">is_string</span><span style="color:#D4D4D4;">() ? </span><span style="color:#9CDCFE;">value</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">get</span><span style="color:#D4D4D4;">&lt;</span><span style="color:#4EC9B0;">std</span><span style="color:#D4D4D4;">::string&gt;() : </span><span style="color:#DCDCAA;">to_string</span><span style="color:#D4D4D4;">(value))).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;&amp;&quot;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A9955;"> // remove the last &#39;&amp;&#39;</span></span>
<span class="line"><span style="color:#9CDCFE;"> encode_str</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">resize</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">encode_str</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">size</span><span style="color:#D4D4D4;">() - </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">&#39;</span><span style="color:#D7BA7D;">\0</span><span style="color:#CE9178;">&#39;</span><span style="color:#D4D4D4;">);</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> encode_str;</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#4EC9B0;">std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#DCDCAA;"> App_sign</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">nlohmann</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">json</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">Params</span><span style="color:#D4D4D4;">, </span><span style="color:#569CD6;">const</span><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">App_key</span><span style="color:#D4D4D4;">, </span><span style="color:#569CD6;">const</span><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">string</span><span style="color:#569CD6;"> &amp;</span><span style="color:#9CDCFE;">App_sec</span><span style="color:#D4D4D4;">) {</span></span>
<span class="line"><span style="color:#9CDCFE;"> Params</span><span style="color:#D4D4D4;">[</span><span style="color:#CE9178;">&quot;appkey&quot;</span><span style="color:#D4D4D4;">] = App_key;</span></span>
<span class="line"><span style="color:#9CDCFE;"> Params</span><span style="color:#D4D4D4;">[</span><span style="color:#CE9178;">&quot;sign&quot;</span><span style="color:#D4D4D4;">] = </span><span style="color:#DCDCAA;">Get_md5_hex</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">Json_to_url_encode_str</span><span style="color:#D4D4D4;">(Params) + App_sec);</span></span>
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#DCDCAA;"> Json_to_url_encode_str</span><span style="color:#D4D4D4;">(Params);</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;">int</span><span style="color:#DCDCAA;"> main</span><span style="color:#D4D4D4;">() {</span></span>
<span class="line"><span style="color:#4EC9B0;"> nlohmann</span><span style="color:#D4D4D4;">::json Params;</span></span>
<span class="line"><span style="color:#9CDCFE;"> Params</span><span style="color:#D4D4D4;">[</span><span style="color:#CE9178;">&quot;id&quot;</span><span style="color:#D4D4D4;">] = </span><span style="color:#B5CEA8;">114514</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#9CDCFE;"> Params</span><span style="color:#D4D4D4;">[</span><span style="color:#CE9178;">&quot;str&quot;</span><span style="color:#D4D4D4;">] = </span><span style="color:#CE9178;">&quot;1919810&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#9CDCFE;"> Params</span><span style="color:#D4D4D4;">[</span><span style="color:#CE9178;">&quot;test&quot;</span><span style="color:#D4D4D4;">] = </span><span style="color:#CE9178;">&quot;いいよ,こいよ&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#569CD6;"> constexpr</span><span style="color:#569CD6;"> auto</span><span style="color:#D4D4D4;"> App_key = </span><span style="color:#CE9178;">&quot;1d8b6e7d45233436&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#569CD6;"> constexpr</span><span style="color:#569CD6;"> auto</span><span style="color:#D4D4D4;"> App_sec = </span><span style="color:#CE9178;">&quot;560c52ccd288fed045859ed18bffd973&quot;</span><span style="color:#D4D4D4;">;</span></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::string sign = </span><span style="color:#DCDCAA;">App_sign</span><span style="color:#D4D4D4;">(Params, App_key, App_sec);</span></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">println</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;{}&quot;</span><span style="color:#D4D4D4;">, </span><span style="color:#DCDCAA;">to_string</span><span style="color:#D4D4D4;">(Params));</span></span>
<span class="line"><span style="color:#4EC9B0;"> std</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">println</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">&quot;{}&quot;</span><span style="color:#D4D4D4;">, sign);</span></span>
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-text"><span class="line"><span>{&quot;appkey&quot;:&quot;1d8b6e7d45233436&quot;,&quot;id&quot;:114514,&quot;sign&quot;:&quot;01479cf20504d865519ac50f33ba3a7d&quot;,&quot;str&quot;:&quot;1919810&quot;,&quot;test&quot;:&quot;いいよ,こいよ&quot;}</span></span>
<span class="line"><span>appkey=1d8b6e7d45233436&amp;id=114514&amp;sign=01479cf20504d865519ac50f33ba3a7d&amp;str=1919810&amp;test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div></div><!--[--><!--]--></div><footer class="vp-page-meta"><div class="vp-meta-item edit-link"><a class="auto-link external-link label" href="https://github.com/SocialSisterYi/bilibili-API-collect/edit/master/docs/misc/sign/APP.md" aria-label="在 GitHub 上编辑此页" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><svg class="edit-icon" viewbox="0 0 1024 1024"><g fill="currentColor"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></g></svg><!--]--><!--]-->在 GitHub 上编辑此页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">最近更新: </span><time class="meta-item-info" datetime="2025-04-19T08:44:28.000Z" data-allow-mismatch>2025/4/19 08:44</time></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: 1440239038@qq.com">SocialSisterYi</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 34262992+cctyl@users.noreply.github.com">cctyl</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: catlair@qq.com">LaMerChiang</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 85005672+Lightning-Lion@users.noreply.github.com">Lightning-Lion</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 51024916+YuHuanTin@users.noreply.github.com">YuHuanTin</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 102411014+SessionHu@users.noreply.github.com">SessionHu</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><footer style="text-align:center;"> Copyright © 2020-2025 <a href="https://github.com/SocialSisterYi/">SocialSisterYi</a> | <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE">CC-BY-NC-4.0 Licensed</a></footer><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
<script type="module" src="/bilibili-API-collect/assets/app-Dgsdh8A6.js" defer></script>
</body>
</html>