zl程序教程

您现在的位置是:首页 >  后端

当前栏目

手把手教你使用云产品实现抖音同款微信早安推送(腾讯云Python版本)

Python微信腾讯产品 实现 版本 手把手 推送
2023-09-11 14:21:46 时间

大家好,我是小白

当我发完上一篇文章后,后台有很多小伙伴私信我说 自己没有云服务器,可以实现这个功能吗?

答案是肯定的!

老规矩,先上效果图!

是不是很赞👍

其实实现这个功能很简单,具体可以参考我的上一篇文章

最近抖音女友早安很火,那我也来跟个风,教程来咯(Python版)

虽然可以实现这个功能,但是大多数同学限制于没有服务器,因此无法继续操作

那么,这篇文章我将解决这个问题,只要有微信、百度或者支付宝或者华为其中一个账号即可

说到这儿,相信部分同学已经知道了要使用什么去实现了,没错,今天我要使用云产品实现上篇文章中的微信推送功能

免费!免费!免费!

在正式开始前,还是希望各位可以先去阅读一下上一篇文章,以免在接下来的描述中出现各种问号

链接:最近抖音女友早安很火,那我也来跟个风,教程来咯(Python版)

获取要使用的代码

代码地址: https://gitee.com/mxbai/say_good_morning

首先,需要将代码从我的Gitee仓库拉取到你本地,有两种办法,如下:

  • 如果你不是一位开发人员,或者电脑上没有 Git 工具,那么你只需要将上述地址中的 say_good_morning.py 文件内容复制粘贴到你本地,也可以按下图方式将该文件下载至你本地电脑

  • 如果你是一名开发同学,那可就很简单了,只需要打开你电脑的命令行,执行以下命令即可。请确保你的电脑已经安装了Git,否则会失败
git clone https://gitee.com/mxbai/say_good_morning.git

修改相应的配置

使用文本编辑器工具打开 say_good_morning.py,同样,按照我上一篇文章或Git中的描述将以下几个值改为自己的数据就可以了

  • appId 该值为你的微信公众平台测试号的appId
  • appSecret 该值为你的微信公众平台测试号的appSecret
  • user_open_ids 该值为你的微信公众平台测试号用户列表中的微信号
  • user_dict 按照代码中的格式修改
  • weather_url 对应的值可以在 https://www.yiketianqi.com/ 网址进行获取
  • yiju_url 对应的值可以在 https://www.mxnzp.com/ 网址进行获取

创建云函数

以下内容请认真阅读

打开任意一个云产品,此处以腾讯云为例

腾讯云 云函数SCF:https://cloud.tencent.com/product/scf
阿里云 函数计算FC:https://www.aliyun.com/product/fc
百度云 函数计算CFC:https://cloud.baidu.com/product/cfc.html

打开腾讯云,鼠标悬停在产品上,搜索 云函数,如下:

点击结果,跳转至都对应页面,如下图:

点击立即体验

点击前往控制台

随后点击左侧的函数服务,点击创建,新建一个函数

云函数基础配置

在基础配置中,函数类型选择 事件函数,函数名称可以随意写,但是注意只允许为英文;地域选择 北京 或者其他城市;运行环境选择 Python 3.7或更高版本

函数代码

在函数代码中,提交方法和执行方法都为默认即可,无需特殊改动

在代码编辑器中,将之前修改完的代码,粘贴进来

完整代码见文末

这里需要注意以下几点

第一行的编码类型切勿删除
将原代码中除 getDiffDays() 方法之外的所有代码全部放在编辑器原有的 main_handler()方法中,切记要有缩进
原有方法 main_handler(event, context) 中的两个默认入参务必保留,即使你未使用到

云函数高级配置

在高级配置中,保持默认即可

在触发配置中,触发方式选择定时触发,定时任务名称可以随意写,触发周期可以按需选择,此处我选择 自定义触发周期,Cron表达式按其要求格式填写(参考https://cloud.tencent.com/document/product/583/9708)

填写完成后点击完成即可

测试云函数

完成后,依次点击 函数管理 -> 函数代码 点击左下角的 测试按钮进行云调试,控制台输出以下内容且微信有收到消息推送即表示成功

错误解决

如果出现以下报错,请按下面的方式进行处理

依次点击 函数管理 -> 函数代码 -> 终端 -> 新终端

在代开的终端中输入以下命令回车即可

pip3 install requests -t ./src

此步骤是手动将 requests 模块进行安装

目前仅发现腾讯云云函数需要手动安装模块,百度云和阿里云并未发现该问题

大功告成

到此,我们就摆脱了云服务器的束缚,使用免费云产品实现定时发送微信消息

好了,今天的内容就到此结束,有任何问题请 评论区留言 或者 后台私信


完整代码如下,请按需修改

# -*- coding: utf8 -*-
import json
import random
import requests
import datetime as dt

# 获取日期间隔函数
def getDiffDays(date1, date2):
    date1 = dt.datetime.strptime(date1, '%Y-%m-%d')
    date2 = dt.datetime.strptime(date2, '%Y-%m-%d')
    days = (date2 - date1).days
    return days


def main_handler(event, context):
    # 自己微信公众号的 appId 和 appSecret
    appId = ''
    appSecret = ''

    # 微信公众号请求 url
    wxgzh_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret

    # 获取微信 access_token
    access_token_json = requests.get(wxgzh_url).json()
    access_token = access_token_json['access_token']

    # 用户 open_id 列表
    user_open_ids = ['']

    # 获取今天的日期
    today = str(dt.datetime.today())[:10]
    # 用户字典
    user_dict = {
        '': {
            # birthday格式:yyyy-MM-dd
            'birthday': '',
            'city': '北京'
        },
        '': {
            'birthday': '',
            'city': '上海'
        }
    }

    # 获取天气信息
    """
    获取地址:http://www.tianqiapi.com/ 
    参考返回
    {'nums': 7, 'cityid': '101010100', 'city': '北京', 'date': '2022-08-22', 'week': '星期一', 'update_time': '14:44', 'wea': '多云', 'wea_img': 'yun', 'tem': '32', 'tem_day': '32', 'tem_night': '19', 'win': '北风', 'win_speed': '2级', 'win_meter': '9km/h', 'air': '27', 'pressure': '998', 'humidity': '32%'}
    """
    weather_url = 'https://www.yiketianqi.com/free/day?appid=&appsecret=&unescape=1&city='
    weather_text = requests.get(weather_url).json()

    # 每日一句
    yiju_url = 'https://www.mxnzp.com/api/daily_word/recommend?count=10&app_id=&app_secret='
    yiju_text = requests.get(yiju_url).json()

    # 这是一句话 可以自行修改
    message = ''

    # 自己的模板 ID
    template_id = ''

    # 以下代码请勿修改
    # 循环发送消息
    for user in user_open_ids:
        # 获取用户信息
        user_info = user_dict[user]
        # 用户所在城市
        user_city = user_info['city']
        user_bir = user_info['birthday']

        user_weather_url = weather_url + user_city
        # 用户所在城市的天气信息
        user_weather_text = requests.get(user_weather_url).json()
        # 获取该用户还有多少天生日
        diff_bir = str(getDiffDays(today, user_bir))
        # 组装请求参数
        req_data = {
            'touser': user,
            'template_id': template_id,
            'data': {
                'first': {
                    'value': message,
                    'color': "#f00"
                },
                'data1': {
                    'value': user_weather_text['date'],
                    'color': "#000"
                },
                'data2': {
                    'value': user_weather_text['week'],
                    'color': "#000"
                },
                'data3': {
                    'value': user_weather_text['tem'],
                    'color': "#FF8800"
                },
                'data4': {
                    'value': user_weather_text['city'],
                    'color': "#000"
                },
                'data5': {
                    'value': user_weather_text['wea'],
                    'color': "#000"
                },
                'data6': {
                    'value': user_weather_text['tem_night'],
                    'color': "#00BBFF"
                },
                'data7': {
                    'value': user_weather_text['tem_day'],
                    'color': "#FF0000"
                },
                'data8': {
                    'value': user_weather_text['win'],
                    'color': "#00AA55"
                },
                'data9': {
                    'value': user_weather_text['win_speed'],
                    'color': "#00AA55"
                },
                'data10': {
                    'value': diff_bir,
                    'color': "#FF0000"
                },
                'data11': {
                    'value': yiju_text['data'][random.randint(1, 10)]['content'],
                    'color': "#FF0000"
                }
            }
        }

        '''
        数据转换,发送请求
        '''
        json_data = json.JSONEncoder().encode(req_data)
        url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + access_token
        res = requests.post(url, data=json_data)
        res_text = json.JSONDecoder().decode(res.text)
        if res_text['errcode'] == 0:
            print(f'用户 {user} 发送成功')