主动发送消息

企业微信主动发送消息没有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


本页地址:http://www.foxtable.com/mobilehelp/topics/0166.htm