主动发送消息
企业微信主动发送消息没有48小时的限制,而发送次数也几乎不受限制。
主动发送消息的时候,要指定应用ID(AgentID)。
主动发送文本消息
可以直接向用户列表发送,例如下面的代码向账号为"laoliu"和"zhangsan"的用户发送消息:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "text"
jo("agentid")
= 9
jo("text")
= New
JObject
jo("text")("content")
= "您好,这是测试信息"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
注意这里的"laoliu"和"zhangsan"并非OpenId,而是
企业微信通讯录中的用户账号(UserID)。
也可以按部门或标签发送,下面的代码会给两个部门(部门ID分别为3和9)的所有成员发送消息:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("toparty")
= "9|3"
jo("msgtype")
= "text"
jo("agentid")
= 9
jo("text")
= New
JObject
jo("text")("content")
= "您好,这是测试信息"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
接下来的的例子,都只提供向用户列表发送的示例代码。
主动发送普通图文消息
下面是主动发送普通图文消息的示例,你可以在命令窗口运行测试:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
Dim
ja As
New
JArray
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "news"
jo("agentid")
= 9
For
i As
Integer = 1
To 1
'可以一次发送最多8个图文消息,这里只发送了1个
Dim ao
As New
JObject()
ao("title")
= "特朗普提名保守派大法官"
'标题
ao("description")
= "特朗普在白宫提名尼尔·戈萨奇为美国最高法院大法官"
'描述
ao("url")
= "http://news.ifeng.com/a/20170201/50640529_0.shtml"
'连接
ao("picurl")
=
"https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=1632653074,1222564348&fm=80&w=179&h=119&img.JPEG"
'图片
ja.Add(ao)
Next
jo("news")
= New JObject()
jo("news")("articles")
= ja
hc.Content
= jo.ToString()
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
准备素材
不管是被动回复还是主动发送,除了文本和动态图文消息,其它要发送给用户的消息,包括图片、视频、语音以及永久图文消息,都必须事先将相关文件上传到微信服务器。
因为微信服务器并不会直接给用户发送文件,而是发送一个素材ID(MediaId),每一个素材ID都对应者一个素材文件。
关于素材的管理,请参考后面的《素材接口》这一章。
主动发送图片消息
必须事先将要发送的图片上传到微信服务器,因为我们发送的只能是图片素材的ID,无法直接发送文件。
主动发送图片消息参考代码:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "image"
jo("agentid")
= 9
jo("image")
= New
JObject
jo("image")("media_id")
=
"2UgIup9iQcz60YIjrpxPFSUTYoPdTAqCz52PXUruWM6isWNdPOQwRgPY3lzJmsKLxPeSWqLMUMREyg9K-4MO8bg"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
主动发送语音消息
必须事先将要发送的语音上传到微信服务器,因为我们发送的只能是语音素材的ID,无法直接发送文件。
主动发送语音消息参考代码:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "voice"
jo("agentid")
= 9
jo("voice")
= New
JObject
jo("voice")("media_id")
=
"20U2cc1RA4G8ZOU573NDgQlF0BsBHtiyl5FfxkxUc5jbZxFZqqsD3Ab2AGywhU-s-SP6Jgjs76RciJfWZQ68OVg"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
主动发送视频消息
必须事先将要发送的视频上传到微信服务器,因为我们发送的只能是视频素材的ID,无法直接发送文件。
主动发送视频消息参考代码:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "video"
jo("agentid")
= 9
jo("video")
= New
JObject
jo("video")("media_id")
=
"24rRqRLyJMJXT-FAtspbOc1pkPwZleQ9t6PRBMK-hQY-0pPjSRmWQUUGjTda_pVn0SwbFGzjX4DtONQNqCQe7rg"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
主动发送文件消息
相对于公众号,企业微信可以发送普通的文件消息,这一点优势非常明显,例如我们可以直接向用户发送Excel和Word报表。
必须事先将要发送的文件上传到微信服务器,因为我们发送的只能是文件素材的ID,无法直接发送文件。
主动发送文件消息参考代码:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New JObject
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "file"
jo("agentid")
= 9
jo("file")
= New JObject
jo("file")("media_id")
=
"2LidksRrG1ybDoGS2fvGIaT0yZtTqYqn7zXT_5kJ4FptZhLB2EX25FQ15UAnn24583CHK_1F8QttulZ6YCZJd5w"
hc.Content
= jo.ToString
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
主动发送mpnews图文消息
mpnews类型的图文消息,跟普通的图文消息一致,唯一的差异是图文内容存储在企业微信。多次发送mpnews,会被认为是不同的图文,阅读、点赞的统计会被分开计算。
主动发送mpnews类型图文消息的参考代码:
Dim
ur As
String =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim
hc As
new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
Dim
ja As
New
JArray
jo("touser")
= "laoliu|zhangsan"
jo("msgtype")
= "mpnews"
jo("agentid")
= 9
For
i As
Integer = 1
To 1
'可以一次发送最多8个图文消息,这里只发送了1个
Dim ao
As New
JObject()
ao("title")
= "标题,不超过128个字节"
'标题
ao("content")
= "图文消息的内容,支持html标签,不超过666
K个字节。"
ao("thumb_media_id")
=
"eHDdfBQmRtOJ-PtkD6WENiWR_BUO5GO3cWv7uZAGbIk"
'图文消息缩略图的media_id,
可以通过素材管理接口获得。
ao("content_source_url")
= "http://www.foxtable.com/"
'点击“阅读原文”之后的页面链接
ao("author")
=
"图文消息的作者"
ao("digest")
=
"图文消息的描述,不超过512个字节,超过会自动截断"
ja.Add(ao)
Next
jo("mpnews")
= New JObject()
jo("mpnews")("articles")
= ja
hc.Content
= jo.ToString()
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End
If
主动发送文本卡片消息
卡片消息的展现形式非常灵活,支持使用br标签或者空格来进行换行处理,也支持使用div标签来使用不同的字体颜色,目前内置了3种文字颜色:灰色(gray)、高亮(highlight)、默认黑色(normal),将其作为div标签的class属性即可,具体用法请参考下面的代码:
Dim ur As String = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}"
Dim hc As new HttpClient(Cexp(ur,Functions.Execute("GetQYAccessToken")))
Dim jo As New JObject
jo("touser") = "zhangsan"
jo("msgtype") = "textcard"
jo("agentid") = 1000004
jo("textcard") = New JObject
jo("textcard")("title") = "升级通知"
jo("textcard")("description") = "<div class=""highlight"">Foxtable 2022 Preview发布</div>.<br>时隔7年回归本质,补上Foxtable在数据管理上的最后一个短板."
jo("textcard")("url") = "http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=171144"
hc.Content = jo.ToString
jo = JObject.Parse(hc.GetData)
If jo("errcode") = "0" Then
MessageBox.show("消息发送成功!")
Else
MessageBox.show(jo.ToString)
End If