专栏首页Mintimate's Blog【Web Function】实战使用:PHP Web函数搭建推送服务,轻松推送消息至个人微信
原创

【Web Function】实战使用:PHP Web函数搭建推送服务,轻松推送消息至个人微信

作者:Mintimate

博客:https://www.mintimate.cn

Mintimate's Blog,只为与你分享

封面

前言

Web Function,实质上就是Serverless服务的一种,可以让用户在不需要服务器情况下,使用本来需要服务器才能使用的函数、功能(如:Nginx、PHP、Node等)。

那么?实际使用是怎么样的呢?简单地说:

  • 目前来说,可以满足绝大部分用户需要。虽然还有一些需要改进的地方(如:PHP扩展模块),但是已经很方便、很完善。

本次教程(体验),就以Web Function的PHP Web函数为例,搭建一个推送服务,用于推送内容到个人(团队)的微信上。方便我们编写代码时,作为一个API接口,用到自己的项目内。

推送服务

实际上,我们这次教程使用的是方糖推送生态下的开源推送项目:

大概的逻辑,和其生态下的Server酱类似,但是更简洁:

推送服务逻辑

而方糖为了缓解服务器,对普通个人开始限制API次数;我们使用Web Function搭建API接口,服务由我们自己提供(所以不限次数),在我们的其他开发中,可以调用这个接口,对我们的个人微信进行推送

场景1:评论回复通知

在我们搭建Hexo静态博客过程中,我们服务器或静态托管平台并没有推送服务。这个时候,我们可以使用JavaScript写好评论系统,存储在远程服务器,同时使用自己的推送服务(搭建在Web Function)在其他用户评论时,博主进行提醒。实际效果:

使用效果

场景2:服务告罄通知

一般,我们开发项目,比如:图形识别、文字识别等,都是使用第三方平台提供的API接口,比如:腾讯云人工智能-图像识别,可以直接使用其API放到我们的项目中:

腾讯云API接口实现

当我们API使用次数用完,我们也可以使用我们的推送服务,推送到我们自己的微信,提醒我们及时续费。

前期准备

因为使用Web Function的原因,前期你不需要自己购买和配置Linux服务器,甚至不用配置PHP。

选择PHP函数

我们进入Web Function的页面,第一次使用需要给你当前账户权限(实际开发过程中,应该是一个腾讯云主号,按需分配子账户来权限管理)。之后,选择PHP Web Function

选择带有PHP的函数用例
确定

检查模块

根据开源推送项目wecomchan,PHP版本推送,需要:

  • JSON模块
  • CURL 模块

我们需要进行检查,依此点击:函数管理-函数代码-终端-新终端:

打开终端

之后,在终端内输入:

php -m
查看已经安装模块

确保其安装了curljson模块(一般默认有安装)。

申请微信接口

微信接口申请,实际上是申请企业微信的接口。但是个人也可以申请。(且后期可以选择推过微信接收推送,实际上不需要多下载安装一个企业微信在手机上。)

应用创建

进入企业微信官网,注册一个企业微信。创建好后。我们选择应用管理,并创建一个应用:

创建应用

获取AgentId和Secret

创建好后,我们获取应用AgentId和Secret:

获取AgentId和Secret

获取企业ID

进入我的企业页面,拉到最下边,可以看到企业ID:

企业ID

绑定个人微信

如果你并不想保留企业微信在手机上,想直接推送消息到自己的个人微信,可以进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注以后即可收到推送的消息:

绑定个人微信

编写函数

现在,我们重新回到我们刚刚创建的Web Function,重命名hello.phpindex.php,并更改引导接口:

更改

之后,我们在index.php内填写:

<?php
// config
// ======================================
define('SENDKEY', 'set_a_sendkey');
define('WECOM_CID', '企业微信公司ID');
define('WECOM_SECRET', '企业微信应用Secret');
define('WECOM_AID', '企业微信应用ID');
define('WECOM_TOUID', '@all');

// 以下配置需要有 redis 服务和 phpredis 扩展
define('REDIS_ON', false);
define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', '6379');
define('REDIS_EXPIRED', '7000');
define('REDIS_KEY', 'wecom_access_token');

// code
// ======================================

if (strlen(@$_REQUEST['sendkey'])  < 1
    || strlen(@$_REQUEST['text'])  < 1 || @$_REQUEST['sendkey'] != SENDKEY
) {
    die('bad params');
}

header("Content-Type: application/json; charset=UTF-8");
echo send_to_wecom(@$_REQUEST['text'], WECOM_CID, WECOM_SECRET, WECOM_AID, WECOM_TOUID);


function redis()
{
    if (!isset($GLOBALS['REDIS_INSTANCE']) || !$GLOBALS['REDIS_INSTANCE']) {
        $GLOBALS['REDIS_INSTANCE'] = new Redis();
        $GLOBALS['REDIS_INSTANCE']->connect(REDIS_HOST, REDIS_PORT);
    }

    return $GLOBALS['REDIS_INSTANCE'];
}

function send_to_wecom($text, $wecom_cid, $wecom_secret, $wecom_aid, $wecom_touid = '@all')
{
    $access_token = false;
    // 如果启用redis作为缓存
    if (REDIS_ON) {
        $access_token = redis()->get(REDIS_KEY);
    }

    if (!$access_token) {
        $info = @json_decode(file_get_contents("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=".urlencode($wecom_cid)."&corpsecret=".urlencode($wecom_secret)), true);
                
        if ($info && isset($info['access_token']) && strlen($info['access_token']) > 0) {
            $access_token = $info['access_token'];
        }
    }
    
    if ($access_token) {
        $url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='.urlencode($access_token);
        $data = new \stdClass();
        $data->touser = $wecom_touid;
        $data->agentid = $wecom_aid;
        $data->msgtype = "text";
        $data->text = ["content"=> $text];
        $data->duplicate_check_interval = 600;

        $data_json = json_encode($data);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $response = curl_exec($ch);
        if ($response !== false && REDIS_ON) {
            redis()->set(REDIS_KEY, $access_token, ['nx', 'ex'=>REDIS_EXPIRED]);
        }
        return $response;
    }
    
    
    return false;
}

同时,注意更改:

注意更改内容

其中的参数:

  • SENDKEY:自定义内容,类似token验证
  • WECOM_CID:上文步骤中获取的企业ID
  • WECOM_SECRET:上文步骤中获取的应用Secret
  • WECOM_AID:上文步骤中获取的应用AgentId
  • WECOM_TOUID:发送对象

部署服务

完成上述步骤后,我们点击部署即可:

部署成功

之后,使用其访问路基即可调取改API:

API

之后的使用,可以用Get/Post发起请求,请求参数为:

  • sendkey:上文自定义内容,类似token验证
  • text:需要发送到微信的消息

测试使用

部署服务后,这个API就已经可以使用了,我们可以测试一下:

测试使用
测试成功
测试成功

这样的API就算搭建完成了,大家可以应用到自己的项目里了(比如:Vue内Springboot接口等)

体验

使用Web Function,方便用户部署当一功能,进而使用某一函数或者功能。十分方便,比如本文搭建的推送服务,方便用户的工程项目,更好地和开发者进行交互。

优点

  • 快速部署,函数功能快速更新
  • 易于测试,用户不需要考虑Nginx、端口设置等问题,还可以直接前台发送Get/Post请求
  • 经济、省钱,相对于传统的租服务器,使用Web Function的价格算非常低了
  • 详细的日志功能,易于维护

欠缺

当然,目前还是有些不足(我使用时候的感受):

  • 文档太少,相对于lighthouse、CVM,Web Function的文档实在是太少了
  • 部分情况响应过慢;可能是因为还在测试的原因,有时候网页请求发出,要挺久才回应的……

当然,对于开发一个推送服务给项目开发者来说,都不是什么大问题。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java项目实现消息推送到团队微信,让项目“会说话”

    通过上述描述,大家是不是就更能理解了呢?所以,我们项目“说话”,就是让我们Java项目日常使用过程中,一些时间触发时,使用API推送消息至开发者/团队的微信,方...

    Mintimate
  • 如何利用直播源码搭建一个属于自己的直播平台呢?

    如今直播行业已经具备了成熟商业模式,那么搭建一套直播源码需要注意哪些重要的知识点呢?

    布谷安妮
  • 云开发 For Web:一站式开发下一代 Serverless Web 应用

    近两年来,Serverless 无疑是前端圈里最火热的话题之一,在各种技术峰会、各种技术文章里都能看到它的身影。如果你是一名前端开发者,一定很奇怪:

    腾讯云开发TCB
  • 【玩转腾讯云】WordPress Typecho Hexo 实现消息的及时 QQ 微信 推送

    WordPress 在有新评论的时候,可以有邮件推送,但是长老平时也不是时时刻刻都会打开邮箱看着,所以希望能够将新评论及时地推送到自己的 QQ 或者微信,以便及...

    凝神长老
  • Uniapp使用GoEasy实现websocket实时通讯

    Uniapp作为近来最火的移动端开发技术,一套代码,可以打包成Android/iOS app和各种平台的小程序,可谓是没有最方便只有更方便。

    GoEasy消息推送
  • WordPress Typecho Hexo 实现消息的及时 QQ 微信 推送

    WordPress 在有新评论的时候,可以有邮件推送,但是长老平时也不是时时刻刻都会打开邮箱看着,所以希望能够将新评论及时地推送到自己的 QQ 或者微信,以便及...

    凝神长老
  • SignalR第一节-在5分钟内完成通信连接和消息发送

    首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的...

    梁规晓
  • SignalR第一节-在5分钟内完成通信连接和消息发送

    首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的...

    梁规晓
  • SwooleDistributed:基于 Swoole 扩展的 分布式 全栈 开发框架

    PHP在Web界很出名,网站的建设大多数都是使用PHP开发的,但是不是PHP就仅仅限制于Web开发了呢?在Swoole扩展出来之前PHP似乎确实只能在Web建站...

    用户1246234
  • 实时Web与WebSocket实践

    为什么实时Web这么重要?我们生活在一个实时(real-time)的世界中,因此Web的最终最自然的状态也应当是实时的。用户需要实时的沟通、数据和搜索。我们对互...

    博文视点Broadview
  • Serverless 开发实战之Nodejs:三分钟开发新冠病毒疫情查询网

    随着 Serverless 生态的不断成熟,越来越多开发者使用 Serverless 架构构建自己的业务,Serverless 的典型适用场景有哪些?怎样借助...

    腾讯云serverless团队
  • Serverless 开发实战之Nodejs

    抗击疫情,腾讯云在行动。Serverless(无服务架构)被誉为下一代云计算技术,自概念推出以来,因为能带来研发交付速度提升与成本的降低在业内异常火爆。将随着 ...

    可可爱爱没有脑袋
  • 丢丢:腾讯云上实践 SNG MINI 项目

    作为 SNG 应届生入职的传统,都会参加 SNG 的 mini 项目,每组大概10人,在短短10天的时间里开发一个相对完善的 APP。这对整个团队来说是一件十分...

    宋翔
  • ThinkPHP5.1 使用 web-msg-sender 实现WEB消息推送实例讲解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    泥豆芽儿 MT
  • 【玩转腾讯云】征文活动获奖名单公布

    由云+社区联合腾讯云免费体验馆及各产品团队举办【玩转腾讯云】征文活动,吸引入驻作者积极参加,非常感谢各位作者的参与。经过评委老师从产品创新性、实用性、可借鉴性、...

    云加社区
  • 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友、微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好...

    GoEasy消息推送
  • 20个海外Web和App推送通知服务工具

    在App和网站中使用推送通知有不同的原因,并且在提高流量和与客户互动方面有很多好处。推送通知是一种交互式可点击消息,可将访问者直接引导至你的网站。它们可以帮助你...

    Blue姐
  • 教你如何在小程序中快速搭建直播带货聊天室——接入篇

    即时通信(Instant Messaging,IM)基于QQ 底层 IM 能力开发,仅需植入 SDK 即可轻松集成聊天、会话、群组、资料管理能力,帮助您实现文字...

    腾讯即时通信IM
  • Spring Cloud微服务在花椒直播的实践

    微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好...

    用户5927304

扫码关注云+社区

领取腾讯云代金券