python微信公众号自动推送(十分简单的教程)

这篇具有很好参考价值的文章主要介绍了python微信公众号自动推送(十分简单的教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python微信公众号自动推送(十分简单的教程)

目录

一、注册微信公众号

     1.注册链接

    2.登录成功

3.关注该公众号

4.创建模板

二、代码实现

1.爬取天气信息

2.计算生日天数

 3.获取access token

4.获取关注者的openid

5.向用户广播消息

6.最终代码


2023年五月五日更:

   自五月四日起原来的微信公众号模版将不再生效,可根据最新的开发文档更新的规则对自己的模版进行修改,修改过后即可重新获取到有内容的微信公众号推送

基础消息能力 / 模板消息接口 (qq.com)

python微信公众号自动推送(十分简单的教程)

python微信公众号自动推送(十分简单的教程)

也就是说现在的公众号模板的格式必须是正文中的第二种模板也就是下面这样 关键词:{{xxx.DATA}},而且现在\n也不能使用无法换行了,只能到达字数限制后自动换行而且字数太多还会省...... 我只能说钩史微信还老子女神!!!

python微信公众号自动推送(十分简单的教程)

一、注册微信公众号

     1.注册链接

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/indexhttps://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

python微信公众号自动推送(十分简单的教程)

到达这个界面微信扫码登录即可(若出现登录失败问题则建议换一个更好的网络环境再尝试或者尝试刷新网页)

    2.登录成功

 python微信公众号自动推送(十分简单的教程)

登录成功后会自动生成你的appid和appsecret(后面会用到) 接口信息等暂时不用管若后期想完全实现自动推送则需要挂自己的服务器(后续会更新)

3.关注该公众号

python微信公众号自动推送(十分简单的教程)

 扫码关注即可(建议不要心急自己调试好了再让npy关注)

4.创建模板

 创建模板时既可以将所有的 文本文字+数据 放在一起当作数据像这样

python微信公众号自动推送(十分简单的教程)

 也可以再模板内先写出来,但是这种方法会让模板的灵活性变小做大的修改只能重新创建新的模板 

 python微信公众号自动推送(十分简单的教程)

 创建好模板微信公众号注册的工作就结束了

二、代码实现

首先了解以下的几个库

import requests
import json
import datetime
import time
from bs4 import BeautifulSoup
from zhdate import ZhDate
#用到的库

1.爬取天气信息

def get_weather(self):
        """
        该方法中用到了beautifulsoup的一些基本用法
        感兴趣可以深入了解python爬虫
        """
        url = 'http://www.weather.com.cn/weather/101290101.shtml'     #昆明天气网站
        sysdate = datetime.date.today()
        r = requests.get(url, timeout=30)                             # 用requests抓取网页
        r.raise_for_status()                                          # 异常时停止
        r.encoding = r.apparent_encoding                              # 编码格式
        html = r.text
        final_list = []
        soup = BeautifulSoup(html, 'html.parser')       # 用BeautifulSoup库解析网页
        body = soup.body                                  # 从soup里截取body的一部分
        data = body.find('div', {'id': '7d'})        #在网页浏览器按F12遍历div 找到 id = 7d                                                                 
                                             #的对应标签 会发现七天的天气信息都包括在子节点中
        ul = data.find('ul')                                          #用find方法找ul标签
        lis = ul.find_all('li')                                       #找到ul中的li标签也就是列表其中存放着 日期 天气 风力等信息 
 
        for day in lis:
            temp_list = []
 
            date = day.find('h1').string                              # 找到日期
            if date.string.split('日')[0] == str(sysdate.day):
                temp_list = []
 
                date = day.find('h1').string                          # 找到日期
                temp_list.append(date)
 
                info = day.find_all('p')                              # 找到所有的p标签
                temp_list.append(info[0].string)
 
                if info[1].find('span') is None:                      # 找到p标签中的第二个值'span'标签——最高温度
                    temperature_highest = ' '                         # 用一个判断是否有最高温度
                else:
                    temperature_highest = info[1].find('span').string
                    temperature_highest = temperature_highest.replace('℃', ' ')
 
                if info[1].find('i') is None:                         # 找到p标签中的第二个值'i'标签——最高温度
                    temperature_lowest = ' '                          # 用一个判断是否有最低温度
                else:
                    temperature_lowest = info[1].find('i').string
                    temperature_lowest = temperature_lowest.replace('℃', ' ')
 
                temp_list.append(temperature_highest)                 # 将最高气温添加到temp_list中
                temp_list.append(temperature_lowest)                  # 将最低气温添加到temp_list中
 
                final_list.append(temp_list)                          # 将temp_list列表添加到final_list列表中
                return '天气情况:' + final_list[0][1] + '\n温度:' + final_list[0][3].strip() + '~' + \
                               final_list[0][2].strip() + '℃'

2.计算生日天数

 def get_herbirthday(self):
        """
        获取npy生日 这里还用到了农历时间库
        可以去网上查阅 ZhDate库 其他基本上是datetime中的一些获取当前日期和toordinal
        没什么特别难的
        """
        today = datetime.datetime.now()                               #获取现在时间信息
        data_str = today.strftime('%Y-%m-%d')
        herbirthDay = ZhDate(today.year, 1, 18).to_datetime()          #将农历1.18号的时间转换为公历时间再转换为datetime类型的时间
        if herbirthDay >today :                                        #如果ta的生日日期比今天靠后则直接计算这两天的序号之差
            difference = herbirthDay.toordinal() - today.toordinal()
            return ("\n距离熊又又生日,还有 %d 天。" % (difference))
        elif herbirthDay <today:                                       #如果ta的生日日期比今天靠前则给ta的生日加上一年再计算这两天的序号之差
            herbirthDay = herbirthDay.replace(today.year+1)
            difference = herbirthDay.toordinal() - today.toordinal()
            return ("\n距离熊又又生日,还有 %d 天。" % (difference))
        else:
            return ('生日快乐bb!!')

 3.获取access token

获取公众号的access_token值,access_token是公众号全局唯一接口调用凭据,公众号调用各接口时都需要使用access_token。api接口:接口调用请求说明
https请求方式:

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={你的appid}&secret={你的appsecret}
 def get_access_token(self):
        """
        获取access_token
        通过查阅微信公众号的开发说明就清晰明了了
        """
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.\
            format(self.appID, self.appsecret)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'
        }
        response = requests.get(url, headers=headers).json()
        access_token = response.get('access_token')
        return access_token

4.获取关注者的openid

   opend_id是(有关注公众号的微信账号)用户id,想要消息推送过去就必须要获取open_id

获取open id的https请求方式为

https://api.weixin.qq.com/cgi-bin/user/get?access_token={获取的access token}&next_openid={}
def get_openid(self):
        """
        获取所有用户的openid
        微信公众号开发文档中可以查阅获取openid的方法
        """
        next_openid = ''
        url_openid = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s' % (self.access_token, next_openid)
        ans = requests.get(url_openid)
        open_ids = json.loads(ans.content)['data']['openid']
        return open_ids

5.向用户广播消息

http请求方式:

 POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
def sendmsg(self):  
        """
        给所有用户发送消息
        """
        url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(self.access_token)
 
        if self.opend_ids != '':
            for open_id in self.opend_ids:
                body = {
                        "touser": open_id,
                        "template_id": self.template_id,
                        "url": "https://www.baidu.com/",
                        "topcolor": "#FF0000",
                         #对应模板中的数据模板
                        "data": {
                            "frist": {
                                "value": self.dataJson.get("frist"),               
                                "color": "#FF99CC"                                  #文字颜色
                            },
                            "body": {
                                "value": self.dataJson.get("body"),
                                "color": "#EA0000"
                            },
                            "weather": {
                                "value": self.dataJson.get("weather"),
                                "color": "#00EC00"
                            },
                             "date": {
                                "value": self.dataJson.get("date"),
                                "color": "#6F00D2"
                            },
                            "remark": {
                                "value": self.dataJson.get("remark"),
                                "color": "#66CCFF"
                            }
                        }
                    }
                data = bytes(json.dumps(body, ensure_ascii=False).encode('utf-8'))  #将数据编码json并转换为bytes型
                response = requests.post(url, data=data)                    
                result = response.json()                                            #将返回信息json解码
                print(result)                                                       # 根据response查看是否广播成功
        else:
            print("当前没有用户关注该公众号!")
 

6.最终代码

import requests
import json
import datetime
import time
from bs4 import BeautifulSoup
from zhdate import ZhDate
 
class SendMessage():                                                 #定义发送消息的类
    def __init__(self):                                              
        date = self.get_date()                                       #获取当前日期
        weather = self.get_weather()                                 #获取天气信息
        lovedate = self.get_loveday()                                #获取纪念日
        herbirthday = self.get_herbirthday()                         #获取npy生日
        mybirthday = self.get_mybirthday()                           #获取自己生日
        body =lovedate+"\n"+herbirthday+mybirthday                   
        self.dataJson ={"frist":"早上好bb!❤\n",                     #最终要发送的json
                        "date":date+'\n',
                        "body":body+" ",
                        "weather":weather+'\n城市:昆明'+'\n',        #因为还没写获取地理位置的所以城市暂时写死 后续将会改为获取当前位置并爬取对应城市的天气信息版本
                        "last":'\n今天也是爱bb🐖的一天捏!!!'      
                        }
        self.appID = ''                             #appid 注册时有
        self.appsecret = ''           #appsecret 同上
        self.template_id = ''  # 模板id
        self.access_token = self.get_access_token()                   #获取 access token
        self.opend_ids = self.get_openid()                            #获取关注用户的openid
 
 

 
    def get_weather(self):
        """
        该方法中用到了beautifulsoup的一些基本用法
        感兴趣可以深入了解python爬虫
        """
        url = 'http://www.weather.com.cn/weather/101290101.shtml'     #昆明天气网站
        sysdate = datetime.date.today()
        r = requests.get(url, timeout=30)                             # 用requests抓取网页信息
        r.raise_for_status()                                          # 异常时停止
        r.encoding = r.apparent_encoding                              # 编码格式
        html = r.text
        final_list = []
        soup = BeautifulSoup(html, 'html.parser')                     # 用BeautifulSoup库解析网页 #soup里有对当前天气的建议
        body = soup.body                                              # 从soup里截取body的一部分
        data = body.find('div', {'id': '7d'})                         #在网页浏览器按F12遍历div 找到 id = 7d 的对应标签 会发现七天的天气信息都包括在子节点中
        ul = data.find('ul')                                          #用find方法找ul标签
        lis = ul.find_all('li')                                       #找到ul中的li标签也就是列表其中存放着 日期 天气 风力等信息 
 
        for day in lis:
            temp_list = []
 
            date = day.find('h1').string                              # 找到日期
            if date.string.split('日')[0] == str(sysdate.day):
                temp_list = []
 
                date = day.find('h1').string                          # 找到日期
                temp_list.append(date)
 
                info = day.find_all('p')                              # 找到所有的p标签
                temp_list.append(info[0].string)
 
                if info[1].find('span') is None:                      # 找到p标签中的第二个值'span'标签——最高温度
                    temperature_highest = ' '                         # 用一个判断是否有最高温度
                else:
                    temperature_highest = info[1].find('span').string
                    temperature_highest = temperature_highest.replace('℃', ' ')
 
                if info[1].find('i') is None:                         # 找到p标签中的第二个值'i'标签——最高温度
                    temperature_lowest = ' '                          # 用一个判断是否有最低温度
                else:
                    temperature_lowest = info[1].find('i').string
                    temperature_lowest = temperature_lowest.replace('℃', ' ')
 
                temp_list.append(temperature_highest)                 # 将最高气温添加到temp_list中
                temp_list.append(temperature_lowest)                  # 将最低气温添加到temp_list中
 
                final_list.append(temp_list)                          # 将temp_list列表添加到final_list列表中
                return '天气情况:' + final_list[0][1] + '\n温度:' + final_list[0][3].strip() + '~' + \
                               final_list[0][2].strip() + '℃'
    def get_date(self):
        """
        这些都是datetime库中的用法
        若零基础可以去python的开发文档中查阅
        """
        sysdate = datetime.date.today()                 # 只获取日期
        now_time = datetime.datetime.now()              # 获取日期加时间
        week_day = sysdate.isoweekday()                 # 获取周几
        week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']
        return '现在是' + str(now_time)[0:16] + ' ' + week[week_day - 1]
 
    def get_herbirthday(self):
        """
        获取npy生日 这里还用到了农历时间库
        可以去网上查阅 ZhDate库 其他基本上是datetime中的一些获取当前日期和toordinal
        没什么特别难的
        """
        today = datetime.datetime.now()                               #获取现在时间信息
        data_str = today.strftime('%Y-%m-%d')
        herbirthDay = ZhDate(today.year, 1, 18).to_datetime()          #将农历1.18号的时间转换为公历时间再转换为datetime类型的时间
        if herbirthDay >today :                                        #如果ta的生日日期比今天靠后则直接计算这两天的序号之差
            difference = herbirthDay.toordinal() - today.toordinal()
            return ("\n距离熊又又生日,还有 %d 天。" % (difference))
        elif herbirthDay <today:                                       #如果ta的生日日期比今天靠前则给ta的生日加上一年再计算这两天的序号之差
            herbirthDay = herbirthDay.replace(today.year+1)
            difference = herbirthDay.toordinal() - today.toordinal()
            return ("\n距离熊又又生日,还有 %d 天。" % (difference))
        else:
            return ('生日快乐bb!!')
    def get_mybirthday(self):
        """
            同上
        """
        today = datetime.datetime.now()
        data_str = today.strftime('%Y-%m-%d')
        mybirthDay = datetime.datetime(today.year,12,7)
        if mybirthDay >today :
            difference = mybirthDay.toordinal() - today.toordinal()
            return ("\n距离刘壮壮生日,还有 %d 天。" % (difference))
        elif mybirthDay <today:
            mybirthDay = mybirthDay.replace(today.year+1)
            difference = mybirthDay.toordinal() - today.toordinal()
            return ("\n距离刘壮壮生日,还有 %d 天。" % (difference))
        else:
            return ('祝我生日快乐!!')
 
    def get_loveday(self):
        """用法同上"""
        today = datetime.datetime.now()
        data_str = today.strftime('%Y-%m-%d')
        oneDay = datetime.date(2022, 4, 4)
        d =  today.toordinal()-oneDay.toordinal()
        return ("我们已经相爱 %d 天。\n%d 年 %d 个月 %d 天。\n%d 个月 %d 天。\n%d 周 %d 天。" % (d,d // 365, (d % 365) // 30, (d % 365) % 30, d // 30, d % 30, d // 7, d % 7))
 
    def get_access_token(self):
        """
        获取access_token
        通过查阅微信公众号的开发说明就清晰明了了
        """
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.\
            format(self.appID, self.appsecret)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'
        }
        response = requests.get(url, headers=headers).json()
        access_token = response.get('access_token')
        return access_token
 
    def get_openid(self):
        """
        获取所有用户的openid
        微信公众号开发文档中可以查阅获取openid的方法
        """
        next_openid = ''
        url_openid = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s' % (self.access_token, next_openid)
        ans = requests.get(url_openid)
        open_ids = json.loads(ans.content)['data']['openid']
        return open_ids
 
    def sendmsg(self):  
        """
        给所有用户发送消息
        """
        url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(self.access_token)
 
        if self.opend_ids != '':
            for open_id in self.opend_ids:
                body = {
                        "touser": open_id,
                        "template_id": self.template_id,
                        "url": "https://www.baidu.com/",
                        "topcolor": "#FF0000",
                         #对应模板中的数据模板
                        "data": {
                            "frist": {
                                "value": self.dataJson.get("frist"),               
                                "color": "#FF99CC"                                  #文字颜色
                            },
                            "body": {
                                "value": self.dataJson.get("body"),
                                "color": "#EA0000"
                            },
                            "weather": {
                                "value": self.dataJson.get("weather"),
                                "color": "#00EC00"
                            },
                             "date": {
                                "value": self.dataJson.get("date"),
                                "color": "#6F00D2"
                            },
                            "last": {
                                "value": self.dataJson.get("last"),
                                "color": "#66CCFF"
                            }
                        }
                    }
                data = bytes(json.dumps(body, ensure_ascii=False).encode('utf-8'))  #将数据编码json并转换为bytes型
                response = requests.post(url, data=data)                    
                result = response.json()                                            #将返回信息json解码
                print(result)                                                       # 根据response查看是否广播成功
        else:
            print("当前没有用户关注该公众号!")
 
if __name__ == "__main__":
    sends = SendMessage()
    sends.sendmsg()

代码还有很多需要改进的地方

大佬轻喷!!!文章来源地址https://www.toymoban.com/news/detail-443553.html

到了这里,关于python微信公众号自动推送(十分简单的教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java代码 微信公众号推送(代码详细)

    用的是idea, 需要修改的地方在于这些地方改了     然后吧账号密码填写进去就好了  运行类是   Yi   这个类 非常简单 祝大家成功 ,不会的关注私聊   微信公众号测试注册地址:微信公众平台 (qq.com)  我用的模板是这个只有一个数据 ,当然这个可以自己添加  做出来的效果

    2024年02月12日
    浏览(35)
  • 微信小程序向公众号推送消息模板

    由于微信小程序长期订阅的消息模板全部失效以后,对于小程序的消息推送可以改成往公众号推。 这里将介绍如何使用小程序向公众号推送消息,并且消息可以跳转到小程序 1、微信公众平台注册 服务号 (订阅号是不可以推送的)与小程序,两者都需要认证并且 认证主体是

    2024年02月06日
    浏览(39)
  • java 实现微信公众号消息推送

    这里主要用测试账号来演示:测试账号注册地址 正式账号注册地址:微信公众平台 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则将发送失败) 参数要求规则 依赖 请求地址、appid、密钥等信息;信息配置到application配置中

    2024年02月06日
    浏览(44)
  • uniApp 微信小程序 授权 公众号推送信息

    准本工作  1.首先小程序  更公众号关联起来 2.配置相应的域名(也就是你请求后端接口的公共地址) 3.需要写一个h5 页面 用于跳板 公众号 的授权 公众号如何关联小程序? 打开微信公众号后台,选择「设置 – 公众号设置 」 [关注公众号 -打开开关  ], 步骤一 步骤二  步

    2024年02月10日
    浏览(27)
  • python+appium微信小程序/公众号自动化测试

    环境准备 调试微信公众号时,查看进程名称,公众号要先进入文章或者内部程序,小程序就进入内部程序即可 公众号和小程序的自动化不是必须要做,一般我是作为数据脚本使用 步骤 开启手机上的USB调试功能(开发者模式) 打开Chrome浏览器,地址栏输入:Chrome://inspect 直接

    2024年02月09日
    浏览(33)
  • 微信公众号配置 Token 认证以及消息推送功能

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:业务设计 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您

    2024年02月09日
    浏览(36)
  • SpringBoot整合调用微信模板方法实现微信公众号消息通知推送,Java实现微信公众号给关注用户推送自定义消息通知(手把手从0到1)

    目录 概述 公众号给关注用户推送自定义消息 一、申请公众号模板消息 二、获取安装“web开发者工具” 三、微信网页授权说明 四、微信网页授权 - 流程时序图 五、HTTPClient 实现微信公众号消息推送与发布(四步走) 六、通过weixin-java-mp SDK实现微信公众号消息推送与发布(七

    2024年02月10日
    浏览(28)
  • 微信公众号 - Java推送小程序订阅消息给用户_java 通过微信公众号发送订阅通知

    不啰嗦,我们直接开始! 本文使用体验版小程序进行调试。 1、登录微信公众平台 点开下面链接,使用微信扫码 微信公众平台 然后选择一个小程序并登录 2、在小程序后台找到Appid、AppSecret、Token、EncodingAESKey等参数 AppSecret忘记了可以自行重置 往下翻,在消息推送这儿能看到

    2024年04月26日
    浏览(38)
  • java实现 微信公众号推送消息 ,cv 就可运行!!!

    1,官网地址:申请测试公众号 地址: 微信公众平台 (qq.com) 文档地址:微信开放文档 (qq.com) 2,注册后可以查看自己的appId 和 appsecret 3,创建模板 请注意: 1、测试模板的模板ID仅用于测试,不能用来给正式帐号发送模板消息 2、为方便测试,测试模板可任意指定内容,但实际

    2024年02月08日
    浏览(29)
  • 【小程序】微信小程序关联公众号(服务号)推送通知消息

    最近开发的一个小程序项目需要通过服务号来推送通知。但是在最开始开发小程序的时候并没有考虑到这个功能。 预备知识 : 小程序openid:小程序用户的唯一id 公众号openid:公众号用户的唯一id unionid:同一用户,对同一个微信开放平台下的不同应用,unionid是相同的 准备

    2024年01月18日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包