如何将定时任务完成情况推送到微信消息

摘要: 还在用第三方推送工具?教你用企业微信自建应用,实现无限制的消息推送服务。更有针对家庭宽带动态IP的终极绕过方案!


做自动化、跑定时任务、挂NAS或者写监控脚本的朋友,都会遇到一个刚需:怎么让脚本在运行结束后,把结果自动发到我的微信上?

目前市面上有不少第三方推送平台,比如 Server酱、PushPlus(貌似现在不能用了) 等。它们接口简单,但大多有免费额度限制 。如果你的脚本跑得比较频繁,或者对隐私要求极高,第三方平台往往捉襟见肘。

今天,就教教大家一种最正规、最稳定且免费 的方案:使用企业微信自建应用 。不仅没有任何发送条数限制,而且消息直接由腾讯官方下发,体验极佳。


准备工作:在企业微信创建应用

很多人的误区是“注册企业微信需要营业执照”。其实不需要!个人完全可以免费注册一个企业微信 。

  1. 注册企业微信: 注册地址:https://work.weixin.qq.com/wework_admin/register_wx,填入信息并扫码绑定管理员微信:

图片注册企业微信
2. 创建应用: 登录企业微信网页版后台,在“应用管理 – 自建”中创建一个应用。

图片应用管理-创建应用

上传应用logo和命名,如“服务通知”

图片应用管理-创建应用
3. 获取核心参数:

 * ` CorpId`(在“我的企业”中获取)

图片CorpId获取
* Secret(在自建应用详情页发送到企业微信获取)

 * `AgentId`(在自建应用详情页获取)

图片AgentId和Secret获取

注意:Secret是发送到企业微信,这里需要安装企业微信并登录才能获取到:

图片 企业微信接收Secret

这里我拿到了三个值:CorpId(ww9d30674c8fb35728),AgentId(1000002)和Secret(5DdR9WnOJ5KMuQSwhw7oxm_c5izToVh2nwsefzfT3p8)

  1. 在个人微信接收消息: 在“我的企业” ,“微信插件”,用你的个人微信 扫码关注。这样,以后应用发出的消息,就会直接推送到你的个人微信对话框里 !

图片微信插件扫码关注


难点:官方的安全拦截怎么破?

直接用以上信息给微信发送消息会出现推送失败,60020错误:

 推送失败: {'errcode': 60020, 'errmsg': 'not allow to access from your ip, hint: [1774076770194831599883132], from ip: 211.92.30.96, more info at https://open.work.weixin.qq.com/devtool/query?e=60020'}

因为,现在推送需要设置企业可信IP才能正常推送,否则接口直接报错拦截 。这对于使用家庭宽带(动态IP)跑脚本的个人玩家来说,公网IP变更就需要重新填写一次可信IP 。

解法:借助带有固定 IP 的虚拟主机/云服务器做一个“中转站”。

下面直接上干货代码!


第一步:企业微信 URL 验证

进入应用管理-自建的应用,配置企业可信IP时, 需要配置 设置接收消息服务器URL 并能正确解密它发来的 echostr 才能填写可信 IP 。

图片配置可信IP

验证URL:

图片配置验证URL

URL填写你自己虚拟主机+verify.php,示例:http://52kds.cc.cd/verify.php

EncodingAESKey点击随机获取并填入到verify.php文件的$AES_KEY值,verify.php文件代码如下:

<?php  
// verify.php

// 填写你在企业微信后台“随机获取”到的 EncodingAESKey (43个字符)  
$AES_KEY = "GwjAyjeBtzQHgP4zf6ab98AG1w5LA4fJVvIn2cZOHSG";

// 接收企业微信 GET 请求中的参数  
$echostr = $_GET['echostr'] ?? '';

// 如果没有传递 echostr,直接返回 ok  
if (empty($echostr)) {  
    echo"ok";  
    exit;  
}

try {  
    // 1. 对 echostr 中的空格进行还原(URL传输时加号可能会变成空格)  
    $echostr = str_replace(' ', '+', $echostr);

    // 2. 对 AESKey 进行 Base64 解码  
    $key = base64_decode($AES_KEY . "=");

    // 3. 对企业微信发来的密文 echostr 进行 Base64 解码  
    $aes_msg = base64_decode($echostr);

    // 4. 获取 AES 解密的 IV (初始向量),即 key 的前 16 字节  
    $iv = substr($key, 0, 16);

    // 5. 使用 openssl 进行 AES-256-CBC 解密  
    // 注意:OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING 用于处理自定义的 PKCS[#7](javascript:;) 补位  
    $decrypted = openssl_decrypt($aes_msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

    if ($decrypted === false) {  
        echo"error: decrypt failed";  
        exit;  
    }

    // 6. 去除 PKCS[#7](javascript:;) 补位字符  
    $pad = ord(substr($decrypted, -1));  
    if ($pad < 1 || $pad > 32) {  
        $pad = 0;  
    }  
    $content = substr($decrypted, 16, -$pad);

    // 7. 提取明文字符串长度并截取明文  
    // 企业微信的包头:前16字节是随机串,接下来的4字节是内容长度(网络字节序/大端)  
    $content_len_bytes = substr($content, 0, 4);  
    $msg_len = unpack('N', $content_len_bytes)[1]; // 'N' 代表无符号长整型(大端字节序)  
      
    // 8. 截取真正的明文内容  
    $real_echostr = substr($content, 4, $msg_len);

    // 9. 输出明文给企业微信完成验证  
    echo $real_echostr;

} catch (Exception $e) {  
    echo"error: " . $e->getMessage();  
}  
?>

把这个文件传到网站目录,在企业微信可信IP的URL验证填入该文件的访问链接,点击保存,瞬间就能验证通过!

图片验证成功


第二步:部署专属中转 API(解决动态IP)

既然本地公网 IP 老是变,那我们就把发微信的活儿交给固定 IP 的服务器来做。我们在虚拟主机上再放一个 send_msg.php,并加上一个简单的密码校验 防止别人蹭你的接口 。

<?php  
// send_msg.php

header('Content-Type: application/json; charset=utf-8');

// ================= 安全配置 =================  
// 设定你的专属 API 密码(尽量复杂一点,比如随机生成的字符串)  
$my_secret_token = "secret_key";   
// ============================================

// 1. 安全拦截:获取请求发来的 Token 进行比对  
// 这里我们从 JSON 数据体中提取 token  
$input_data = json_decode(file_get_contents('php://input'), true);

$client_token = $input_data['token'] ?? '';  
if ($client_token !== $my_secret_token) {  
    // 如果密码不对,直接返回 403 错误并终止脚本  
    http_response_code(403);  
    echo json_encode(['status' => 'error', 'msg' => '非法请求:Token验证失败!']);  
    exit;  
}

// 2. 获取消息内容(验证通过后才执行到这里)  
$content = $input_data['message'] ?? '【空消息】';  
if (empty($content)) {  
    echo json_encode(['status' => 'error', 'msg' => '消息内容不能为空']);  
    exit;  
}

// ================= 替换为你的企业微信配置 =================  
$corp_id = "ww9d30674c8fb35728";            
$secret = "5DdR9WnOJ5KMuQSwhw7oxm_c5izToVh2nwsefzfT3p8";         
$agent_id = "1000002";          
$to_user = "@all";  // 或者填 "@all" 发给所有人  
// =========================================================

// 3. 获取企业微信 access_token  
$token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$corp_id}&corpsecret={$secret}";  
$token_res = json_decode(file_get_contents($token_url), true);

if (!isset($token_res['access_token'])) {  
    echo json_encode(['status' => 'error', 'msg' => '获取企业微信Token失败', 'data' => $token_res]);  
    exit;  
}  
$access_token = $token_res['access_token'];

// 4. 构建发送给企业微信的数据  
$send_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={$access_token}";  
$post_data = [  
    "touser" => $to_user,  
    "msgtype" => "text",  
    "agentid" => $agent_id,  
    "text" => [  
        "content" => $content  
    ],  
    "safe" => 0  
];

// 5. 使用 cURL 发送请求  
$ch = curl_init($send_url);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_POST, true);  
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data, JSON_UNESCAPED_UNICODE));  
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

$msg_res = curl_exec($ch);  
curl_close($ch);

// 6. 返回企业微信的响应结果  
echo $msg_res;  
?>

部署好后,别忘了在企业微信后台的“企业可信 IP”里,填上你这台虚拟主机的 IP!

如我虚拟主机IP为 103.137.185.66,在自建应用的可信IP填入103.137.185.66

图片填入可信IP


第三步:在本地随时随地调用

现在,无论你的脚本跑在树莓派、本地电脑还是各种动态 IP 环境中,再也不用管企业微信那些复杂的配置了。以 Python 为例,只需发起一个简单的 POST 请求 :

import requests

# 1. 你的 PHP 接口地址  
PHP_API_URL = "http://52kds.cc.cd/send_msg.php"

# 2. 这里的 Token 必须和 PHP 里设置的 $my_secret_token 一模一样  
API_TOKEN = "secret_key"

def send_to_php(content):  
    # 构建包含 token 和 message 的数据包  
    payload = {  
        "token": API_TOKEN,  
        "message": content  
    }  
      
    try:  
        # 发送请求,设定 5 秒超时,防止卡死脚本  
        response = requests.post(PHP_API_URL, json=payload, timeout=5)  
          
        # 检查 HTTP 状态码  
        if response.status_code == 200:  
            print("✅ 消息发送成功!返回结果:", response.text)  
        elif response.status_code == 403:  
            print("❌ 消息发送失败:Token 密码错误,被服务器拒绝!")  
        else:  
            print(f"❌ 请求失败,状态码: {response.status_code}")  
              
    except requests.exceptions.Timeout:  
        print("❌ 请求超时,请检查虚拟主机网络或接口地址是否正确。")  
    except Exception as e:  
        print("❌ 发生其他错误:", e)

if __name__ == "__main__":  
    message = "【安全通知】\n带安全验证的 PHP 接口测试成功!\n服务器状态:安全。"  
    send_to_php(message)

只需 3 秒钟,你的个人微信就能收到一条干净利落的系统通知。

图片微信接收到信息

后面需要通知的地方使用requests post 即可将message推送到微信了,例如我的自动更新IPTV通知项目:

图片自动更新IPTV系统通知

总结

通过 企业微信自建应用 + PHP 中转接口 的方式,我们完美避开了动态 IP 的限制,同时给接口加了一把“安全锁”。这个方案一次配置,终身受用,对于喜欢折腾服务器、NAS 和自动化脚本的玩家来说,绝对是现阶段的最佳实践!相关源码回复【260321】获取。

💡 觉得有帮助的话,别忘了点个“在看”和“赞”!你的支持是我持续分享干货的最大动力!



📚 往期精彩文章推荐


🌟 与你互动

嗨~这里是【医工学习日志】的温暖小窝!
📩 随时戳一戳 :后台留言任何问题,树树会带着光速回复闪现!
💡 奇思妙想征集令
👉 遇到有趣资源?戳我分享!
👉 想看的硬核测评?甩题过来!
🔥 你的脑洞,可能成为下期爆款文章哦~

如需商务,请加V注明来意,不闲聊:

图片



📝 栏目信息
策划编辑 ✨ 树树 ✨

技术支撑 @恩山无线论坛 & Github & 瀚思彼岸


📜 版权声明
内容说明:

  1. 原创文章转载请私信授权;

  2. 部分素材源自网络,版权归属原作者;

  3. 如觉侵权,请凭权属证明联系删除

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部