# 如何下载微信公众号接收用户发送的消息中的图片
在前一篇文章已经知道,接收消息是XML格式
Msgtype有几种类型 文本消息 图片消息 语音消息 视频消息 小视频消息 地理位置消息 (可以用来打卡) 链接消息
点击这里查看微信文档 (opens new window)
我们再看这里图片消息xml中的picurl,mediaid部分
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
1
2
2
那下载这个图片就有两个方法了 1 使用picurl来下载 2 根据MediaId用微信临时素材接口下载
# 方法一:使用picurl来下载
cUrl=this.getkeyvalue(MsgText,"PicUrl")
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
Qiyu_HttpClient.DataType="bin" &&数据类型 string 字符串 bin 二进制流
cReturn= Qiyu_HttpClient.Send(cUrl)
If Isnull(cReturn)
?Qiyu_HttpClient.msg
Else
STRTOFILE(cReturn,SYS(2015)+".jpg")
Endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 方法二 根据MediaId 获取
我已经将调用api封装成类库了。
cMediaId=This.getkeyvalue(MsgText,"MediaId")
oMedia=This.getMedia(cMediaId) &&返回对象
IF ISNULL(oMedia)
ERROR this.msg
ENDIF
?"文件名",oMedia.filename
Strtofile(oMedia.filedata,oMedia.filename) &&多媒体数据
1
2
3
4
5
6
7
2
3
4
5
6
7
以上两个方法有什么区别,一个是压缩过的图,一个是原图。
附两个过程,大家没有框架的,可以按这个思路去实现。有框架的当然就直接用啦。
getkeyvalue过程方法
Procedure getkeyvalue
Lparameters cMsgText,cKey
If Pcount()<2
Error "必须传入两个参数"
Endif
Set Textmerge Delimiters To "{" , "}"
TEXT TO leftchar NOSHOW TEXTMERGE PRETEXT 1+2
<{cKey}><![CDATA[
ENDTEXT
TEXT TO rightchar NOSHOW TEXTMERGE PRETEXT 1+2
]]></{cKey}>
ENDTEXT
Set Textmerge Delimiters
Return Strextract(cMsgText ,leftchar,rightchar,1,1)
Endproc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
getMedia过程方法
*--获取媒体资源,返回对象(filename 文件名,filedata文件数据)
Procedure getMedia
Lparameters cMEDIA_ID
Local cUrl,lcResult,oFly
TEXT TO curl NOSHOW TEXTMERGE PRETEXT 1+2+4+8
https://api.weixin.qq.com/cgi-bin/media/get?access_token=<<this.token>>&media_id=<<cMEDIA_ID>>
ENDTEXT
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
Qiyu_HttpClient.DataType="bin" &&数据类型 string 字符串 bin 二进制流
lcResult= Qiyu_HttpClient.Send(cUrl)
If Isnull(lcResult)
This.msg=Qiyu_HttpClient.msg
Return .Null.
Endif
oFly=Createobject("empty")
AddProperty(oFly,"filename",Qiyu_HttpClient.filename)
AddProperty(oFly,"filedata",lcResult)
Return oFly
Endproc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22