python3 实现公众号自动发消息

2023-05-16

python3 实现公众号自动发消息

  • 前言
  • 微信公众号测试号申请
    • 申请测试公众号
    • 测试号信息
    • 测试号二维码
    • 模板消息接口
      • 新增流程
  • python 脚本配置
    • access_token.py
    • send_message.py
    • information_message.py
    • main.py
  • 验证
  • 定时发送
  • 结尾

前言

在这里插入图片描述

最近给女朋友的问候公众号制作爆火,网上的教程有很多但都很零散,可能按着操作结果不知道消息发送去那了,因此本文章就详细地从头教到尾

微信公众号测试号申请

申请测试公众号

微信公众平台
点击登录,微信扫描二维码登录进去
微信公众平台接口测试账户申请

测试号信息

后续脚本中需要测试号信息
测试号信息

测试号二维码

想要把信息发给谁,就让谁进行扫描二维码,扫描后刷新页面,右边用户列表就会出现微信号
后续脚本需要微信号
测试号二维码

模板消息接口

模板测试接口

新增流程

模板消息的配置(以第二个为例)

  1. 点击 新增测试模板

新增测试模板

  • 填写标题
    陌生人,早上好!

  • 填写模板内容

{{date.DATA}}
{{leady.DATA}}
{{love_day.DATA}}

{{ZH.DATA}}

{{EN.DATA}}

模板详解:

  • {{date.DATA}} 当天年月日
  • {{leady.DATA}} 当天农历年月日
  • {{love_day.DATA}} 恋爱开始的时间
  • {{ZH.DATA}} 生日
  • {{EN.DATA}} 每日一句

4.效果
在这里插入图片描述

python 脚本配置

access_token.py

测试号信息(两处需要修改)

  • APPID 填写自己的appID
  • APPSEARCH 填写自己的appsecret
[root@wh wq]# cat access_token.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time :2022/10/5 20:00
@Auth :王谦
@File :access_token.py
@Description:获取access_token
"""

import requests

class AccessToken(object):
    # 微信公众测试号账号(填写自己的)
    APPID = "填写自己申请的测试公众号ID"
    # 微信公众测试号密钥(填写自己的)
    APPSEARCH = "填写自己申请的测试公众号appsecret"

    def __init__(self, app_id=APPID, app_secret=APPSEARCH) -> None:
        self.app_id = app_id
        self.app_secret = app_secret

    def get_access_token(self) -> str:
        """
        获取access_token凭证
        :return: access_token
        """
        url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={self.app_id}&secret={self.app_secret}"
        resp = requests.get(url)
        result = resp.json()
        if 'access_token' in result:
            return result["access_token"]
        else:
            print(result)

send_message.py

用户列表以及模板消息接口(两处需要修改),这里也是上色的(设置的随机,每天都不一样)

  • TROUSER 发单人的启用单人的,多人的使用多人的,填写用户列表的微信号
  • TEMPLATE_ID 模板消息接口–>模板ID(用于接口调用)
[root@wh wq]# cat send_message.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time :2022/10/5 20:00
@Auth :王谦
@File :send_message.py
@Description:发送微信公众号消息
"""

import json
import requests
import random
from access_token import AccessToken


class SendMessage(object):
    # 消息接收者
     # 模板 TROUSER = 'oDxxxxxxxxxxxxxxxxxxII',
    # 单人
    # TROUSER = '填写测试号二维码里边的微信号',
    # 多人
    TROUSER = '','',''
    # 消息模板id
    TEMPLATE_ID = 'sPEYDFXQmaFb_ta-tCkCgTWj2eQfY6xHdrSGtYFEUx4'

    def __init__(self, tosser=TROUSER, template_id=TEMPLATE_ID) -> None:
        """
        构造函数
        :param touser: 消息接收者
        :param template_id: 消息模板id
        """
        self.access_token = AccessToken().get_access_token()
        self.trouser = tosser
        self.template_id = template_id
        
    
    def random_color(self):
        colors1 = '0123456789ABCDEF'
        num = "#"
        for i in range(6):
            num += random.choice(colors1)
        return num

    def get_send_data(self, json_data,Recipient) -> object:
        """
        获取发送消息data
        :param json_data: json数据对应模板
        :return: 发送的消息体
        """
        content = {}
        for k,v in json_data.items():
            concrete_content = { k : {"value": v,"color": self.random_color()} }
            content.update(concrete_content)

        return {
            "touser": Recipient,
            "template_id": self.template_id,
            "topcolor": "#FF0000",
            # json数据对应模板
            "data": content
        }

    def send_message(self, json_data) -> None:
        """
        发送消息
        :param json_data: json数据
        :return:
        """
        # 模板消息请求地址
        url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={self.access_token}"
        for Recipient in self.trouser:
            data = json.dumps(self.get_send_data(json_data,Recipient))
            requests.post(url, data=data)
[root@wh wq]#

information_message.py

对应模板信息
这个是跟模板进行对应的

如果要新增,新增def,以及最后的ALL里边进行添加

[root@wh wq]# cat information_message.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time :2022/10/5 20:00
@Auth :王谦
@File :main.py
@Description:微信公众号内容
"""

import requests
import datetime
import time
from zhdate import ZhDate
from dateutil.relativedelta import relativedelta

class Information:
    # 当前年月日
    def Datum():
        today = datetime.date.today()
        return today

    # 当前星期几
    def Boche():
        local_time = time.localtime(time.time())   # 获取当前时间的时间元组
        # time.struct_time(tm_year=2022, tm_mon=4, tm_mday=9, tm_hour=13, tm_min=48, tm_sec=23, tm_wday=5, tm_yday=99, tm_isdst=0)
        week_index = local_time.tm_wday  # 获取时间元组内的tm_wday值
        # # 配置名称列表
        week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
        return week_list[week_index]

    # 当前农历日期
    def Moneylender():
        from datetime import datetime
        local_time = time.localtime(time.time())   # 获取当前时间的时间元组
        dt_date4 = datetime(local_time.tm_year,
                            local_time.tm_mon, local_time.tm_mday)
        date4 = ZhDate.from_datetime(dt_date4)
        return date4.chinese()

    # 恋爱至现在时长
    def LOVE(love_year):
        love_year = love_year  # 开始恋爱日期
        love_day1 = tuple(time.strptime(
            love_year, "%Y-%m-%d"))  # 将格式化时间 转化为 结构化时间
        love_hour = time.strftime("%Y-%m-%d")  # 获取当前的格式化时间
        d1 = datetime.date(love_day1[0], love_day1[1], love_day1[2])
        d2 = datetime.date(int(love_hour.split(
            "-")[0]), int(love_hour.split("-")[1]), int(love_hour.split("-")[2]))
        d3 = (d2 - d1).days
        return f'今天是我们相恋的第{d3}天'

    # 距离生日日期
    def Geburtstag(month,day,name):
        from datetime import datetime
        # 公立当前年月日时间获取
        today = datetime.now()
        oneDay = ZhDate(int(str(ZhDate.today())[2:6]), month, day).to_datetime()
        difference = oneDay.toordinal()-today.toordinal()

        if(difference < 0):
            e = today.strftime('%Y')
            oneDay = ZhDate(int(e), month, day).to_datetime()
            difference = oneDay.toordinal()-today.toordinal()
            return f'距离{name}明年生日还有{difference}天'
        elif(difference == 0):
            return f'{name}生日快乐'
        else:
            return f'距离{name}今年生日还有{difference}天'

    # 每日一句
    def Everyday():
        url = 'http://open.iciba.com/dsapi/'
        url1 = requests.get(url)
        Eng = eval(url1.text)['content']
        Ch = eval(url1.text)['note']
        combination = Eng + '\n' + Ch
        return combination

    def whole():
        ALL = {
            'date': str(Information.Datum()) + ' ' + Information.Boche(),
            'leady':Information.Moneylender(),
            'love_day':str(Information.LOVE(love_year='2021-08-19')),
            'ZH':Information.Geburtstag(name='公举',month=8, day=15) + '\n' + Information.Geburtstag(name='王子',month=12, day=15),
            'EN': str(Information.Everyday())
        }
        return ALL

main.py

最后执行的文件

[root@wh wq]# cat main.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time :2022/10/5 20:00
@Auth :王谦
@File :main.py
@Description:微信公众号发送消息主文件
"""

import json
from send_message import SendMessage
from information_message import Information

class Main(object):
    def main(self):
        # 实例SendMessage
        sm = SendMessage()
        # 获取接口返回数据
        json_data = Information.whole()     
        # 发送消息
        sm.send_message(json_data=json_data)
        
if __name__ == '__main__':
    main = Main()
    main.main()

验证

[root@wh test]# ls
access_token.py  information_message.py  main.py  send_message.py
[root@wh test]# python3 main.py
[root@wh test]#

微信订阅号上边收到了信息

在这里插入图片描述

定时发送

linux定时任务

[root@wh test]# crontab -l
# 微信公众号定时(每天8点)
0 8 * * * /bin/python3 /data/script/test/main.py

结尾

没有服务器,也想要的,可以私信,目前是免费制定。(最终解释权归博主所有)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 实现公众号自动发消息 的相关文章

  • java如何解析xml?

    技术点 xff1a getResourceAsStream方法 xff0c dom4j的SaxReader解析xml 例 xff1a 1 加载磁盘xml文件到内存中 InputStream package com example utils
  • python识别数字论文_Python3使用tesserocr识别字母数字验证码的实现

    一 背景 最近有个需求是从一个后台的留言网站爬取留言数据 xff0c 后台管理网站必然涉及到了登录 xff0c 登录就有个验证码的问题必须得解决 xff0c 由于验证码是从后端生成的 xff0c 并且不了解其生成规则 xff0c 那就只能通
  • 用jsonserve和axios做交互_vue中axios对json-server提供的多层json数据如何增删改?

    问题描述 使用json server将json变成一个服务 xff0c 可以根据后缀不同获取到不同的数据 xff0c 而axios可以对数据进行操作 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • Linux下redis基本安装配置(CentOS7)

    1 下载 http redis io download 2 上传安装包 3 开始安装 rpm ivh jemalloc 3 6 0 1 el7 x86 64 rpm rpm ivh redis 4 0 8 1 el7 remi x86 64
  • 更新计算机策略命令,组策略更新命令

    对于Windows 2000域来说 xff0c 如果你想让新修改的计算机策略立即生效的话 xff0c 可以依次单击 开始 运行 命令 xff0c 打开系统运行对话框 xff0c 并在其中输入字符串命令 cmd xff0c 单击 确定 按钮后
  • 嵌入式安卓项目笔记

    前言 xff1a 时间2021年7月电子科大人文交流月课程 嵌入式安卓系统开发 的大作业 项目描述 基于VM虚拟机Ubuntu 18 04 参考老师所给的suspendmonitor例程 xff0c 实现USB插拔监控驱动 43 APP用户
  • (一)DSP28335

    前言 xff1a 用于记录一些在学习实验室48V无人机项目所用的DSP28335时的一些心得体会 xff0c 主要参考资料是普中科技的那个资料手册 1 通信相关 区分开串口通信与串行通信 xff0c 串口通信 xff08 Serial Co
  • arm中的程序计数器PC

    在cpu中 xff0c 一条指令的执行简单的划分为 xff1a 取指 译码 执行 xff0c 三个部分 pc中存放的是下一条将要 执行 的指令的地址 xff0c 这里的执行并不是取指 译码 执行中的第三个步骤 xff0c 而是指的将存放于内
  • 韦东山第一期课程内容概要

    韦东山第一期课程内容概要 1一个嵌入式程序要运行所需的东西1 1第一条指令 b reset1 2 reset要完成的事件1 2 1设置开门狗1 2 2设置时钟1 2 3判断启动方式并设置堆栈1 2 4代码重定位 1 3执行main函数 12
  • 韦东山第一二期衔接课程内容概要

    韦东山第一二期衔接课程内容概要 0 使得一个裸板Jz2440能运行linux应用程序的过程1 uboot启动内核总结1 1 u boot分析之编译体验1 2 u boot分析之Makefile结构分析1 3 u boot分析之源码第一阶段1
  • 嵌入式总线与通信

    嵌入式总线与通信 I2C通信I2C通信的特点I2C通信协议I2C硬件连接I2C在一条数据线SDA上如何实现双向传输 xff1f xff08 如何实现半双工 xff09 SOC上的I2C通用硬件接口I2C接口与接口之间的连接I2C设备在整个A
  • jquery为动态dom元素绑定点击事件(比如动态生成的表格)

    js为动态dom元素绑定点击事件 需要给页面动态加载还未出现的元素添加事件时 xff0c 可以用jQuery的on xff0c live xff0c delegate来绑定事件 叫做委派事件 比如控制的动态生成的表格 xff0c 给一列中的
  • 嵌入式Arm+Linux中断与异常全流程讲解

    嵌入式ARM 43 Linux中断全流程讲解 ARM处理器级别的中断 异常 ARM的异常类型CPU如何检测到异常信息 进入异常处理后怎么返回前置知识 xff1a 流水线 xff0c 指令周期 xff0c 机器周期 xff0c 时钟周期复位
  • Linux设备树

    Linux设备树 1 设备树的引进与体验字符设备驱动程序的三种写法使用设备树时对应的驱动编程只想使用设备树不想深入研究怎么办 本文章基于韦东山关于设备树的课程以及自己的一些想法 xff0c 目录结构和韦东山老师的视频结构相同 1 设备树的引
  • 一些零碎知识点的索引

    一些零碎知识点的索引 前言操作系统 xff08 主要是纯Linux系统级的 xff09 Linux内存管理slab的着色写时复制的应用场景内核高端内存栈查看一个进程的地址空间分布 xff08 代码 数据 栈 xff09 匿名映射Linux中
  • Linux wget遭遇证书不可信(Wget error: ERROR: The certificate of is not trusted.)解决方法

    新安装的debian9系统使用中发现wget时提示证书问题 xff0c 搜索资料得知是缺少ca certificates包引起 Linux安装ca certificates包命令 CentOS系统 用这个 yum install y ca
  • 使用Dnsmasq来解锁Netflix(奈飞)流媒体服务

    原理 xff1a 在一台能看Netflix的IP配置Netflix解锁DNS脚本 xff0c 然后其他不能看Netflix的小鸡使用这个能看的机器的DNS xff0c 达到能看的目的 参考文章 xff1a https www 863134
  • 将它人docker镜像备份到自己docker仓库

    前提 xff1a 机器上安装好docker 1 先创建Docker hub 帐号 xff0c 并创建仓库 首先你需要一个docker hub 帐号 xff0c 记住username xff0c password xff0c email xf
  • CentOS 7 自己手动开启 BBR 加速教程

    下载更换内核 最新内核查看这里 xff1a http elrepo org linux kernel el7 x86 64 RPMS 1 运行以下代码 xff1a rpm import https www span class hljs p
  • Linux中提示-bash: wget: command not found的解决方法

    Liunx系统中 xff0c bash wget command not found是找不到命令的意思 xff0c 也就是无法执行下载命令 xff0c 主要是因为你的系统太干净了 xff0c 没有安装下载命令的控制器 xff0c 我们给系统

随机推荐

  • Linux如何更改root用户密码

    可以使用passwd命令来修改用户的密码 passwd命令用于对用户的密码进行管理 xff0c 可以设置 修改 删除密码 用法示例 xff1a 修改root用户的密码 sudo passwd root 或者直接passwd root
  • Debian 9快速开启Google BBR的方法

    Google BBR是一个TCP加速优化工具 xff0c 类似于锐速 xff0c 可用于优化TCP连接 xff0c 最近Google开源了其TCP BBR拥塞控制算法 xff0c 并提交到了Linux内核 根据实地测试 xff0c 在部署了
  • 解决xshell终端主机名和用户名不显示颜色

    设置完成后是这样 步骤如下 1 打开你连接的Linux服务器 2 在用户文件夹下 xff0c 打开终端 xff0c 或者输入ctrl 43 h显示隐藏文件 3 打开这个文件 bashrc 把这个注释取消掉就可以了
  • 关于安卓唯一标识的汇总及最佳做法

    前言 识别用户唯一性 xff0c 是每个做应用所遇到的问题之一 通常我们会希望有一个唯一的字符 xff0c 去识别关联我们的用户 标识符特性 Android 操作系统提供了多种具有不同行为特性的 ID 我们应该使用何种 ID 取决于以下特性
  • java字符串数组排序_在Java中对字符串数组进行排序

    允许用户使用字符串数组进行演奏 他们可以将字符串添加到数组中 xff0c 从数组中删除字符串 xff0c 在数组中搜索字符串 xff0c 最终他们将能够对数组进行排序 排序使我很困惑 我尝试了几种不同的方法 第一种方法是将数组转换为Arra
  • Arch Linux 新手安装教程

    前言 安装环境 虚拟机软件 xff1a vmware workstations pro 15 5 1安装的arch linux版本 xff1a arch linux 2020 02 01 本文的目的旨在降低新手安装arch linux的难度
  • vm虚拟机摄像头调试_双机调试

    文章来源 xff1a 华盟论坛 条件 xff1a 已经安装好Visual Studio 2015 VM Win7 x64 wdk10 为什么要搭建双机调试 xff0c 普通的应用程序可以直接在本机进行调试 xff1b 但内核程序出错 xff
  • django无法生成迁移文件_Django初始化项目环境精讲

    上一节中 xff0c 我们完成了对 settings py 文件的基本配置 xff0c 本节我们还需要对新建的项目进一步的操作 xff0c 从而完成项目的初始化工作 在 settings py配置文件详解 一文中 xff0c 我们介绍了 I
  • mysql多少g_mysql表能有多大?

    MySQL 3 22 had a 4GB 4 gigabyte limit on table size With the MyISAM storage engine in MySQL 3 23 the maximum table size
  • gentoo 上安装 xrdp (1)

    第一次在 ubuntu 上安装 xrdp 用的是 https c nergy be blog p 61 14888 后来重装了ubuntu 就对照上面脚本和 https github com neutrinolabs xrdp wiki B
  • mysql怎么进行组内排序_MySQL 组内排序

    在开发中经常遇到这样一类需求 xff1a 取每种类型排名前几的数据 在此我简称它为组内排序 以下 xff0c 我借鉴了别人的方法并添加自己的想法 xff0c 就这类问题做一下理解 xff1a 数据准备 CREATE TABLE 96 tes
  • C/C++ 找出输入的10个数的最大值和最小值

    C C 43 43 找出输入的10个数的最大值和最小值 此代码最大特色是不用数组 include span class token operator lt span iostream span class token operator gt
  • python输入abcd输出对应的1234_python学习日记——练习题整理及解答

    1 执行python脚本的两种方式 2 简述位 字节的关系 1字节 61 8位 3 简述ASCII Unicode utf 8 gbk的关系 4 写出 李杰 分别用utf 8和gbk编码所占位数 utf8中文3字节 xff1b gbk中文4
  • python爬虫爬取代理ip构建代理ip池,并自动测试是否可用

    python多线程非阻塞爬取代理ip并自动测试是否可用 推荐一个网站西刺代理 xff0c 其中每天都会更新一些高匿代理ip供使用 https www xicidaili com 一页有99个ip xff0c 但是经我测试 xff0c 一般只
  • tomcat常用的配置

    这里我们使用tomcat版本 xff1a apache tomcat 7 0 77 windows x64 zip 为例 xff1a 下载链接地址为 xff1a https archive apache org dist tomcat to
  • c语言60秒倒计时编程,单片机60秒倒计时protues仿真及程序源码

    include define uint unsigned int define uchar unsigned char uchar code table 61 0xc0 0xf9 0xa4 0xb0 0x99 p 0x92 0x82 0xf
  • 怎么查看linux下mysql位置,linux服务器上怎么查看mysql的my.cnf的位置

    Debug5出品 xff0c 零基础 xff0c 小白高效入手python后端视频教程 xff1a xfeff linux服务器上 xff0c 运行着mysql xff0c 这时候想看my cnf的位置 xff0c 怎么来看呢 xff1f
  • TCP连接

    TCP连接管理 一 TCP三次握手二 TCP四次挥手三 为什么建立连接是三次握手 xff0c 释放连接是四次挥手 一 TCP三次握手 第一步 xff1a 客户端向服务器发送 连接请求报文 SYN 61 1 第二步 xff1a 服务器收到 连
  • ios上传音频文件到服务器,怎么把第三方音频文件添加到Apple Music

    当然是可以的啦 xff0c 目前呢 xff0c Apple Music在中国大陆提供上传自己的音乐到 iCloud音乐资料库 xff0c 不占用iCloud存储空间哦 xff5e 具体方法很简单 xff0c 最简单的是在Mac或者Windo
  • python3 实现公众号自动发消息

    python3 实现公众号自动发消息 前言微信公众号测试号申请申请测试公众号测试号信息测试号二维码模板消息接口新增流程 python 脚本配置access token pysend message pyinformation message