企业微信并不支持发送远程url图片,想发图片的话需要从本地上传图片到临时素材,获取素材id才能调用发图接口发送图片。在网上查了一些经验资料,成功实现调用图片资源远程url链接,上传到企业微信的临时素材,并返回素材ID,在这里记录一下折腾过程。
折腾背景
因为做了个企业微信机器人,想利用企业微信机器人发送图片。但是企业微信并不支持发送远程url图片,想发图片的话需要从本地上传图片到临时素材,获取素材id才能调用发图接口发送图片。
在网上查了一些经验资料,成功实现调用图片资源远程url链接,上传到企业微信的临时素材,并返回素材ID,在这里记录一下折腾过程。
安装Guzzle
Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。
具有以下特点:
- 接口简单:构建查询语句、POST请求、分流上传下载大文件、使用HTTP cookies、上传JSON数据等等。
- 发送同步或异步的请求均使用相同的接口。
- 使用PSR-7接口来请求、响应、分流,允许你使用其他兼容的PSR-7类库与Guzzle共同开发。
- 抽象了底层的HTTP传输,允许你改变环境以及其他的代码,如:对cURL与PHP的流或socket并非重度依赖,非阻塞事件循环。
- 中间件系统允许你创建构成客户端行为。
在网站根目录执行命令拉取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"));
?>
效果
效果如下:
同理,上传文件,视频,声音应该也可以(没试过)
完结!