<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>青漫手记</title><description>点滴生活，随手记录</description><link>https://16c.top/</link><language>zh_CN</language><item><title>reader 适用于 AI 的 Web 阅读器</title><link>https://16c.top/blog/2026/web-reader/</link><guid isPermaLink="true">https://16c.top/blog/2026/web-reader/</guid><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;reader&lt;/code&gt; 是一个开源的 Web 阅读器，适合自建后配合 AI 使用。这里记录一下最简单的 Docker Compose 部署方式。&lt;/p&gt;
&lt;h2&gt;Docker Compose&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.9&apos;

services:
  reader:
    image: ghcr.io/intergalacticalvariable/reader:latest
    container_name: reader-container
    ports:
      - &quot;8019:3000&quot;
    volumes:
      - ./local-storage:/app/local-storage
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启动方式&lt;/h2&gt;
&lt;p&gt;在当前目录保存为 &lt;code&gt;docker-compose.yml&lt;/code&gt; 后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动完成后，浏览器访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://服务器IP:8019
// 请求后会返回原始网页内容的markdown格式内容
http://服务器IP:8019/https://www.baidu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;8019:3000&lt;/code&gt;：将容器内的 &lt;code&gt;3000&lt;/code&gt; 端口映射到宿主机的 &lt;code&gt;8019&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./local-storage:/app/local-storage&lt;/code&gt;：将数据持久化到本地目录，方便升级和备份&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restart: unless-stopped&lt;/code&gt;：容器异常退出后会自动重启&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开源地址&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;intergalacticalvariable/reader&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Astro添加Artalk评论组件</title><link>https://16c.top/blog/2025/AstroAddArtalk/</link><guid isPermaLink="true">https://16c.top/blog/2025/AstroAddArtalk/</guid><description>最近博客改版成了Astro，找到了Artalk评论系统，记录一下接入过程。</description><pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装Artalk评论组件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pnpm add artalk
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;添加Artalk配置文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import type {
	ExpressiveCodeConfig,
	LicenseConfig,
	ArtalkConfig,
	NavBarConfig,
	ProfileConfig,
	SiteConfig,
} from &quot;./types/config&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;};

// 自己根据内容定义ArtalkConfig类
export const arTalkConfig: ArtalkConfig = {
	enable: true,
	site: &quot;青漫手记&quot;,
	url: &quot;https://talk.16c.top&quot;,
};

export const expressiveCodeConfig: ExpressiveCodeConfig = {
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建Artalk评论组件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
import &apos;artalk/Artalk.css&apos;
---

&amp;lt;div id=&quot;artalk&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
  import Artalk from &apos;artalk&apos;
  import { arTalkConfig } from &quot;../../config&quot;;

  let artalk;
  let observer;

  // console.log(&quot;加载评论系统&quot;)
  try{
    initArtalk();
  }catch(e){
    console.log(&quot;加载评论功能失败&quot;)
  }

  function bindThemeObserver() {
    if (observer) observer.disconnect();

    observer = new MutationObserver(() =&amp;gt; {
      if (!artalk) return;
      const isDark = document.documentElement.classList.contains(&apos;dark&apos;);
      artalk.setDarkMode(isDark);
    });

    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: [&apos;class&apos;],
    });
  }

  function initArtalk() {
    // console.log(&quot;初始化评论&quot;)
    const el = document.getElementById(&quot;artalk&quot;);
    if (!el) return;

    if (artalk) {
      artalk.destroy();
      artalk = null;
    }

    artalk = Artalk.init({
      el,
      pageKey: location.pathname,
      pageTitle: document.title,
      server: arTalkConfig.url,
      site: arTalkConfig.site,
      darkMode: false, // 初始值无所谓，后面 observer 会立刻更新
    });

    // 开启主题监听
    bindThemeObserver();

    // 初始化时同步一次
    const isDark = document.documentElement.classList.contains(&apos;dark&apos;);
    artalk.setDarkMode(isDark);
  }

  // -----------------------
  // 页面加载 &amp;amp; 导航事件
  // -----------------------
  const initEvents = [&apos;DOMContentLoaded&apos;, &apos;astro:after-swap&apos;, &apos;pjax:complete&apos;, &apos;swup:contentReplaced&apos;]
  for (const e of initEvents) {
    document.addEventListener(e, () =&amp;gt; {
      // console.log(`触发事件: ${e}`, document.location.pathname)
      if(document.location.pathname != &apos;/&apos; &amp;amp;&amp;amp; document.location.pathname != &apos;/index.html&apos;){
        initArtalk()
      }
    })
  }

  window.addEventListener(&quot;beforeunload&quot;, () =&amp;gt; {
    if (artalk) artalk.destroy();
    if (observer) observer.disconnect();
  });
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用Artalk评论组件&lt;/h2&gt;
&lt;h3&gt;导入组件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import License from &quot;@components/misc/License.astro&quot;;
import Markdown from &quot;@components/misc/Markdown.astro&quot;;
import Artalk from &quot;@components/misc/Artalk.astro&quot;;
import I18nKey from &quot;@i18n/i18nKey&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;导入配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import { Icon } from &quot;astro-icon/components&quot;;
import { licenseConfig, arTalkConfig } from &quot;src/config&quot;;
import ImageWrapper from &quot;../components/misc/ImageWrapper.astro&quot;;
import PostMetadata from &quot;../components/PostMeta.astro&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用组件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;            {licenseConfig.enable &amp;amp;&amp;amp; &amp;lt;License title={entry.data.title} slug={entry.slug} pubDate={entry.data.published} class=&quot;mb-6 rounded-xl license-container onload-animation&quot;&amp;gt;&amp;lt;/License&amp;gt;}
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;!-- 评论区 --&amp;gt;
    {arTalkConfig.enable &amp;amp;&amp;amp; &amp;lt;div class=&quot;flex w-full rounded-[var(--radius-large)] overflow-hidden relative mb-4&quot;&amp;gt;
        &amp;lt;div id=&quot;post-container&quot; class:list={[&quot;card-base z-10 px-6 md:px-9 pt-6 pb-4 relative w-full &quot;,
            {}
        ]}&amp;gt;
            &amp;lt;Artalk class=&quot;mb-6 rounded-xl license-container onload-animation&quot;&amp;gt;&amp;lt;/Artalk&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;}
    &amp;lt;div class=&quot;flex flex-col md:flex-row justify-between mb-4 gap-4 overflow-hidden w-full&quot;&amp;gt;
        &amp;lt;a href={entry.data.nextSlug ? getPostUrlBySlug(entry.data.nextSlug) : &quot;#&quot;}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ALLinSSL 雨云 SSL 插件</title><link>https://16c.top/blog/2025/rainyunssl/</link><guid isPermaLink="true">https://16c.top/blog/2025/rainyunssl/</guid><description>最近发现雨云可以部署docker云应用，价格也便宜，就把很多网站迁移到雨云上了，然后雨云有API接口，但是没有Allinssl的SSL插件，就有了此文。</description><pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近发现雨云可以部署docker云应用，价格也便宜，就把很多网站迁移到雨云上了，然后雨云有API接口，但是没有Allinssl的SSL插件，就有了此文。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::url{url=&quot;https://www.rainyun.com/RegUser_&quot; title=&quot;点击前往雨云&quot;}&lt;/p&gt;
&lt;h2&gt;ALLinSSL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;开源免费的 SSL 证书自动化管理平台&lt;/li&gt;
&lt;li&gt;一键自动化申请、续期、部署、监控所有 SSL/TLS 证书，支持跨云环境和多 CA (coding~)，告别繁琐配置和高昂费用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;雨云 SSL 插件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一个由 AI 编写的 &lt;code&gt;ALLinSSL&lt;/code&gt; 插件，用于把 &lt;code&gt;ALLinSSL&lt;/code&gt; 自动化申请的 SSL 证书的上传或替换到 &lt;code&gt;Rainyun&lt;/code&gt; 平台中。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;功能概述&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;证书上传&lt;/strong&gt;：将申请到的证书通过API上传至 Rainyun 平台。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书替换&lt;/strong&gt;：支持无缝替换已存在的 SSL 证书，无需手动操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;适用于需要在 &lt;code&gt;Rainyun&lt;/code&gt; 平台管理 SSL 证书的管理员简化证书更新流程，降低人工繁琐操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装与配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;下载插件&lt;/strong&gt;：将插件解压到 &lt;code&gt;allinssl&lt;/code&gt; 运行目录的 &lt;code&gt;/plugins/&lt;/code&gt; 文件夹中。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;editConf.png&quot; alt=&quot;添加授权API&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;添加授权API&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置 API 密钥&lt;/strong&gt;：在 Rainyun 平台获取 API 密钥，并填写到配置文件中。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;auto.png&quot; alt=&quot;设置自动化&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;设置自动化&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置自动化&lt;/strong&gt;：设置自动化任务，插件将自动完成证书申请和上传。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;开源&amp;amp;下载&lt;/h2&gt;
&lt;p&gt;::cnb{repo=&quot;16c.top/allinssl-rainyun&quot;}&lt;/p&gt;
</content:encoded></item><item><title>QuestDB自动备份方案</title><link>https://16c.top/blog/2025/07/31/questdb-auto-backup/</link><guid isPermaLink="true">https://16c.top/blog/2025/07/31/questdb-auto-backup/</guid><description>网上的教程很少，好不容易找到一个还是需要安装pgsql的，太折腾了，既然9000端口的web可以执行命令，那应该就可以直接调用questdb的web api去执行备份命令，比安装pgsql的方案方便。</description><pubDate>Thu, 31 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;网上的教程很少，好不容易找到一个还是需要安装pgsql的，太折腾了，既然9000端口的web可以执行命令，那应该就可以直接调用questdb的web api去执行备份命令，比安装pgsql的方案方便。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;修改配置文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;路径：&lt;code&gt;questdb程序目录&lt;/code&gt;\bin\qdbroot\conf\server.conf
修改后记得&lt;code&gt;重启&lt;/code&gt;questdb服务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# output root directory for backups
cairo.sql.backup.root=D:\\BackUPQuestdb

# date format for backup directory
cairo.sql.backup.dir.datetime.format=yyyy-MM-dd

# name of temp directory used during backup
cairo.sql.backup.dir.tmp.name=tmp

# permission used when creating backup directories
cairo.sql.backup.mkdir.mode=509
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;测试备份命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;BACKUP TABLE 表名1, 表名2;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./run.png&quot; alt=&quot;执行备份命令&quot; title=&quot;执行备份命令&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;执行后可以看到有对应的备份文件夹，如果执行多次就是年月日.1、年月日.2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./runok.png&quot; alt=&quot;执行备份命令&quot; title=&quot;执行备份命令&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;自动备份配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-16&quot;?&amp;gt;
&amp;lt;Task version=&quot;1.2&quot; xmlns=&quot;http://schemas.microsoft.com/windows/2004/02/mit/task&quot;&amp;gt;
  &amp;lt;RegistrationInfo&amp;gt;
    &amp;lt;Date&amp;gt;2025-07-22T16:40:31.4762726&amp;lt;/Date&amp;gt;
    &amp;lt;Author&amp;gt;DESKTOP-EGTT6MR\admin&amp;lt;/Author&amp;gt;
    &amp;lt;URI&amp;gt;\MES\定时备份Questdb&amp;lt;/URI&amp;gt;
  &amp;lt;/RegistrationInfo&amp;gt;
  &amp;lt;Triggers&amp;gt;
    &amp;lt;CalendarTrigger&amp;gt;
      &amp;lt;StartBoundary&amp;gt;2025-07-22T17:15:00&amp;lt;/StartBoundary&amp;gt;
      &amp;lt;Enabled&amp;gt;true&amp;lt;/Enabled&amp;gt;
      &amp;lt;ScheduleByDay&amp;gt;
        &amp;lt;DaysInterval&amp;gt;1&amp;lt;/DaysInterval&amp;gt;
      &amp;lt;/ScheduleByDay&amp;gt;
    &amp;lt;/CalendarTrigger&amp;gt;
  &amp;lt;/Triggers&amp;gt;
  &amp;lt;Principals&amp;gt;
    &amp;lt;Principal id=&quot;Author&quot;&amp;gt;
      &amp;lt;UserId&amp;gt;S-1-5-21-3828290859-3366777425-2908561605-1001&amp;lt;/UserId&amp;gt;
      &amp;lt;LogonType&amp;gt;Password&amp;lt;/LogonType&amp;gt;
      &amp;lt;RunLevel&amp;gt;LeastPrivilege&amp;lt;/RunLevel&amp;gt;
    &amp;lt;/Principal&amp;gt;
  &amp;lt;/Principals&amp;gt;
  &amp;lt;Settings&amp;gt;
    &amp;lt;MultipleInstancesPolicy&amp;gt;IgnoreNew&amp;lt;/MultipleInstancesPolicy&amp;gt;
    &amp;lt;DisallowStartIfOnBatteries&amp;gt;true&amp;lt;/DisallowStartIfOnBatteries&amp;gt;
    &amp;lt;StopIfGoingOnBatteries&amp;gt;true&amp;lt;/StopIfGoingOnBatteries&amp;gt;
    &amp;lt;AllowHardTerminate&amp;gt;true&amp;lt;/AllowHardTerminate&amp;gt;
    &amp;lt;StartWhenAvailable&amp;gt;false&amp;lt;/StartWhenAvailable&amp;gt;
    &amp;lt;RunOnlyIfNetworkAvailable&amp;gt;false&amp;lt;/RunOnlyIfNetworkAvailable&amp;gt;
    &amp;lt;IdleSettings&amp;gt;
      &amp;lt;StopOnIdleEnd&amp;gt;true&amp;lt;/StopOnIdleEnd&amp;gt;
      &amp;lt;RestartOnIdle&amp;gt;false&amp;lt;/RestartOnIdle&amp;gt;
    &amp;lt;/IdleSettings&amp;gt;
    &amp;lt;AllowStartOnDemand&amp;gt;true&amp;lt;/AllowStartOnDemand&amp;gt;
    &amp;lt;Enabled&amp;gt;true&amp;lt;/Enabled&amp;gt;
    &amp;lt;Hidden&amp;gt;false&amp;lt;/Hidden&amp;gt;
    &amp;lt;RunOnlyIfIdle&amp;gt;false&amp;lt;/RunOnlyIfIdle&amp;gt;
    &amp;lt;WakeToRun&amp;gt;false&amp;lt;/WakeToRun&amp;gt;
    &amp;lt;ExecutionTimeLimit&amp;gt;PT72H&amp;lt;/ExecutionTimeLimit&amp;gt;
    &amp;lt;Priority&amp;gt;7&amp;lt;/Priority&amp;gt;
  &amp;lt;/Settings&amp;gt;
  &amp;lt;Actions Context=&quot;Author&quot;&amp;gt;
    &amp;lt;Exec&amp;gt;
      &amp;lt;Command&amp;gt;powershell&amp;lt;/Command&amp;gt;
      &amp;lt;Arguments&amp;gt;-noprofile -executionpolicy bypass -file &quot;E:\Program Files (x86)\questdb\questdb-backup.ps1&quot;&amp;lt;/Arguments&amp;gt;
      &amp;lt;WorkingDirectory&amp;gt;E:\Program Files (x86)\questdb&amp;lt;/WorkingDirectory&amp;gt;
    &amp;lt;/Exec&amp;gt;
  &amp;lt;/Actions&amp;gt;
&amp;lt;/Task&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;保存这个xml文件：&lt;code&gt;定时备份Questdb.xml&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./001.png&quot; alt=&quot;导入任务计划程序&quot; title=&quot;导入任务计划程序&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./002.png&quot; alt=&quot;修改执行用户身份&quot; title=&quot;修改执行用户身份&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chcp 936 *&amp;gt;$null
# ====================== 参数区 ======================
$BACKUP_ROOT    = &quot;D:\BackUPQuestdb&quot; # 备份路径与server.conf相同
$RETENTION_DAYS = 7 # 只保留近7天的备份文件
$DbHost         = &quot;localhost&quot;
$HTTP_PORT      = 9000
$LOG_FILE       = Join-Path $BACKUP_ROOT (&quot;backup_{0:yyyyMMdd}.log&quot; -f (Get-Date))
# ====================================================

function Write-Log([string]$msg){
    $msg = &quot;$(Get-Date -Format &apos;yyyy-MM-dd HH:mm:ss&apos;)  $msg&quot;
    Write-Host $msg
    Add-Content -Path $LOG_FILE -Value $msg
}

# 1. 建立/确认目录
if (-not (Test-Path $BACKUP_ROOT)) {
    New-Item -Path $BACKUP_ROOT -ItemType Directory -Force | Out-Null
}

Write-Log &quot;===== 备份脚本开始 =====&quot;

# 2. 删除过期目录
Get-ChildItem -Path $BACKUP_ROOT -Directory |
    Where-Object {
        $_.Name -match &apos;^\d{4}-\d{1,2}-\d{1,2}(?:\..+)?$&apos; -and
        [DateTime]($_.Name -replace &apos;^(\d{4}-\d{1,2}-\d{1,2}).*$&apos;, &apos;$1&apos;) -lt (Get-Date).AddDays(-$RETENTION_DAYS)
    } | ForEach-Object {
        Write-Log &quot;删除目录 - $($_.FullName)&quot;
        Remove-Item $_.FullName -Recurse -Force
    }

# 3. 触发 QuestDB 备份
Write-Log &quot;开始 HTTP 备份请求&quot;

$uri  = &quot;http://${DbHost}:${HTTP_PORT}/exec&quot;
$query = &quot;BACKUP TABLE 表名1, 表名2;&quot; # 改成你的表名

# 使用 WebUtility 做 URL 编码
$encodedQuery = [System.Net.WebUtility]::UrlEncode($query)
$fullUrl = &quot;$uri`?query=$encodedQuery&quot;

try {
    $resp = Invoke-WebRequest -Uri $fullUrl -UseBasicParsing -ErrorAction Stop
    Write-Log &quot;备份请求成功：HTTP $($resp.StatusCode)&quot;
}
catch {
    Write-Log &quot;备份请求失败：$($_.Exception.Message)&quot;
}

# 4. 删除过期日志（*.log）
Get-ChildItem -Path $BACKUP_ROOT -Filter *.log -Recurse -File |
    Where-Object {
        $_.Name -match &apos;^backup_(?&amp;lt;dt&amp;gt;\d{8})\.log$&apos; -and
        ($dt = [DateTime]::ParseExact($Matches[&apos;dt&apos;],&apos;yyyyMMdd&apos;,$null)) -lt (Get-Date).AddDays(-$RETENTION_DAYS)
    } | ForEach-Object {
        Write-Log &quot;删除旧日志 - $($_.FullName)&quot;
        Remove-Item $_.FullName -Force
    }

Write-Log &quot;===== 备份脚本完成 =====&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;保存这个ps1文件：&lt;code&gt;questdb-backup.ps1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./003.png&quot; alt=&quot;设置脚本路径&quot; title=&quot;设置脚本路径&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./004.png&quot; alt=&quot;隐藏执行窗口&quot; title=&quot;隐藏执行窗口&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;手动执行备份测试&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./ok.png&quot; alt=&quot;执行完成&quot; title=&quot;执行完成&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;恢复备份&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;停止questdb后，直接复制备份的文件夹到&lt;code&gt;questdb程序目录&lt;/code&gt;\bin\qdbroot\db&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>QuestDB突然无法写入数据，只能读取</title><link>https://16c.top/blog/2025/07/14/questdb-no-write/</link><guid isPermaLink="true">https://16c.top/blog/2025/07/14/questdb-no-write/</guid><description>记录一次QuestDB突然无法写入数据，只能读取的解决方案</description><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;📌 修改后需重启服务生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;问题根本原因&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;异常断电导致&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;未能正常执行数据库关闭流程&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.lock&lt;/code&gt;文件残留导致自我保护&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WAL机制冲突&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;断电时正在进行的事务未能完整提交&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认配置风险&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;默认&lt;code&gt;async&lt;/code&gt;提交模式在断电时更易出错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;运维建议&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;为服务器配置UPS电源，设置ups没电自动正常关机&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;https://github.com/questdb/questdb/issues/3372&quot; title=&quot;QuestDB 无法写入数据&quot;}&lt;/p&gt;
</content:encoded></item><item><title>SyncMstsc免费远程桌面群控软件</title><link>https://16c.top/blog/2025/03/08/syncmstsc/</link><guid isPermaLink="true">https://16c.top/blog/2025/03/08/syncmstsc/</guid><description>近期，面对大量Windows电脑需要安装软件环境的任务，为了简化逐台安装的繁琐流程，就想着有没有这类软件，发现大多是付费软件就拷打AI用.Net 8写了一个</description><pubDate>Sat, 08 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;近期，面对大量Windows电脑需要安装软件环境的任务，为了简化逐台安装的繁琐流程，就想着有没有这类软件，发现大多是付费软件就拷打AI用.Net 8写了一个。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;SyncMstsc.gif&quot; alt=&quot;效果展示&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;效果展示&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;当前版本功能简介：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;远程管理多个RDP客户端：轻松实现对多台电脑的远程操作。&lt;/li&gt;
&lt;li&gt;同步鼠标操作：一键同步鼠标操作至所有连接的RDP客户端。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;待完善功能：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;键盘同步操作&lt;/strong&gt;：拷打AI失败，始终无法实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;温馨提示：作为初版，软件可能存在不足之处，欢迎各位用户提出宝贵意见。新手开发者努力中，请多多包涵。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;软件架构&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;前端UI框架：&lt;code&gt;AntdUI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;远程桌面库：&lt;code&gt;MsRdpEx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;社区版RDP库：&lt;code&gt;royalapps-community-rdp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;::github{repo=&quot;antdui/AntdUI&quot;}
::github{repo=&quot;Devolutions/MsRdpEx&quot;}
::github{repo=&quot;royalapplications/royalapps-community-rdp&quot;}&lt;/p&gt;
&lt;h2&gt;软件下载与安装&lt;/h2&gt;
&lt;h3&gt;下载链接：&lt;/h3&gt;
&lt;p&gt;::url{url=&quot;https://cloud.my-youth.cn/2025/SyncMstsc&quot; title=&quot;下载SyncMstsc&quot;}&lt;/p&gt;
&lt;h3&gt;安装步骤：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;下载后，解压文件&lt;/li&gt;
&lt;li&gt;运行SyncMstsc.exe&lt;/li&gt;
&lt;li&gt;确保您的系统已安装&lt;code&gt;runtime-desktop-8.0.0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::url{url=&quot;https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-x64-installer&quot; title=&quot;下载runtime-desktop-8.0.0&quot;}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢您的使用，如有任何问题或建议，请随时反馈。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>node-red S7读取String中的中文</title><link>https://16c.top/blog/2024/05/11/node-red-s7-read-string-zh/</link><guid isPermaLink="true">https://16c.top/blog/2024/05/11/node-red-s7-read-string-zh/</guid><description>需要安装Iconv、S7，下面以读取string[32]为例，S7的PLC设置就不演示了。</description><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;需要安装Iconv、S7，下面以读取string[32]为例，S7的PLC设置就不演示了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Node-Red读取PLC的string[32]类型为中文说明&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;首先是在PLC变量表中设置读取的类型为Byte&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./05011.png&quot; alt=&quot;演示图片&quot; title=&quot;演示图片&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;打印当前内容可以看到它输出以下内容：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./print.png&quot; alt=&quot;输出内容&quot; title=&quot;输出内容&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;西门子PLC的第一个byte表示string的实际长度
第二个byte表示string的已用长度
西门子的string不会清除之前写入的字符串只会覆盖然后修改第二个位的已用长度
下面要做的就比较简单了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;10进制转GBK编码&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;在nod-red中安装iconv模块它是一个字符编码转换块&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./installIconv.png&quot; alt=&quot;安装iconv&quot; title=&quot;安装iconv&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;安装后要在&lt;code&gt;C:\Users\xingchuang\.node-red\settings.js&lt;/code&gt;中编辑
找到一个&lt;code&gt;functionGlobalContext&lt;/code&gt;属性并定义&lt;code&gt;iconv: require(&apos;iconv-lite&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./0511dr.png&quot; alt=&quot;导入iconv&quot; title=&quot;导入iconv&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;然后重启node-red才会生效
在前面读取到10进制字符串后，要转为int数组&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./fun0511.png&quot; alt=&quot;转换函数&quot; title=&quot;转换函数&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;最后在适当地方调用即可。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>中兴微随身WIFI后台</title><link>https://16c.top/blog/2023/08/12/ztewechatportablewifiadmin/</link><guid isPermaLink="true">https://16c.top/blog/2023/08/12/ztewechatportablewifiadmin/</guid><description>最近入手了一款随身WIFI棒子，发现可以刷后台和插自己的卡，然后根据此WIFI基于`Pure Admin`和`Element Plus`写了个WIFI后台。</description><pubDate>Sat, 12 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近入手了一款随身WIFI棒子，发现可以刷后台和插自己的卡，然后根据此WIFI基于&lt;code&gt;Pure Admin&lt;/code&gt;和&lt;code&gt;Element Plus&lt;/code&gt;写了个WIFI后台。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;pure-admin/vue-pure-admin&quot;}&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;element-plus/element-plus&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2023-08-12_17h27_36.png&quot; alt=&quot;效果展示&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;效果展示&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;目前支持以下功能&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;1、短信收发
2、WIFI设置
3、APN、VPN设置[不知道能否使用]
4、支持对飞猫物联网卡进行切换运营商[跨域了]
5、支持ADB开关、快速开机设置、时间同步、TR069、DDNS设置
6、在首页支持请求自定义api获取物联网卡相关信息，占用一条短信容量用于保存配置
7、支持流量管理、IP自定义设置、可能的超级密码查询、主题适配暗黑主题、WIFI连接列表查询&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;机型适配&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;使用电脑浏览器打开你的WIFI后台，然后按F12，打开开发者控制台，点击网络，如果请求是如下图那样的格式那就应该没问题，可以使用。&lt;s&gt;亲测不支持186X系列&lt;/s&gt;（需要修改web根目录下serverConfig.json文件的is_r186x字段为true）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./2023-08-14_15h01_25.png&quot; alt=&quot;F12界面&quot; title=&quot;F12界面&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;更新记录&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;V1.0.2
新增电量显示
新增AT指令运行
支持186X系列锁频&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;下载地址&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么刷入就不介绍了，网上教程一大把。
::url{url=&quot;https://cloud.my-youth.cn/2024/WIFIAdmin&quot; title=&quot;点击下载&quot;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;开源&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;Youngolo/wifiadmin&quot;}&lt;/p&gt;
</content:encoded></item><item><title>ESP32 DIY热敏打印机</title><link>https://16c.top/blog/2023/02/23/esp32-diy-da-yin-ji/</link><guid isPermaLink="true">https://16c.top/blog/2023/02/23/esp32-diy-da-yin-ji/</guid><description>分享一个ESP32 DIY热敏打印机小程序，可以打印图片和文字，支持ios连接打印</description><pubDate>Thu, 23 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;硬件pcb是基于嘉立创开源的&lt;code&gt;Mao喵喵机热敏打印机&lt;/code&gt;，由于其喵喵机P1不支持ios(蓝牙协议不支持)，所以自己diy的修改了一下蓝牙程序，使其能够使ios连接打印，并且写了个小程序，由于个人技术有限所以并未实现本地打印(只能打印正方形图形)，打印预览、图片和数据是修改自&lt;code&gt;ESP32-Paperang-Emulator&lt;/code&gt;的Python程序生成的，Arduino程序修改自&lt;code&gt;xljxlj&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::url{url=&quot;https://oshwhub.com/SakuraNeko/mao-re-min-da-yin-ji&quot; title=&quot;Mao喵喵机热敏打印机&quot;}&lt;/p&gt;
&lt;p&gt;::url{url=&quot;https://oshwhub.com/xljxlj&quot; title=&quot;点击前往：xljxlj&quot;}&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;diylxy/ESP32-Paperang-Emulator&quot;}&lt;/p&gt;
&lt;h2&gt;微信小程序&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./wxapp.png&quot; alt=&quot;微信小程序&quot; title=&quot;微信小程序&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;微信小程序&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./wxappqr.jpg&quot; alt=&quot;小程序码&quot; title=&quot;小程序码&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;小程序码&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;Arduino程序&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;https://cloud.my-youth.cn/2024/YoungPrinter_For_Ble.zip&quot; title=&quot;点击下载[Arduino需要自行修改蜂鸣器的部分程序]&quot;}&lt;/p&gt;
</content:encoded></item><item><title>基于paddleocr的配料表识别系统开源</title><link>https://16c.top/blog/2022/12/01/ji-yu-paddleocr-de-pei-liao-biao-shi-bie-xi-tong-kai-yuan/</link><guid isPermaLink="true">https://16c.top/blog/2022/12/01/ji-yu-paddleocr-de-pei-liao-biao-shi-bie-xi-tong-kai-yuan/</guid><description>最近在B站上看到了一个使用ocr识别配料表的项目，由于他的前端是使用的streamlit，我没有接触过这个，所以在复刻的时候改成Flask了</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;最近在B站上看到了一个使用ocr识别配料表的项目，由于他的前端是使用的streamlit，我没有接触过这个，所以在复刻的时候改成Flask了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1Bg411B7C8&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./peiliao.png&quot; alt=&quot;&quot; title=&quot;左图是streamlit，右图是：Flask&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;左图是streamlit，右图是：Flask&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;h2&gt;相关库的安装&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pip3 install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip3 install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install Flask
pip3 install requests
pip3 install opencv-python
pip3 install beautifulsoup4
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Python版本建议&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;个人建议Python在3.6以上，因为我的3.6安装paddleocr，安装了好久多没成功，最后使用3.9一次成功。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;https://cloud.my-youth.cn/2024/%E9%A3%9F%E5%93%81%E9%85%8D%E6%96%99%E8%A1%A8%E8%AF%86%E5%88%AB.zip&quot; title=&quot;食品配料表识别.zip&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Openwrt自动认证哆点(dr.com)校园网</title><link>https://16c.top/blog/2022/09/09/openwrt-zi-dong-ren-zheng-duo-dian-xiao-yuan-wang/</link><guid isPermaLink="true">https://16c.top/blog/2022/09/09/openwrt-zi-dong-ren-zheng-duo-dian-xiao-yuan-wang/</guid><description>入手Openwrt路由器GL-MT300N-V2，记录Openwrt自动认证哆点校园网的过程。</description><pubDate>Fri, 09 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;学校校园网不知道为什么电脑连接路由器wifi登陆过两三分钟会提示小路由代理&lt;strong&gt;强制下线&lt;/strong&gt;电脑直接连接网线登陆校园网就不会提示（不知道是路由器设置问题还是什么情况），然后就入手了一款GL.iNET的GL-MT300N-V2路由器系统是Openwrt的，既然都Openwrt那肯定是要整一些好玩的嘛，本篇文章记录Openwrt自动认证哆点校园网的过程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;需要的软件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Wireshark&lt;/code&gt;
&lt;code&gt;dogcom&lt;/code&gt;
&lt;code&gt;WinSCP&lt;/code&gt;
&lt;code&gt;NxShell&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::url{url=&quot;https://cloud.my-youth.cn/2024/%E6%A0%A1%E5%9B%AD%E7%BD%91&quot; title=&quot;点击下载&quot;}&lt;/p&gt;
&lt;h2&gt;登录信息抓包&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将网线连接电脑&lt;/li&gt;
&lt;li&gt;打开客户端，输入账号和密码&lt;/li&gt;
&lt;li&gt;打开wireshark，点击以太网，点击start&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./wireshark.png&quot; alt=&quot;如果连接的是wifi可以选择wifi&quot; title=&quot;如果连接的是wifi可以选择wifi&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录哆点，版本：5.2.1(D)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./login_and_wc.png&quot; alt=&quot;登陆及登陆成功界面&quot; title=&quot;登陆及登陆成功界面&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;大概十几秒后，点击左上角红色按钮停止&lt;/li&gt;
&lt;li&gt;File-Save As 保存为dr.pcapng&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./save.png&quot; alt=&quot;保存为dr.pcapng&quot; title=&quot;保存为dr.pcapng&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;生成配置文件&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;http://drcoms.github.io/drcom-generic/&quot; title=&quot;打开配置生成网页&quot;}&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;选择对应的哆点版本
&lt;img src=&quot;./jx.png&quot; alt=&quot;选择对应的哆点版本&quot; title=&quot;选择对应的哆点版本&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击OPEN，将之前获得的dr.pcapng上传&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获得新的配置文件，点击SAVE保存配置文件drcom.conf&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用记事本打开配置文件drcom.conf，再对应的password处填入密码并保存&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./jxok.png&quot; alt=&quot;保存并修改密码&quot; title=&quot;保存并修改密码&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Openwrt安装dogcom插件及测试运行&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开winscp软件，文件协议选择SCP，地址输入路由器管理地址，账号，密码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::github{repo=&quot;mchome/openwrt-dogcom&quot;}&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;mchome/dogcom&quot;}&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将dogcom.ipk 和 drcom.conf两个文件上传到/usr/目录下&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./sccg.png&quot; alt=&quot;上传成功&quot; title=&quot;上传成功&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开NxShell，输入地址，账号密码，登录路由器&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;cd /usr/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;opkg install dogcom.ipk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;dogcom -m dhcp -c /usr/drcom.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;出现&amp;lt;&amp;lt;&amp;lt; Logged in &amp;gt;&amp;gt;&amp;gt;就说明认证成功，进行下一步可以先Ctrl+C结束运行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./rzcg.png&quot; alt=&quot;登陆成功&quot; title=&quot;登陆成功&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;设置定时启动和关闭&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;把下载dogcom的使用WinSCP上传到**/etc/init.d**目录下&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./scauto.png&quot; alt=&quot;上传定时任务&quot; title=&quot;上传定时任务&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;系统→计划任务，输入以下内容并保存，crontab表达式可参考&lt;code&gt;crontab&lt;/code&gt;在线生成。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::url{url=&quot;https://tool.lu/crontab/&quot; title=&quot;crontab 在线生成&quot;}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 3 * * 1,2,3,4,7 /etc/init.d/dogcom stop
20 7 * * 1,2,3,4,7 /etc/init.d/dogcom start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上crontab表示每个星期的1、2、3、4、7的3:00自动停止7:20自动启动&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./cron.png&quot; alt=&quot;计划任务&quot; title=&quot;计划任务&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在启动项里面可以设置开机自启及重新启动等操作&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./qdx.png&quot; alt=&quot;系统→启动项&quot; title=&quot;系统→启动项&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>微信网页版API接口详解</title><link>https://16c.top/blog/2022/03/31/wang-ye-wei-xin-api-xiang-jie/</link><guid isPermaLink="true">https://16c.top/blog/2022/03/31/wang-ye-wei-xin-api-xiang-jie/</guid><description>最近写了个安卓手表的微信，它是基于这个网页版微信的API写的，所以花了点时间写了这个文章。</description><pubDate>Thu, 31 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;1、获取uuid&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：用于获取显示二维码以及登录所需的&lt;strong&gt;uuid&lt;/strong&gt;，标识获取二维码和扫码的为同一个用户&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://login.weixin.qq.com/jslogin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
|   appid      |    wx782c26e4c19acffb     |  固定值  |
|   fun      |    new     |  固定值  |
|   lang      |    zh_CN     |  表示中文字符集  |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;window.QRLogin.code = 200; window.QRLogin.uuid = &quot;xxx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注：这里的appid就是在微信开放平台注册的应用的AppID。网页版微信有两个AppID，早期的是&lt;code&gt;wx782c26e4c19acffb&lt;/code&gt;，在微信客户端上显示为应用名称为&lt;code&gt;Web微信&lt;/code&gt;；现在用的是&lt;code&gt;wxeb7ec651dd0aefa9&lt;/code&gt;，显示名称为&lt;code&gt;微信网页版&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2、生成登陆二维码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：展示一张用于登陆的二维码图片，地址里的**{uuid}&lt;strong&gt;传第一步所获取的&lt;/strong&gt;uuid**&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://login.wx.qq.com/qrcode/{uuid}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
|   t      |    webwx     |  固定值(亲测可以留空)  |&lt;/li&gt;
&lt;li&gt;返回：二维码的二进制流，浏览器打开会直接显示一张二维码图片&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3、轮询二维码扫描登录接口&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：尝试登录。若此时用户手机已完成扫码并点击登录，则返回一个真正用于登录的url地址。否则接口大概10s后返回未扫码或未登录的状态码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
|   tip      |    1     |  1：未扫描 0：一扫描  |
|   uuid      |    xxx     |  第一步所获取的uuid  |&lt;/li&gt;
&lt;li&gt;返回：redirect_uri的值可以直接用于下一步的“登录并获取公参”请求&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;window.code=xxx;
xxx:
	408 登陆超时
	201 扫描成功
	200 确认登录
当返回200时，还会有如下内容
window.redirect_uri=&quot;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=xxx&amp;amp;uuid=xxx&amp;amp;lang=xxx&amp;amp;scan=xxx&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4、登录并获取公参&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：访问后可获取一组公参，用于之后访问所有的接口。这也意味着如果这部分数据泄露，代表其他人可以在这段时间内随意操作你的微信（仅限于网页版支持的操作）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |
| ------- | ------- |
| params | &lt;strong&gt;ticket&lt;/strong&gt;: xxx &amp;lt;br&amp;gt; &lt;strong&gt;uuid&lt;/strong&gt;: xxx &amp;lt;br&amp;gt; &lt;strong&gt;lang&lt;/strong&gt;: zh_CN &lt;code&gt;语言&lt;/code&gt; &amp;lt;br&amp;gt; &lt;strong&gt;scan&lt;/strong&gt;: xxx &amp;lt;br&amp;gt; &lt;strong&gt;fun&lt;/strong&gt;: new &lt;code&gt;必填&lt;/code&gt; |&lt;/li&gt;
&lt;li&gt;返回：获取并存储该返回值中的四个参数skey、wxsid、wxuin、pass_ticket，以及所返回Cookie中的webwx_data_ticket，webwx_auth_ticket&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;error&amp;gt;
	&amp;lt;ret&amp;gt;0&amp;lt;/ret&amp;gt;
	&amp;lt;message&amp;gt;OK&amp;lt;/message&amp;gt;
	&amp;lt;skey&amp;gt;xxx&amp;lt;/skey&amp;gt;
	&amp;lt;wxsid&amp;gt;xxx&amp;lt;/wxsid&amp;gt;
	&amp;lt;wxuin&amp;gt;xxx&amp;lt;/wxuin&amp;gt;
	&amp;lt;pass_ticket&amp;gt;xxx&amp;lt;/pass_ticket&amp;gt;
	&amp;lt;isgrayscale&amp;gt;1&amp;lt;/isgrayscale&amp;gt;
&amp;lt;/error&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;skey&lt;/code&gt; &lt;code&gt;wxsid&lt;/code&gt; &lt;code&gt;wxuin&lt;/code&gt; &lt;code&gt;pass_ticket&lt;/code&gt; &lt;code&gt;webwx_data_ticket&lt;/code&gt; &lt;code&gt;webwx_auth_ticket&lt;/code&gt; 保存全局跟本地，下次打开直接使用，不用扫码登陆。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5、微信初始化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：初始化微信首页栏的联系人、公众号等（不是通讯录里的联系人），初始化登录者自己的信息（包括昵称等），初始化同步消息所用的SycnKey&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：POST&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求头&lt;/strong&gt;：ContentType: application/json; charset=UTF-8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
| pass_ticket | qg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D |公参中的值 |&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;post参数&lt;code&gt;json&lt;/code&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    BaseRequest: {
        Uin: 211722515，
        Sid: +urBrYI292xoIknf，
        Skey: @crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4，
        DeviceID: e545297464380306
		//上边的DeviceID是设备id（自行生成跟保存），每次登录过程中保持一致。
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返回&lt;code&gt;json&lt;/code&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
	&quot;BaseResponse&quot;: {
		&quot;Ret&quot;: 0,
		&quot;ErrMsg&quot;: &quot;&quot;
	},
	&quot;Count&quot;: 11,
	&quot;ContactList&quot;: [{//微信首页的联系人，不是保存在通讯录中的联系人
        &quot;Uin&quot;: 0,
        &quot;UserName&quot;: &quot;filehelper&quot;,
        &quot;NickName&quot;: &quot;文件传输助手&quot;,
        &quot;HeadImgUrl&quot;: &quot;/cgi-bin/mmwebwx-bin/webwxgeticon?seq=680769514&amp;amp;username=filehelper&amp;amp;skey=@crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4&quot;,
        &quot;ContactFlag&quot;: 1,
        &quot;MemberCount&quot;: 0,
        &quot;MemberList&quot;: [],
        &quot;RemarkName&quot;: &quot;&quot;,
        &quot;HideInputBarFlag&quot;: 0,
        &quot;Sex&quot;: 0,
        &quot;Signature&quot;: &quot;&quot;,
        &quot;VerifyFlag&quot;: 0,
        &quot;OwnerUin&quot;: 0,
        &quot;PYInitial&quot;: &quot;WJCSZS&quot;,
        &quot;PYQuanPin&quot;: &quot;wenjianchuanshuzhushou&quot;,
        &quot;RemarkPYInitial&quot;: &quot;&quot;,
        &quot;RemarkPYQuanPin&quot;: &quot;&quot;,
        &quot;StarFriend&quot;: 0,
        &quot;AppAccountFlag&quot;: 0,
        &quot;Statues&quot;: 0,
        &quot;AttrStatus&quot;: 0,
        &quot;Province&quot;: &quot;&quot;,
        &quot;City&quot;: &quot;&quot;,
        &quot;Alias&quot;: &quot;&quot;,
        &quot;SnsFlag&quot;: 0,
        &quot;UniFriend&quot;: 0,
        &quot;DisplayName&quot;: &quot;&quot;,
        &quot;ChatRoomId&quot;: 0,
        &quot;KeyWord&quot;: &quot;fil&quot;,
        &quot;EncryChatRoomId&quot;: &quot;&quot;,
        &quot;IsOwner&quot;: 0
    }, 
        //......此处省略剩下的10个联系人信息
    ],
	&quot;SyncKey&quot;: {//同步消息时用的syncKey，用于之后轮询消息的接口
		&quot;Count&quot;: 4,
		&quot;List&quot;: [
			{
				&quot;Key&quot;: 1,
				&quot;Val&quot;: 635705559
			},
			//...此处省略剩下的3条信息
		]
	},
	&quot;User&quot;: {//登录者的信息
		&quot;Uin&quot;: xxx,
		&quot;UserName&quot;: xxx,//微信随机码，每个联系人和群都有，每次登录由微信端随机分配
		&quot;NickName&quot;: xxx,
		&quot;HeadImgUrl&quot;: xxx,
		&quot;RemarkName&quot;: &quot;&quot;,
		&quot;PYInitial&quot;: &quot;&quot;,
		&quot;PYQuanPin&quot;: &quot;&quot;,
		&quot;RemarkPYInitial&quot;: &quot;&quot;,
		&quot;RemarkPYQuanPin&quot;: &quot;&quot;,
		&quot;HideInputBarFlag&quot;: 0,
		&quot;StarFriend&quot;: 0,
		&quot;Sex&quot;: 1,
		&quot;Signature&quot;: &quot;这里是签名&quot;,
		&quot;AppAccountFlag&quot;: 0,
		&quot;VerifyFlag&quot;: 0,
		&quot;ContactFlag&quot;: 0,
		&quot;WebWxPluginSwitch&quot;: 0,
		&quot;HeadImgFlag&quot;: 1,
		&quot;SnsFlag&quot;: 17
	},
	&quot;ChatSet&quot;: xxx,
	&quot;SKey&quot;: xxx,
	&quot;ClientVersion&quot;: 369297683,
	&quot;SystemTime&quot;: 1453124908,
	&quot;GrayScale&quot;: 1,
	&quot;InviteStartCount&quot;: 40,
	&quot;MPSubscribeMsgCount&quot;: 2,
	&quot;MPSubscribeMsgList&quot;: [...],
	&quot;ClickReportInterval&quot;: 600000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6、获取联系人列表&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：获取手机通讯录中的所有联系人（包括人、群、公众号等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：POST&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求头&lt;/strong&gt;：ContentType: application/json; charset=UTF-8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
| pass_ticket | qg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D |公参中的值 |
| skey | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 |公参中的值 |&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;post参数&lt;code&gt;json&lt;/code&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    BaseRequest: {
        Uin: 211722515，
        Sid: +urBrYI292xoIknf，
        Skey: @crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4，
        DeviceID: e545297464380306
		//上边的DeviceID是设备id（自行生成跟保存），每次登录过程中保持一致。
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返回&lt;code&gt;json&lt;/code&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
	&quot;BaseResponse&quot;: {
		&quot;Ret&quot;: 0,
		&quot;ErrMsg&quot;: &quot;&quot;
	},
	&quot;MemberCount&quot;: 334,
	&quot;MemberList&quot;: [
		{
			&quot;Uin&quot;: 0,
			&quot;UserName&quot;: xxx,//微信随机码，潜规则：前面@为联系人，@@为群
			&quot;NickName&quot;: &quot;Urinx&quot;,//联系人的微信昵称
			&quot;HeadImgUrl&quot;: xxx,
			&quot;ContactFlag&quot;: 3,
			&quot;MemberCount&quot;: 0,//如果是群，该字段表示成员数量
			&quot;MemberList&quot;: [],//群成员列表
			&quot;RemarkName&quot;: &quot;&quot;,//备注名称，如果空则说明没有给他备注
			&quot;HideInputBarFlag&quot;: 0,
			&quot;Sex&quot;: 0,//性别，1为男，2为女
			&quot;Signature&quot;: &quot;你好，我们是地球三体组织。在这里，你将感受到不一样的思维模式，以及颠覆常规的世界观。而我们的目标，就是以三体人的智慧，引领人类未来科学技术500年。&quot;,//签名
			&quot;VerifyFlag&quot;: 8,//用来判断是否是公众号或服务号的字段
			&quot;OwnerUin&quot;: 0,
			&quot;PYInitial&quot;: &quot;URINX&quot;,
			&quot;PYQuanPin&quot;: &quot;Urinx&quot;,//名字拼音全拼
			&quot;RemarkPYInitial&quot;: &quot;&quot;,
			&quot;RemarkPYQuanPin&quot;: &quot;&quot;,
			&quot;StarFriend&quot;: 0,
			&quot;AppAccountFlag&quot;: 0,
			&quot;Statues&quot;: 0,
			&quot;AttrStatus&quot;: 0,
			&quot;Province&quot;: &quot;&quot;,//省份
			&quot;City&quot;: &quot;&quot;,//城市
			&quot;Alias&quot;: &quot;Urinxs&quot;,
			&quot;SnsFlag&quot;: 0,
			&quot;UniFriend&quot;: 0,
			&quot;DisplayName&quot;: &quot;&quot;,//如果是群内成员，该字段表示群内名称
			&quot;ChatRoomId&quot;: 0,
			&quot;KeyWord&quot;: &quot;gh_&quot;,
			&quot;EncryChatRoomId&quot;: &quot;&quot;,//如果是群，该字段表示群的id，不同于微信随机码@@那个
			&quot;IsOwner&quot;: 0
		},
		...
	],
	&quot;Seq&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;VerifyFlag&lt;/code&gt; == 0 是联系人，其他自行分析。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7、消息检查&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：同步消息检查。这里只做检查不做同步，如果检查出有新消息，再掉具体同步的接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
| deviceid | e545297464380306 |公参中的值 |
| sid | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 |公参中的值 |
| skey | +FhlgkGS3wD/GKQw |公参中的值 |
| synckey | 1_700722177|2_700724323|3_700724315|1000_1520925834 |微信初始化后获取的4个key，这些key会随着每次获取最新消息（参见9）后的返回值更新，其目的在于每次同步消息后记录一个当前同步的状态。 |
| uin | 211722515 |公参中的值 |
| r | 1648736166 |时间戳 |&lt;/li&gt;
&lt;li&gt;返回：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;window.synccheck={retcode:&quot;xxx&quot;,selector:&quot;xxx&quot;}
retcode:
	0 正常
	-14 ticket错误
	1 传入参数错误
	1100 失败/登出微信
	1101 未检测到登录
	1102 cookie值无效
	1203 当前登录环境异常，为了安全起见请不要在web端进行登录
	1205 操作频繁
selector:
	0 正常
	2 有新消息
	4 有人修改了自己的昵称或你修改了别人的备注
	6 存在删除或者新增的好友信息
	7 进入/离开聊天界面
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8、获取最新消息&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：当同步检查接口显示有新消息时，调用该接口获取具体的新消息。此处的新消息为广义的，包括消息，修改群名，群内成员变化，加好友等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：POST&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求头&lt;/strong&gt;：ContentType: application/json; charset=UTF-8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
| sid | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 |公参中的值 |
| skey | +FhlgkGS3wD/GKQw |公参中的值 |
| pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D |公参中的值 |&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;post参数&lt;code&gt;json&lt;/code&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;BaseRequest&quot;: {
        &quot;Uin&quot;: 211722515,
        &quot;Sid&quot;: &quot;+FhlgkGS3wD/GKQw&quot;,
        &quot;Skey&quot;: &quot;@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050&quot;,
        &quot;DeviceID&quot;: &quot;e304534670317808&quot;
    },
    &quot;SyncKey&quot;: {
        &quot;Count&quot;: 4,
        &quot;List&quot;: [{
            &quot;Key&quot;: 1,
            &quot;Val&quot;: 700722177
        }, {
            &quot;Key&quot;: 2,
            &quot;Val&quot;: 700724323
        }, {
            &quot;Key&quot;: 3,
            &quot;Val&quot;: 700724315
        }, {
            &quot;Key&quot;: 1000,
            &quot;Val&quot;: 1520925834
        }]
    },
     rr: -1648736166//时间戳取反
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返回：主要有AddMsgList，ModContactList，DelContactList，新一轮消息同步的synckey&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;BaseResponse&quot;: {
        &quot;Ret&quot;: 0,
        &quot;ErrMsg&quot;: &quot;&quot;
    },
    &quot;AddMsgCount&quot;: 1, //新增信息
    &quot;AddMsgList&quot;: [{
        &quot;MsgId&quot;: &quot;320984672637990367&quot;, //服务端返回的消息id，可用于撤回接口参数。如果是图片，该参数还可以作为调用微信获取图片接口的参数之一。
        &quot;FromUserName&quot;: &quot;@abf90232027117affa7f0c0df3d1bf20&quot;, //发消息的人
        &quot;ToUserName&quot;: &quot;@abf90232027117affa7f0c0df3d1bf20&quot;, //发给谁
        &quot;MsgType&quot;: 51, //消息类型，1为文字，3为图片，34为语音...，具体请自行测试分析
        &quot;Content&quot;: &quot;&quot;,
        &quot;Status&quot;: 3,
        &quot;ImgStatus&quot;: 1,
        &quot;CreateTime&quot;: 1520927383,
        &quot;VoiceLength&quot;: 0,
        &quot;PlayLength&quot;: 0,
        &quot;FileName&quot;: &quot;&quot;,
        &quot;FileSize&quot;: &quot;&quot;,
        &quot;MediaId&quot;: &quot;&quot;,
        &quot;Url&quot;: &quot;&quot;,
        &quot;AppMsgType&quot;: 0,
        &quot;StatusNotifyCode&quot;: 4,
        &quot;ForwardFlag&quot;: 0,
        &quot;AppInfo&quot;: {
            &quot;AppID&quot;: &quot;&quot;,
            &quot;Type&quot;: 0
        },
        &quot;HasProductId&quot;: 0,
        &quot;Ticket&quot;: &quot;&quot;,
        &quot;ImgHeight&quot;: 0,
        &quot;ImgWidth&quot;: 0,
        &quot;SubMsgType&quot;: 0,
        &quot;NewMsgId&quot;: 320984672637990367,
        &quot;OriContent&quot;: &quot;&quot;,
        &quot;EncryFileName&quot;: &quot;&quot;
    }],
    &quot;ModContactCount&quot;: 0, //联系人修改
    &quot;ModContactList&quot;: [],
    &quot;DelContactCount&quot;: 0, //联系人删除
    &quot;DelContactList&quot;: [],
    &quot;ModChatRoomMemberCount&quot;: 0, //群内成员变动
    &quot;ModChatRoomMemberList&quot;: [],&quot;ContinueFlag&quot;: 0,
    &quot;SyncKey&quot;: { //新一轮消息更新用这些SyncKey
        &quot;Count&quot;: 7,
        &quot;List&quot;: [{
            &quot;Key&quot;: 1,
            &quot;Val&quot;: 700722177
        }, {
            &quot;Key&quot;: 2,
            &quot;Val&quot;: 700724325
        }, {
            &quot;Key&quot;: 3,
            &quot;Val&quot;: 700724315
        }, {
            &quot;Key&quot;: 11,
            &quot;Val&quot;: 700724093
        }, {
            &quot;Key&quot;: 201,
            &quot;Val&quot;: 1520927383
        }, {
            &quot;Key&quot;: 1000,
            &quot;Val&quot;: 1520925834
        }, {
            &quot;Key&quot;: 1001,
            &quot;Val&quot;: 1520917874
        }]
    },
    &quot;SKey&quot;: &quot;&quot;,
    &quot;SyncCheckKey&quot;: { //新一轮消息同步用这些Key
        &quot;Count&quot;: 7,
        &quot;List&quot;: [{
            &quot;Key&quot;: 1,
            &quot;Val&quot;: 700722177
        }, {
            &quot;Key&quot;: 2,
            &quot;Val&quot;: 700724325
        }, {
            &quot;Key&quot;: 3,
            &quot;Val&quot;: 700724315
        }, {
            &quot;Key&quot;: 11,
            &quot;Val&quot;: 700724093
        }, {
            &quot;Key&quot;: 201,
            &quot;Val&quot;: 1520927383
        }, {
            &quot;Key&quot;: 1000,
            &quot;Val&quot;: 1520925834
        }, {
            &quot;Key&quot;: 1001,
            &quot;Val&quot;: 1520917874
        }]
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9、发送消息&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：发送文本消息（包括表情），不能发送图片或文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：POST&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求头&lt;/strong&gt;：ContentType: application/json; charset=UTF-8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
| pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D |公参中的值 |&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;post参数&lt;code&gt;json&lt;/code&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;BaseRequest&quot;: {
        &quot;Uin&quot;: 211722515,
        &quot;Sid&quot;: &quot;+FhlgkGS3wD/GKQw&quot;,
        &quot;Skey&quot;: &quot;@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050&quot;,
        &quot;DeviceID&quot;: &quot;e107694022625701&quot;
    },
    &quot;Msg&quot;: {
        &quot;Type&quot;: 1,
        &quot;Content&quot;: &quot;呵呵&quot;,
        &quot;FromUserName&quot;: &quot;@abf90232027117affa7f0c0df3d1bf20&quot;,
        &quot;ToUserName&quot;: &quot;filehelper&quot;,
        &quot;LocalID&quot;: &quot;15209344559450477&quot;, //时间戳左移4位随后补上4位随机数
        &quot;ClientMsgId&quot;: &quot;15209344559450477&quot;,
		//&quot;MediaId&quot;: &quot;&quot; //如果是图片才传这个值
    },
    &quot;Scene&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返回：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;BaseResponse&quot;: {
        &quot;Ret&quot;: 0,
        &quot;ErrMsg&quot;: &quot;&quot;
    },
    &quot;MsgID&quot;: &quot;7615282929538795099&quot;, //服务端返回的消息id，可用于撤回等接口的参数
    &quot;LocalID&quot;: &quot;15209344559450477&quot; //本地的消息id，是你自己发请求时的参数
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10、获取消息图片&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：调用改接口显示消息里面的图片&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
|   MsgID      |    3176600141007621447     |  服务端返回的消息ID  |
|   type      |    slave     |  略缩图，留空加载原图  |
|   skey      |    @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050     |  公参中的值  |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回：二维码的二进制流，浏览器打开会直接显示一张二维码图片&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;11、获取消息语音&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：调用改接口显示消息里面的语音音频&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求方式&lt;/strong&gt;：GET&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;code&gt;https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetvoice&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;get参数&lt;/strong&gt;：
| 参数 | 示例值 |说明 |
| ------- | ------- |------- |
|   MsgID      |    3176600141007621447     |  服务端返回的消息ID  |
|   skey      |    @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050     |  公参中的值  |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回：二维码的二进制流，浏览器打开会直接播放语音&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>免费验证码识别API开源</title><link>https://16c.top/blog/2022/03/09/yan-zheng-ma-shi-bie-kai-yuan/</link><guid isPermaLink="true">https://16c.top/blog/2022/03/09/yan-zheng-ma-shi-bie-kai-yuan/</guid><description>最近有很多朋友来问我这个验证码识别API是怎么实现的，花了点时间开源到github，并写了这个部署教程。</description><pubDate>Wed, 09 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;最近有很多朋友来问我这个&lt;a href=&quot;/2022/01/24/yan-zheng-ma-shi-bie/&quot;&gt;验证码识别API&lt;/a&gt;是怎么实现的&lt;/li&gt;
&lt;li&gt;为了不一一回复，花了点时间上传到了github，并写了这个部署教程&lt;/li&gt;
&lt;li&gt;使用源码为&amp;lt;a href=&quot;https://www.python.org/&quot; target=&quot;_blank&quot;&amp;gt;Python&amp;lt;/a&amp;gt;，主要用到的库有：&amp;lt;a href=&quot;https://github.com/sml2h3/ddddocr&quot; target=&quot;_blank&quot;&amp;gt;ddddocr&amp;lt;/a&amp;gt;、&amp;lt;a href=&quot;https://github.com/pallets/flask&quot; target=&quot;_blank&quot;&amp;gt;flask&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;::github{repo=&quot;sml2h3/ddddocr&quot;}&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;pallets/flask&quot;}&lt;/p&gt;
&lt;h2&gt;ddddocr安装&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 本地安装
pip install ddddocr -i https://pypi.org/simple
# 腾讯云，云函数安装用这个
pip3 install ddddocr -t ./src
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;腾讯云，云函数部署方法&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;https://console.cloud.tencent.com/scf/list&quot; title=&quot;点击跳转腾讯云，新建云函数&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./new.jpg&quot; alt=&quot;新建Flask模版&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./info.jpg&quot; alt=&quot;默认信息就行&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;右键空白处&lt;/h3&gt;
&lt;p&gt;把main.py里面的内容复制到app.py
替换templates/index.html中的内容，可自己按需修改&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./open.jpg&quot; alt=&quot;点击在集成终端中打开&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安装三方库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pip3 install ddddocr -t ./src
# 注意是否在根目录执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install.jpg&quot; alt=&quot;ddddocr安装中&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./bushu.jpg&quot; alt=&quot;点击部署&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;测试API是否正常&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./test.jpg&quot; alt=&quot;测试结果&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Python源码&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;Youngolo/API_Code&quot;}&lt;/p&gt;
</content:encoded></item><item><title>免费验证码识别API</title><link>https://16c.top/blog/2022/01/24/yan-zheng-ma-shi-bie/</link><guid isPermaLink="true">https://16c.top/blog/2022/01/24/yan-zheng-ma-shi-bie/</guid><description>分享一个免费的验证码识别API，支持base64图片和上传图片两种方式</description><pubDate>Mon, 24 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;API接口&lt;/h3&gt;
&lt;p&gt;&lt;s&gt;aicode.my-youth.cn&lt;/s&gt;
由于腾讯云API函数不再支持此方法部署，所以停用&lt;/p&gt;
&lt;h3&gt;开源部署教程&lt;/h3&gt;
&lt;p&gt;::url{url=&quot;/2022/03/09/yan-zheng-ma-shi-bie-kai-yuan/&quot; title=&quot;点击查看，腾讯云云函数部署教程&quot; mode=&quot;_self&quot;}&lt;/p&gt;
&lt;h3&gt;支持的识别方式&lt;/h3&gt;
&lt;p&gt;①提交base64图片&lt;/p&gt;
&lt;p&gt;可post和get，建议post提交&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名&lt;/th&gt;
&lt;th&gt;变量名&lt;/th&gt;
&lt;th&gt;必填&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;示例值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;请求接口&lt;/td&gt;
&lt;td&gt;base64img&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;域名/base64img&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base64图片&lt;/td&gt;
&lt;td&gt;data&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;data:image/jpeg;base64,....&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;②上传验证码图片识别&lt;/p&gt;
&lt;p&gt;只能post提交&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名&lt;/th&gt;
&lt;th&gt;变量名&lt;/th&gt;
&lt;th&gt;必填&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;示例值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;请求接口&lt;/td&gt;
&lt;td&gt;up_file&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;域名/up_file&lt;/td&gt;
&lt;td&gt;图片上传接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文件&lt;/td&gt;
&lt;td&gt;file&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;image&lt;/td&gt;
&lt;td&gt;code.png&lt;/td&gt;
&lt;td&gt;图片上传字段&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;支持识别的图片格式&lt;/h3&gt;
&lt;p&gt;[&apos;png&apos;, &apos;jpg&apos;, &apos;JPG&apos;, &apos;PNG&apos;, &apos;gif&apos;, &apos;GIF&apos;, &apos;jfif&apos;, &apos;jpeg&apos;]&lt;/p&gt;
&lt;h3&gt;接口返回的错误代码&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;code错误码&lt;/th&gt;
&lt;th&gt;错误内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-3000&lt;/td&gt;
&lt;td&gt;非法请求，参数不正确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-200&lt;/td&gt;
&lt;td&gt;上传图片模式，图片上传失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-201&lt;/td&gt;
&lt;td&gt;上传图片模式，没有上传图片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-202&lt;/td&gt;
&lt;td&gt;上传图片模式，文件格式不支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-300&lt;/td&gt;
&lt;td&gt;base64模式，base64图片转存失败，请检查base64是否正确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-400&lt;/td&gt;
&lt;td&gt;服务器错误，联系管理员处理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-404&lt;/td&gt;
&lt;td&gt;图片识别失败，识别结果为空&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>给你的网页添加一个&quot;手机负一屏&quot;</title><link>https://16c.top/blog/2021/11/02/shou-ji-fu-yi-ping/</link><guid isPermaLink="true">https://16c.top/blog/2021/11/02/shou-ji-fu-yi-ping/</guid><pubDate>Tue, 02 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在网上看到一个有意思的东西就是这个&quot;手机负一屏&quot;，但是这个需要引用js，有未知的安全隐患，比如可以通过引用的js获取cookie。
所以个人花了一下午时间扒了一下css，扒js的时候发现，加密了，如图：
&lt;img src=&quot;./a.png&quot; alt=&quot;js加密图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;重写js&lt;/h2&gt;
&lt;p&gt;所以花了亿点点时间自己写了一个js，基本功能都实现了，音乐播放使用json文件。
&lt;img src=&quot;./b.png&quot; alt=&quot;配置说明图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;引用说明&lt;/h2&gt;
&lt;p&gt;引用下面3行即可，不同系统路径自己调整一下，我就没整到一个文件夹了，（懒~）
&lt;img src=&quot;./d.png&quot; alt=&quot;引用js图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;效果展示&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;c.gif&quot; alt=&quot;效果展示&quot; /&gt;
&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;b style=&quot;color: rgb(82, 95, 127);&quot;&amp;gt;效果展示&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;demo和api申请&lt;/h2&gt;
&lt;p&gt;::url{url=&quot;https://cloud.my-youth.cn/2024/404%E6%89%8B%E6%9C%BA%E8%B4%9F%E4%B8%80%E5%B1%8F.zip&quot; title=&quot;点击下载Demo程序&quot;}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;和风api申请：&amp;lt;a href=&quot;https://dev.qweather.com/&quot; target=&quot;_blank&quot;&amp;gt;dev.qweather.com&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;高德地图key申请：&amp;lt;a href=&quot;https://console.amap.com/dev/index&quot; target=&quot;_blank&quot;&amp;gt;console.amap.com/dev/index&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>