企业微信并不支持发送远程url图片,想发图片的话需要从本地上传图片到临时素材,获取素材id才能调用发图接口发送图片。在网上查了一些经验资料,成功实现调用图片资源远程url链接,上传到企业微信的临时素材,并返回素材ID,在这里记录一下折腾过程。

折腾背景

因为做了个企业微信机器人,想利用企业微信机器人发送图片。但是企业微信并不支持发送远程url图片,想发图片的话需要从本地上传图片到临时素材,获取素材id才能调用发图接口发送图片。
在网上查了一些经验资料,成功实现调用图片资源远程url链接,上传到企业微信的临时素材,并返回素材ID,在这里记录一下折腾过程。

安装Guzzle

Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。
具有以下特点:

  1. 接口简单:构建查询语句、POST请求、分流上传下载大文件、使用HTTP cookies、上传JSON数据等等。
  2. 发送同步或异步的请求均使用相同的接口。
  3. 使用PSR-7接口来请求、响应、分流,允许你使用其他兼容的PSR-7类库与Guzzle共同开发。
  4. 抽象了底层的HTTP传输,允许你改变环境以及其他的代码,如:对cURL与PHP的流或socket并非重度依赖,非阻塞事件循环。
  5. 中间件系统允许你创建构成客户端行为。

在网站根目录执行命令拉取guzzle

composer require guzzlehttp/guzzle

使用方法

<?php

require './vendor/autoload.php';
use GuzzleHttp\Client;

class UpMedia{
    
    function upload($url,$access_token){
        $client = new Client(["timeout" => 2.0]);
        $up_api = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?type=image&access_token=" . $access_token;
        $file_name = md5(time());
        $response = $client->request('POST', $up_api, [
            'multipart' => [
                [
                    'name' => 'media',
                    "filename"=>$file_name,
                    'contents' =>file_get_contents($url),
                    'headers' => [
                        'Content-Type' => 'image/jpg'
                    ]
                ]
            ]
        ]);
        
        $res_data = $this->obj_json(json_decode($response->getBody()));
        return $res_data;
    }
    
    /**
    * 把对象转化为数组
    */
    function obj_arr($obj){
        if(is_array($obj)){
            return $obj;
        }
        $_arr = is_object($obj)? get_object_vars($obj) :$obj;
        foreach ($_arr as $key => $val){
            $val=(is_array($val)) || is_object($val) ? $this->obj_arr($val) :$val;
            $arr[$key] = $val;
        }
        return $arr;
    }
    
    /**
    * 把对象转化为json
    */
    function obj_json($obj){
        $arr2=$this->obj_arr($obj);//先把对象转化为数组
        return json_encode($arr2);
    }
    
}

在需要上传图片的地方调用以下:

<?php
$up = new UpMedia();
print_r($up->upload("图片url","tocken"));
?>

效果

效果如下:

同理,上传文件,视频,声音应该也可以(没试过)

完结!