微信小程序个人资质审核血泪史:踩坑,从反复被拒到神奇过审

前言

最近搞了个微信小程序,折腾了一个多星期才过审。过程中踩了不少坑,尤其是个人资质这块,简直让人想砸电脑。今天就和大家聊聊我这段经历,希望能给同样在做小程序的个人开发者一点帮助。

问题

1
小程序涉及用户自行生成内容(文字、图片、音/) 的记录、分享,属社交﹣笔记范畴,为个人主体小程序未开放类目。

审核第二次打回

理想很丰满,现实很骨感

我的小程序功能其实挺简单的,就是一个节日头像制作分享类工具。用户可以自己写点文字、拍张照片、使用小程序预制的贴纸装饰后保存头像图片,在小程序里记录下来,也可以分享给朋友看看或者这只为自己的社交头像。我觉得这就是个很普通的工具,没啥复杂的地方。

提交审核的时候我还挺自信的,觉得这种应用肯定能过。结果第二天收到审核反馈,直接傻眼了。

审核意见写的是:“你的小程序涉及用户自行生成内容(文字、图片、音/视频)的记录、分享,属社交-笔记范畴,为个人主体小程序未开放类目,建议申请企业主体小程序。”

继续阅读全文 »

如何实现公众号自动回复或做一个短视频无水印解析机器人?

起因

前几天一个朋友问我,能不能让公众号自动回复用户发的抖音链接,把视频或者图集解析出来。我看了看微信后台的自动回复,只能匹配固定的关键词,搞不定这种动态链接api接口的方式。想了想,干脆自己动手写一个。

考虑到成本,我不想买服务器。Vercel 的免费额度对于这种小场景足够用了,而且域名不用备案,只要自己有域名解析过去就行。整个过程折腾了差不多两天,踩了不少坑,记录下来当个笔记。

整体思路

微信公众号收到用户消息后,会向配置的服务器地址推送一条 XML 格式的请求。我们要做的就是:

  1. 验证消息确实来自微信(验证签名)
  2. 解析用户消息内容,提取其中的抖音分享链接
  3. 调用一个现成的解析接口,拿到视频或图片信息
  4. 按照微信要求的 XML 格式回复给用户

听起来不复杂,但细节很多。

继续阅读全文 »

以后在手机上用 Termux 和 GitHub Actions 更新 Hexo 博客

前言

如果你像我一样,经常在手机上写文章,却苦于无法在手机端运行 hexo generate 和 hexo deploy(耗电且容易出错),那么这篇教程正是为你准备的。我们将利用 Termux 在手机上完成 Git 操作,再借助 GitHub Actions 在云端自动构建和部署博客——你只需要专注写作,剩下的交给云端。

最终效果:在手机上写完文章 → git push → 等待 2~5 分钟 → 博客自动更新。全程无需在手机运行 Hexo 或 Node.js。

继续阅读全文 »

告别原生导航栏:微信小程序自定义导航栏完美适配方案

为什么需要自定义导航栏?

原生小程序导航栏虽然开箱即用,但在实际开发中常常遇到以下痛点:

  • 设计风格受限:无法自由定制背景、字体颜色、高度,难以融入品牌设计
  • 扩展能力弱:无法在导航栏区域增加搜索框、自定义按钮、动态效果等
  • 无法实现沉浸式:标题栏与状态栏分离感强,缺少整体感
  • 屏幕适配难:不同机型(刘海屏、挖孔屏、动态岛)的高度表现不一致

因此,自定义导航栏成为许多商业项目和小程序框架的标配。本文将手把手教你实现一套适配所有主流机型、易扩展、性能优良的自定义导航栏组件。

基础配置:开启自定义模式

在 app.json 中将 navigationStyle 设置为 custom:

1
2
3
4
5
6
7
8

{
"window": {
"navigationStyle": "custom",
"navigationBarTextStyle": "black" // 仅对页面内文本颜色有影响,导航栏已隐藏
}
}

💡 小贴士:也可以单独为某个页面配置,在页面目录的 .json 文件中设置相同字段即可。

配置完成后,小程序所有页面将不再渲染原生导航栏,状态栏区域完全暴露,需要我们自己实现导航UI和内容区域的避让。

继续阅读全文 »

在安卓手机上运行OpenClaw?当然可以,用Termux折腾OpenClaw安装QQ机器人的踩坑记录...

前言

最近想在手机上跑一个 QQ 机器人,选了个看起来挺灵活的框架 OpenClaw。本以为按文档几分钟就能搞定,结果断断续续折腾了一晚上。这里记一下过程,给同样在 Termux 上折腾的人省点时间。

为什么选 OpenClaw

主要看中它支持多平台(QQ、微信、Telegram 等),还能接各种大模型。我想把智谱的免费模型 glm-4.7-flash 接上 QQ,手机上跑着省电。

第一个坑:插件找不到

装完 OpenClaw 后,配置文件里加了 openclaw-qqbot,结果启动报错:

1
plugins.allow: plugin not found: openclaw-qqbot

官方的安装命令跑了一遍,又说找不到 openclaw/dist/plugins-sdk/index_js/core。搜了一下,大概是版本不匹配——OpenClaw 核心和 QQ 插件各说各话。

第二个坑:Node.js 编译失败

升级 Node.js 到 v24 后,npm install -g openclaw@latest 直接挂掉,卡在 tree-sitter-bash 的编译上:

1
gyp: Undefined variable android_ndk_path in binding.gyp

这是 Termux 环境的老毛病了——Android 的 C 库(Bionic)和很多 npm 原生模块不对付。折腾半天无解,决定换路子。

终极方案:Ubuntu 容器

Termux 里有个 proot-distro 可以跑完整 Linux 发行版。既然原生环境不行,就在容器里装。

继续阅读全文 »

个人开发工具之抖音直播录制工具:一款功能强大的Android直播录制应用

前言

在移动互联网时代,直播已经成为一种重要的内容形式。有时我们会希望将喜欢的直播内容保存下来,以便日后回顾或学习。今天为大家介绍一款博主设计并基于uni-app开发的抖音直播录制工具,它不仅支持普通的录制功能,可以进行后台不需要看着直播画面进行录制抖音直播画面,还具备自动检测、后台保活等进阶特性。

配图_应用主界面截图

继续阅读全文 »

UniApp中Canvas绘图的易错点与踩坑指南

在UniApp中使用Canvas绘图时,常常会遇到一些容易忽略的问题和陷阱。本文将总结这些易错点,并提供解决方案,帮助你避免踩坑,提升开发效率。

继续阅读全文 »

QQ频道机器人与UniApp开发:常见踩坑点与解决方案

在开发QQ频道机器人和UniApp应用的过程中,可能会遇到一些常见的错误和坑。本文将总结这些容易出错的地方,并提供解决方案,帮助你更顺利地完成开发。

继续阅读全文 »

UniApp中Canvas绘图不显示的常见问题与解决方案

在UniApp中使用Canvas绘图时,可能会遇到绘图内容不显示的问题。本文将总结这些常见问题的原因,并提供解决方案,帮助你快速定位和解决问题。

继续阅读全文 »

Hexo博客实现随机文章功能的完整教程

想要给博客增加一些趣味性?让读者可以随机浏览你的文章是个不错的选择。本文将详细介绍如何在Hexo博客中实现随机文章功能,就跟本博客的侧栏导航中的【手气】菜单一样的效果。

继续阅读全文 »

QQ频道机器人Android客户端使用指南

QQ频道机器人 Android客户端

一个用于管理和操作QQ频道机器人的Android客户端应用,基于uniapp开发,提供了直观的用户界面和丰富的功能特性。

客户端界面预览

登录频道聊天查看和发送消息

插件功能运行日志和设置

功能特性

1. 账号管理

  • App ID和Token登录
  • 记住登录状态
  • 自动登录选项
  • 沙盒/正式环境切换
  • 多账号管理
  • 账号安全保护

2. 频道管理

  • 频道列表显示
    • 分组展示
    • 在线人数显示
    • 频道类型图标
    • 频道状态标识
  • 未读消息统计
    • 普通消息计数
    • @消息特别标记
    • 按频道分类统计
  • 频道权限管理
    • 自动识别管理员权限
    • 权限值实时计算
    • 权限检查功能

3. 消息功能

安卓版QQ频道机器人APP客户端插件开发指南

本文档将指导您如何为QQ频道机器人客户端开发插件。

插件结构

每个插件都是一个标准的 JavaScript 文件,需要导出一个包含以下字段的对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 插件对象
const plugin = {
// 基本信息(必需)
id: 'plugin-id', // 插件ID,只能包含小写字母、数字、下划线和横线
name: '插件名称', // 插件显示名称
description: '插件描述', // 插件功能描述
command: '/命令', // 触发命令,必须以/开头

// 基本信息(可选)
version: '1.0.0', // 插件版本号
author: '作者名称', // 插件作者
enabled: true, // 插件是否启用

// 配置项(可选)
config: {
// 插件的配置项
minPoints: 10, // 示例:最小积分
maxPoints: 100, // 示例:最大积分
},

// 数据存储(可选)
storage: {
// 插件的数据存储
records: new Map() // 示例:记录存储
},

// 消息处理函数(必需)
handler: async (message, channel, context) => {
// 返回值:
// - 字符串: 要发送的回复消息
// - null/undefined: 不发送回复
// - Promise<string>: 异步返回回复消息
return '回复消息'
}
}

// 导出插件
module.exports = plugin

API 说明

1. 消息对象(message)

继续阅读全文 »