Chemmy's Blog

chengming0916@outlook.com

临时修改

方法一

1
2
3
4
sudo apt update & sudo apt install net-tools    # 安装 net-tools
sudo ifconfig eth0 down # 停用网卡
sudo ifconfig eth0 hw ether AA:BB:CC:DD:EE:FF # 设置 MAC 地址
sudo ifconfig eth0 up # 启用网卡

方法二

1
2
3
sudo ip link set dev eth0 down                      # 停用网卡 
sudo ip link set dev eth0 address AA:BB:CC:DD:EE:FF # 设置 MAC 地址
sudo ip link set dev eth0 up # 启用网卡

永久修改

注意: 永久修改需要停止NetworkManager服务,此服务可能导致修改不生效

1
2
sudo systemctl stop NetworkManager.service
sudo systemctl disable NetworkManager.service

方法一

编辑`/etc/init.d/rc.local``文件,在此配置文件最后追加临时修改网卡MAC命令

1
2
3
4
# 修改 ech0 网卡的 MAC 地址
sudo ifconfig eth0 down # 网卡名称可使用 ifconfig 或 ip addr 查看
sudo ifconfig eth0 hw ether AA:BB:CC:DD:EE:FF
sudo ifconfig eth0 up

方法二

编辑/etc/network/interfaces文件,在此文件后追加

1
2
3
4
5
6
7
8
auto eth0                         # 网卡自动启动
iface eth0 inet static # 静态 IP
address 192.168.1.2 # IP 地址
netmask 255.255.255.0 # 掩码
gateway 192.168.1.1 # 网关
hwaddress ether AA:BB:CC:DD:EE:FF # MAC 地址
dns-nameservers 223.5.5.5 # DNS 多个用空格隔开
dns-search .com # 限制 .com 的查询走上边设置的DNS服务器

修改完成需要重启网络服务使配置生效

1
2
3
4
sudo systemctl restart networking.service 

# 不同系统服务名可能有不太一样,如果找不到就重启系统
sudo reboot

安装Anaconda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

sudo chmod +x Anaconda3-2024.10-1-Linux-x86_64.sh # 文件添加执行权限

sudo sh Anaconda3-2024.10-1-Linux-x86_64.sh # 执行安装

# Please, press ENTER to continue -> 回车继续
# 阅读协议,同意按回车(跳过ctrl+c)
# Do you accept the license terms? [yes|no] -> 同意协议输入yes回车
# Anaconda3 will now be installed into this location -> 选择安装路径(本文安装/usr/local/anaconda3),等待安装
# by running conda init? [yes|no] -> 是否添加系统环境,输入yes回车
# 待安装结束

# 刷新当前用户环境(激活环境)
source /usr/local/anaconda3/bin

如果是否添加环境变量选择no的话,安装完成需要手动添加环境变量

1
2
export ANACONDA3_ROOT=/usr/local/anaconda3
export PATH=$ANACONDA3_ROOT/bin:$ANACONDA3_ROOT/condabin:$PATH

如果安装时选择了no但安装完成还想初始化可以执行

1
2
source /usr/local/anaconda3/bin/activate
conda init

![[Anaconda环境配置/IMG-20250804110742705.png]]

安装完成后查看.bashrc 中变更内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/usr/local/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/usr/local/anaconda3/etc/profile.d/conda.sh" ]; then
. "/usr/local/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/usr/local/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<

解决打开终端Anaconda自启动问题

1
conda config --set auto_activate_base false

镜像源

北京外国语大学

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.bfsu.edu.cn/anaconda
default_channels:
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/main
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/free
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/r
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/pro
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.bfsu.edu.cn/anaconda/cloud
msys2: https://mirrors.bfsu.edu.cn/anaconda/cloud
bioconda: https://mirrors.bfsu.edu.cn/anaconda/cloud
menpo: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch: https://mirrors.bfsu.edu.cn/anaconda/cloud
simpleitk: https://mirrors.bfsu.edu.cn/anaconda/cloud

上海交通大学

1
2
3
4
5
6
7
8
9
default_channels:
- https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/r
- https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/main
custom_channels:
conda-forge: https://anaconda.mirrors.sjtug.sjtu.edu.cn/cloud/
pytorch: https://anaconda.mirrors.sjtug.sjtu.edu.cn/cloud/
channels:
- defaults
show_channel_urls: true

Anaconda添加删除虚拟环境

1
2
3
4
5
# 新建虚拟环境 -n 为新建虚拟环境命名
conda create -n python310 python=3.10

# 删除虚拟环境
conda remove -n python310 --all

Anaconda切换虚拟环境

1
2
3
4
5
6
7
8
# 查看所有虚拟环境
conda env list

# 激活虚拟环境
conda activate python310

# 退出虚拟环境
conda deactivate python310

Docker 19.03以上版本可以使用 docker buildx build命令使用BuildKit构建镜像。该命令支持--platform参数可以同时构建多种系统架构的Docker镜像。

新建builder实例

Docker for Linux不支持构建arm架构镜像,可以运行一个新的容器让其支持该特性,Docker Desktop版本无需进行此项设置。

1
docker run --rm --privileged tonistiigi/binfmt:latest --install all 

由于Docker默认的build实例不支持同时指定多个 --platform,必须首先创建一个新的builder实例。

1
2
3
4
5
6
7
8
9
# 适用于国内环境
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master

# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent

# $ docker buildx create --name mybuilder --driver docker-container

$ docker buildx use mybuilder

构建镜像

1
2
3
4
5
FROM --platform=$TARGETPLATFORM alpine

RUN uname -a > os.txt

CMD ["cat", "os.txt"]
1
2
3
4
docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t {镜像名称} . --push

# 查看镜像信息
docker buildx imagetools inspect {镜像名称}

--push 参数表示将构建好的镜像推送到Docker仓库

架构相关变量

TARGETPLATFORM
构建镜像的目标平台,例如 linux/amd64linux/arm/v7windows/amd64

TARGETOS
构建镜像的OS类型,例如 linuxwindows

TARGETARCH
构建镜像的架构类型,例如 amd64arm

BUILDPLATFORM
构建镜像主机平台,例如 linux/amd64

BUILDOS
构建镜像主机的OS类型,例如 linux

BUILDARCH
构建镜像主机的架构类型,例如 amd64

BUILDVARIANT
BUILDPLATFORM的变种,该变量可能为空,例如 v7

使用举例
例如要构建 linux/arm/v7linux/amd64两种架构的镜像

1
2
3
4
5
6
7
8
9
10
11
FROM docker.io/library/python:3.10-alpine

# 使用变量必须申明
ARG TARGETOS
ARG TARGETARCH

WORKDIR /app

COPY main.py /app

# ENTRYPOINT [/app]

概述

OpenSSL 是一个开源的 SSL/TLS 工具包,用于生成和管理数字证书。本笔记涵盖自签名证书、多级证书链、PKCS#12 格式的完整操作流程。


一、基础概念

1.1 证书机构类型

类型 说明
CA Certificate Authority,证书授权机构,负责发放和管理数字证书
RootCA 根证书,权威机构持有的证书,安装根证书意味着信任该 CA
SubCA 中间证书机构,由根证书签发,可继续签发下级证书

1.2 CSR

CSR(Certificate Signing Request)是证书签名请求文件,生成私钥时同时生成。

1.3 常用文件格式

格式 说明
.crt / .cer 证书文件
.key 私钥文件
.csr 证书签名请求文件
.pem Base64 编码证书,可包含证书或密钥
.der 二进制证书文件,常见于 Windows
.p12 / .pfx PKCS#12 格式,包含私钥和证书链

[!NOTE]
CA 机构的证书可以给其他域名证书签名,但域名证书不可以。


二、证书链结构

典型三级结构:根证书 → 中间证书 → 服务器证书

1
2
3
4
5
6
7
8
服务器证书(最底端)
├── 域名、公钥、签名值

中间证书
├── 可由多张组合

根证书(最顶端)
└── 浏览器内置信任

验证过程:从服务器证书向上逐级验证签名直到根证书。


三、生成根证书

3.1 生成根私钥

1
2
3
4
5
# 生成带密码的私钥(需要输入两次密码)
openssl genrsa -des3 -out root-ca.priv.key 4096

# 去除私钥密码(需输入上一步密码)
openssl rsa -in root-ca.priv.key -out root-ca.key

3.2 生成自签名根证书

1
2
3
4
# -x509:使用 X.509 证书结构
# -days:证书有效期(按天计算)
openssl req -new -x509 -key root-ca.key -out root-ca.crt -days 3650 \
-subj "/C=CN/ST=Tianjin/L=Tianjin/O=Example/OU=DEV/CN=Example Root"

四、生成中间证书

[!TIP]
非复杂场景可跳过此步骤,使用根证书直接签发用户证书。

4.1 生成中间证书私钥

1
2
3
4
5
6
# 方式1:参考根证书私钥
openssl genrsa -des3 -out mid-ca.priv.key 4096
openssl rsa -in mid-ca.priv.key -out mid-ca.key

# 方式2:直接生成
openssl genpkey -algorithm RSA -out mid-ca.key -pkeyopt rsa_keygen_bits:4096

4.2 生成中间证书请求

1
2
openssl req -new -key mid-ca.key -out mid-ca.csr \
-subj "/C=CN/ST=Tianjin/L=Tianjin/O=Example/OU=DEV/CN=Example Mid"

4.3 使用根证书签发中间证书

1
2
3
4
5
openssl x509 -req \
-extfile <(printf "subjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always,issuer:always") \
-days 3650 -in mid-ca.csr \
-CA root-ca.crt -CAkey root-ca.key \
-CAcreateserial -out mid-ca.crt

4.4 验证中间证书

1
openssl verify -CAfile root-ca.crt mid-ca.crt

五、生成终端证书(服务器证书)

假设服务器域名为 example.io

5.1 生成私钥

1
2
3
4
5
6
# 方式1
openssl genrsa -des3 -out example.io.priv.key 4096
openssl rsa -in example.io.priv.key -out example.io.key

# 方式2
openssl genpkey -algorithm RSA -out example.io.key -pkeyopt rsa_keygen_bits:4096

5.2 生成证书签名请求

1
2
openssl req -new -key example.io.key -out example.io.csr \
-subj "/CN=example.io"

5.3 生成证书

1
2
3
4
5
6
7
8
9
10
11
# 使用根证书签发
openssl x509 -req -days 3650 \
-extfile v3.ext \
-CA root-ca.crt -CAkey root-ca.key -CAcreateserial \
-in example.io.csr -out example.io.crt

# 使用中间证书签发
openssl x509 -req -days 3650 \
-extfile v3.ext \
-CA mid-ca.crt -CAkey mid-ca.key -CAcreateserial \
-in example.io.csr -out example.io.crt

[!CAUTION]
v3.ext 中 basicConstraints=CA:FALSE 为必选项,否则生成证书无法使用。

5.4 导出 PFX 格式

1
openssl pkcs12 -export -out example.io.pfx -inkey example.io.key -in example.io.crt

5.5 验证终端证书

1
openssl verify -CAfile root-ca.crt example.io.crt

六、查看证书信息

1
2
3
4
5
6
7
8
9
10
11
# 查看私钥内容
openssl rsa -noout -text -in cakey.key

# 查看证书内容
openssl x509 -noout -text -in cacert.crt

# PEM 转为 DER
openssl x509 -in cacert.crt -outform der -out cacert.der

# DER 转为 PEM
openssl x509 -in cert.crt -inform der -outform pem -out cacert.pem

七、证书有效性验证

启动测试服务器(需先导入根证书到浏览器信任库):

1
openssl s_server -cert example.io.crt -key example.io.key -debug -HTTP -accept 443

然后访问 https://服务器IP 查看证书是否有效。


八、吊销证书

1
2
3
4
5
6
7
8
# 吊销证书
openssl ca -revoke cert.pem

# 生成吊销列表
openssl ca -gencrl -out testca.crl

# 查看吊销列表
openssl crl -in testca.crl -text -noout

九、附件

9.1 CSR 参数说明

参数 说明 示例
/C 国家代码 CN
/ST 州或省 Tianjin
/L 城市 Tianjin
/O 组织名称 Example
/OU 部门名称 DEV
/CN 通用名称(域名) example.com

9.2 X.509 扩展配置 v3.ext

1
2
3
4
5
6
7
8
9
10
11
authorityKeyIdentifier=keyid,issuer
subjectKeyIdentifier=hash
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment

subjectAltName = @alt_names

[alt_names]
DNS.1=example.io
DNS.2=*.example.io
IP.3=192.168.0.2

扩展用途说明

  • serverAuth:保证远程计算机的身份
  • clientAuth:向远程计算机证明身份
  • codeSigning:确保软件来自发布者
  • emailProtection:保护电子邮件

十、PKCS#12 操作

10.1 生成 PKCS#12 证书

1
2
3
4
5
# 包含证书和私钥
openssl pkcs12 -export -inkey server.key -in server.crt -out server.p12

# 包含证书、私钥和 CA 证书链
openssl pkcs12 -export -inkey server.key -in server.crt -chain -CAfile ca.crt -out server.p12

10.2 从 PKCS#12 提取内容

1
2
3
4
5
6
7
8
9
10
11
# 提取私钥
openssl pkcs12 -in server.p12 -nocerts -out server.key -nodes

# 提取证书
openssl pkcs12 -in server.p12 -nokeys -clcerts -out server.crt

# 提取 CA 证书
openssl pkcs12 -in server.p12 -nokeys -cacerts -out ca.crt

# 提取所有内容
openssl pkcs12 -in server.p12 -nodes -out all-in-one.pem

10.3 验证 PKCS#12 文件

1
openssl pkcs12 -info -in server.p12

十一、一键命令速查

自签名证书

1
2
3
openssl genrsa -out server.key 2048
openssl req -subj "/C=CN/ST=Tianjin/O=Mocha/CN=example.io" -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

私有 CA 签名

1
2
3
4
5
openssl genrsa -out ca.key 2048
openssl req -subj "/C=CN/ST=Tianjin/O=Mocha/CN=Server CA" -new -x509 -days 3650 -key ca.key -out ca.crt
openssl genrsa -out server.key 2048
openssl req -subj "/C=CN/ST=Tianjin/O=Mocha/CN=example.io" -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

一、项目概述

随着 DeepSeek 等 AI 大模型的普及,我们有了更多有趣的玩法。本文将介绍如何利用 Python 脚本,结合 AI 大模型(以 DeepSeek 为例)和微信公众号 API,实现从文章创作到发布的全自动化流程

核心流程

  1. AI 创作:调用 DeepSeek API,根据热点或指定主题生成文章。
  2. 公众号对接:通过微信公众号 API,获取凭证、上传素材并发布文章。
  3. 自动化整合:将以上步骤串联,实现一键生成并发布。

二、第一步:接入 AI 创作引擎(DeepSeek)

2.1 获取 DeepSeek API Key

  1. 访问 DeepSeek 官方平台
  2. 登录后,进入 API 管理页面,创建一个新的 API Key 并妥善保存。

2.2 创建调用 DeepSeek API 的函数

以下 Python 函数 get_article_from_deepseek 用于向 DeepSeek 发送请求并获取生成的文本。

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
import requests

# DeepSeek API 配置
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替换为你的 API Key

def get_article_from_deepseek(my_describe):
"""
调用 DeepSeek API 生成文章。
:param my_describe: 给 AI 的提示词,描述文章要求。
:return: 生成的文本内容,失败则返回 None。
"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
data = {
"model": "deepseek-chat", # 指定模型
"messages": [
{
"role": "user",
"content": my_describe
}
]
}
try:
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
article = result["choices"][0]["message"]["content"]
return article
else:
print(f"DeepSeek 请求失败,状态码:{response.status_code},错误信息:{response.text}")
except requests.RequestException as e:
print(f"DeepSeek 请求发生错误:{e}")
return None

2.3 测试 AI 创作

调用函数,让 AI 根据热点生成一篇公众号风格的文章。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 示例:让 AI 基于近期热点创作
prompt = """
请查询最近三天内的热搜榜,取其中的一个热点,生成一篇公众号文章。
要求:
1. 标题要吸引人,有争议性。
2. 内容完整,结构清晰(有引言、主体、结论)。
3. 不能涉及侵权行为。
4. 输出纯文本,无需 Markdown 格式。
"""
article_content = get_article_from_deepseek(prompt)
if article_content:
print("文章生成成功!")
print(article_content[:500]) # 预览前500字符

效果与成本

  • AI 能快速生成一篇结构完整、风格贴近公众号的文章。
  • 一篇短文的生成成本(输入+输出 tokens)通常不足 1000 tokens,花费极低。


三、第二步:接入微信公众号 API

3.1 获取公众号凭证

  1. 登录 微信公众平台
  2. 进入 开发 -> 基本配置,获取 AppIDAppSecret

    新手建议:首次测试可使用 “开发者工具” 中的 “公众平台测试账号”,功能齐全且无风险。

3.2 创建公众号 API 操作函数

我们需要四个核心函数来处理公众号的访问令牌、素材上传和文章发布。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 微信公众号配置
WECHAT_APPID = "你的AppID"
WECHAT_APPSECRET = "你的AppSecret"
WECHAT_API_URL = "https://api.weixin.qq.com"

def get_wechat_access_token():
"""获取微信公众号的 access_token。"""
url = f"{WECHAT_API_URL}/cgi-bin/token?grant_type=client_credential&appid={WECHAT_APPID}&secret={WECHAT_APPSECRET}"
try:
response = requests.get(url)
if response.status_code == 200:
result = response.json()
if 'access_token' in result:
return result['access_token']
else:
print(f"获取 access_token 失败,错误信息:{result}")
except requests.RequestException as e:
print(f"获取 access_token 发生错误:{e}")
return None

def upload_cover_image(access_token, image_path):
"""上传封面图片并获取 media_id。"""
url = f"{WECHAT_API_URL}/cgi-bin/media/upload?access_token={access_token}&type=image"
with open(image_path, 'rb') as file:
files = {'media': file}
try:
response = requests.post(url, files=files)
if response.status_code == 200:
result = response.json()
if 'media_id' in result:
return result['media_id']
else:
print(f"上传封面图片失败,错误信息:{result}")
except requests.RequestException as e:
print(f"上传封面图片发生错误:{e}")
return None

def create_article_material(access_token, article, thumb_media_id):
"""将文章内容创建为公众号素材,并返回素材 media_id。"""
url = f"{WECHAT_API_URL}/cgi-bin/media/uploadnews?access_token={access_token}"
# 注意:公众号文章内容需要是 HTML 格式
data = {
"articles": [
{
"title": "AI生成的热点文章", # 文章标题
"thumb_media_id": thumb_media_id, # 封面图片素材 ID
"author": "AI Writer", # 作者
"digest": article[:100] + "...", # 文章摘要(取前100字符)
"show_cover_pic": 0, # 是否在正文显示封面图片
"content": article,
"content_source_url": "" # 原文链接(可留空)
}
]
}
try:
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if 'media_id' in result:
return result['media_id']
else:
print(f"创建文章素材失败,错误信息:{result}")
except requests.RequestException as e:
print(f"创建文章素材发生错误:{e}")
return None

def publish_article(access_token, media_id):
"""将已创建的素材发布给所有粉丝。"""
url = f"{WECHAT_API_URL}/cgi-bin/message/mass/sendall?access_token={access_token}"
data = {
"filter": {
"is_to_all": True # 发送给所有用户
},
"mpnews": {
"media_id": media_id
},
"msgtype": "mpnews"
}
try:
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if result.get('errcode') == 0:
print("文章发布成功!")
else:
print(f"文章发布失败,错误信息:{result}")
except requests.RequestException as e:
print(f"文章发布发生错误:{e}")

四、第三步:组装自动化“工厂”

4.1 创建主函数串联流程

将 AI 创作和公众号发布流程整合到一个主函数中。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import os

def main():
"""主函数:一键生成并发布文章。"""
print("开始自动创作与发布流程...")

# 1. AI 生成文章
prompt = "请以‘职场人的下班自由’为主题,写一篇800字左右的公众号文章,要求观点鲜明,引发共鸣。"
print("正在调用 AI 生成文章...")
article_content = get_article_from_deepseek(prompt)

if not article_content:
print("文章生成失败,流程终止。")
return

# 2. 处理编码与格式(防止乱码)
# 公众号 API 要求内容为 UTF-8 编码的字符串
article_content = article_content.encode('utf-8').decode('utf-8')
# 可选:将纯文本转换为简单的 HTML 段落格式,以提升公众号阅读体验
html_content = "<p>" + article_content.replace("\n", "</p><p>") + "</p>"

# 3. 获取公众号访问令牌
print("正在获取微信公众号访问令牌...")
access_token = get_wechat_access_token()
if not access_token:
print("获取访问令牌失败,流程终止。")
return

# 4. 上传封面图片(需提前准备一张 cover.jpg)
cover_image_path = "./cover.jpg"
if not os.path.exists(cover_image_path):
print(f"封面图片不存在:{cover_image_path},请准备一张封面图。")
# 此处可以改为使用默认图或跳过
return
print("正在上传封面图片...")
thumb_media_id = upload_cover_image(access_token, cover_image_path)
if not thumb_media_id:
print("上传封面图片失败,流程终止。")
return

# 5. 创建文章素材
print("正在创建公众号文章素材...")
media_id = create_article_material(access_token, html_content, thumb_media_id)
if not media_id:
print("创建文章素材失败,流程终止。")
return

# 6. 发布文章
print("正在发布文章...")
publish_article(access_token, media_id)

print("自动化流程执行完毕!")

if __name__ == "__main__":
main()

4.2 运行与测试

  1. 确保已安装 requests 库:pip install requests
  2. 将代码中的 DEEPSEEK_API_KEYWECHAT_APPIDWECHAT_APPSECRET 替换为你自己的凭证。
  3. 准备一张名为 cover.jpg 的封面图片,放在脚本同目录下。
  4. 运行脚本 python auto_publish.py

成功提示:如果一切顺利,你将在公众号后台的“素材管理”中看到新创建的文章,并且所有粉丝都会收到推送。


五、进阶优化与展望

5.1 当前流程优化

  • 内容格式化:在提示词中要求 AI 直接输出带 HTML 标签的格式,减少后期处理。
  • 错误重试:为网络请求添加重试机制,提高稳定性。
  • 日志记录:将运行状态、生成的文章内容、API 响应等记录到文件,便于排查。
  • 多热点源:结合其他 API(如微博、百度热搜)获取实时热点,作为 AI 的创作素材。

5.2 扩展为“AI 运营管家”

设想一个更强大的自动化系统:

  1. GUI 管理界面:使用 PyQtTkinter 制作可视化控制面板。
  2. 任务调度:使用 APScheduler 库,实现定时任务(如每小时抓取热点,生成文章存入素材池)。
  3. 账号矩阵管理:管理多个公众号,根据账号定位(美食、情感、科技)自动匹配不同风格的文章并发布。
  4. 数据分析与反馈:调用公众号数据接口,分析文章阅读量、点赞数,用 AI 总结规律,并自动调整后续的创作策略(如标题风格、发文时间)。
  5. 全自动化部署:将整套脚本部署到云服务器(如腾讯云、阿里云),实现 7x24 小时无人值守运营。

最终愿景:实现“一人运营百号”,运营者只需定期查看数据报告,与 AI 讨论策略,将重复性工作完全自动化。


六、注意事项

  1. 内容审核:AI 生成的内容需符合平台规范,发布前建议人工审核,避免违规风险。
  2. API 限制:关注 DeepSeek 和微信公众号的 API 调用频率、配额限制。
  3. 版权与伦理:确保生成的内容不侵犯他人版权,注明 AI 辅助创作。
  4. 凭证安全:切勿将 API KeyAppSecret 等敏感信息提交到公开的代码仓库。

通过本文的指南,你可以快速搭建一个属于自己的“AI 小编”系统,探索内容创作自动化的无限可能。

方法1

最简单的一种方法,将当前用户添加到root组。这样做之后该用户将拥有所有root权限,从而使用户在使用sudo时不再需要输入密码。

1
sudo adduser {当前用户名} root 

注意: 将用户添加到root组后,该用户将拥有最高权限,因此在执行系统级操作时要特别小心,以避免可能的系统破坏。

方法2(推荐)

通过编辑/etc/sudoers文件来配置特定用户或组的sudo行为。这种方法允许更灵活的控制哪些命令可以绕过密码提示。
![[Linux配置sudo无密码/IMG-20250319160639846.png]]

单用户配置

1
{用户名} ALL=(ALL:ALL) NOPASSWD:ALL #在 root 后新添加一行

用户组配置

1
%{用户组} ALL=(ALL:ALL) NOPASSWD:ALL # 在 %sudo 后添加

使用此方式需将用户添加进组

1
sudo usermod -a -G {用户组} {用户名}

安装Golang

Windows版本下载安装程序安装即可,Ubuntu下有两种安装方式
第一种方式

1
2
sudo apt update
sudo apt install golang

此种方式安装的版本并不是最新版,或者下载 [官方包]执行

1
2
sudo tar -zxvf go1.24.2.linux-amd64.tar.gz -C  /usr/local # 解压缩到/usr/local
sudo chmod 755 -R /usr/local/go # 修改权限,一般解压后就有权限,此步可以省略

配置环境变量

Windows

打开 系统设置->关于->高级系统设置->环境变量,注意如果只给当前用户使用添加到用户的环境变量即可,全部用户可用需配置系统环境变量。

GOROOT

![[Golang环境配置/IMG-20250804110742705.png]]

GOPATH
![[Golang环境配置/IMG-20250804110742880.png]]

GOPROXY

![[Golang环境配置/IMG-20250804110743185.png]]

Ubuntu

如果只给当前用户使用编辑用户目录下.bashrc文件,全部用户可用需配置/etc/profile

1
2
3
export GOROOT=/usr/local/go # Golang根目录
export GOPATH=/home/go-project # 项目根目录
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

进阶配置

GOPROXY可在环境变量中配置也可使用go env -w命令配置

1
2
3
go env -w GOPROXY=https://goproxy.cn # 七牛
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ # 阿里
go env -w GOPROXY=https://goproxy.io # 官方

GO111MODULE
从go 1.11版本开始,推荐使用Go Modules进行包管理。

1
go env -w GO111MODULE=on

在项目目录下初始化模块

1
go mod init 

1. 第一个Qt程序

1.1 Hello Qt

1
2
3
4
5
6
7
8
9
10
#include <QApplication>          // 头文件引用, 每个Qt类都有对应的头文件,类的定义
#include <QLabel> // 包含了对该类的定义

int main(int argc, char *argv[])
{
QApplication app(argc, argv); // 创建QApplication对象,管理整个应用
QLabel *label = new QLabel("Hello Qt"); // QLabel部件,用于显示
label->show(); // # 使QLabel部件可见
return app.exec(); // 将应用程序的控制权传递给Qt,程序等待用户操作
}

测试程序

图片占位

在源码根目录打开命令提示符执行qmake -project生成hello.pro项目文件,然后执行qmake hello.pro从这个项目文件生成makefile文件,在输入make命令就可以构建该应用。

0%