00:00
我们来首先呢,还是要打开我们的微信公众号,我们呢接下来呢,去开发几个常见的一些接口啊,啊在这里面呢,会有一些接口会比较麻烦啊,当然呢,也有一些接口呢,或者说绝大部分接口呢,都比较简单,我们呢就挑几个呢,比较复杂的一些东西,我们把它写一写,然后呢,再把这些功能呢,相似的功能呢进行一些合并处理,看一下咱们在生产,咱们在今后开发过程中,我们该如何去处理好这些事情啊,咱们呢,首先打开咱们的开发者文档,打开之后呢,我们现在呢,去开发一个接口叫做素材管理,那大家有没有去看过这个接口的一些常见的配置。好,我们来看一下啊,我们来看一下,首先呢,看一下这个新增临时素材啊,这一块呢,可能会比较简单,首先我们看一下这个新增临时素材是干嘛用的,我们用的啊,它呢,这里面呢,我们来看一下我们之前写的那个代码,我们在回复用户消息的时候有六种类型,是不是,其中像test文本它呢,我什么都没有设置,只要把这个相应的设置好就可以回复了,还有我的最后一个news,我家设置title出图片的地址和这个跳转地址,我也能够做好,是不是,哎,但是呢,其他四种类型就不行了,其他四种类型呢,或多或少的都需要一个参数叫做。
01:30
Media ID是不是这个media ID呢?它是什么东西呢。诶,这个东西呢,就是我到时候呢,这个ID是我需要我们作为开发者上传到。微信服务器上就是微信服务器,这是我们开发者服务器,我们开发者微服务呢,要上传到微信服务器上,把我们需要保存的,比方说啊图片资源。还有音频啊。
02:01
视频等等资源是不是要上传到微信服务器中,微信服务器才会返回给你一个。Mid ID啊,正是因为它会返回你的mid I,你才能够利用上这个mid ID,才能够回复给用户相应的图片消息或者是视频消息。你就说你没办法直接回复一个图片或者是音视频消息给用户,对不对,你呢,首先得将你本地的这些文件是不是要上传到微信服务器中啊,然后微信服务器再返回给你一个媒体ID是不是啊,媒体ID给你,然后你拿这个媒体ID是不是才能够真正的回复给用户啊,才能真正的回复给用户,所以说我们接下来做的事就是想办法去上传我们的这些素材啊,这些素材呢,我们都称之为多媒体素材。就是图片啊,音频啊,视频啊这些东西啊,我们就多媒体素材,媒体素材啊,啊这些素材呢,我们要上传到微信服务器中,我才能够发送给用户,那我们来看一下怎么做啊,那对应的呢,就是这个新增临时素材,那这个素材呢,又分为两种,一种是临时的,一种是。
03:11
永久的,临时的,说明他。是不是暂时保管啊,诶这里有句话临时的呢,在我微信后台呢,只保存三天,是不是只保存三天,三天之后几十项他们就会清理掉,是不是,哎,但是我永久的呢。它会清理掉吗?哎,就不会了,也就说呢,有时候如果有些有些素材,这要可能每隔一段时间都得发给用户,或者是每隔一段时间我都要使用的话呢,哎,我是不是要保存为永久素材啊啊有的素材可能今天我用了,明天不要用,以后都不采用了,那我是不是可以新增为临时素材,是不是啊,这就是这两种啊,因为呢,永久素材咱们最终是不是存在微信服务器中啊,你想想微信服务器会给你一个无限大的空间吗?
04:03
不可能的事啊,是不是,怎么可能给你一个无限大的空间,所以说新增永久素材呢,就会有一个限制,你存的素材呢,它永远都会有一个啊,关于你的数量会有限制,关于你的文件大小呢,也会有限制,所以说呢,你不能随便的没有啊,没有节制的无限的存储你想要的数据,是不是,所以有时候呢,我们只把些持久需要用的东西,重要的东西可能存在这里面,用这素材。那很多更多的东西呢,我们会用临时素材方式去存储,去存储用完之后呢,就不要它了,是不是用完之后就不要了,好就是这两个接口啊,一个新增,新增是不是新增意味着是不是我把我的服,我把我的素材是不是传到我的微信服务器中啊,啊传到微信服务器中是新增,那么这里还有个获取。获取是怎么回事呢?是不是想办法再把微信服务器中我对应的素材拿到我的开发者服务器上来,是不是,哎,又想办法又拿回来,那就是获取,那我们都来看一下怎么做啊啊新增呢,再来看他呢,就是用来去上传我们那些多媒体素材的,那你上传成功之后啊,就会返回一个媒体ID给你,这个媒体ID呢,在临时素材中呢,它能三天内都有效啊,三天外呢就会失效。
05:26
啊,所以说咱们呢,一般用个一到两天就差不多了,那么可能第三天的时候呢,他就表报哪天就失效了,所以说你千万不要啊在啊,就比方说他说三天是不是你就掐个表就三天啊,就不要这样掐个表,那么你就用个一到两天是不是差不多了啊好,然后呢,下面呢,还有就是上传临时素材的话呢,它的大小啊和格式呢,都有限制,首先呢,它只允许这四种类型图片。Image这个语音voice视频和这个缩略图是不是缩略图什么呢。
06:06
四根图什么?是不是就是清晰度更低的那种图片,是不是,而且呢,通常也是更小清晰,清晰度更低的一些图片,是不是这样的一个图片啊,然后呢,这里面说了,它呢,图片呢只支持这些格式,什么map啊什么的就不支持了,那语音呢只支持这些格式啊,别的不支持,视频呢,只支持MP4你的其他格式呢,全都不支持。然后缩列图呢,只支持JPG的格式啊,这是要注意的,然后另外呢,它提示了你要使用HTPSH调本接口是不是,因为呢,在之前呢是使用的是HTP显议,现在呢,在前一段也不是前端吧,在最近几年呢,全部改成了HTPS,在很久之前呢,可能都是采用的HTP啊,所以说大家注意一下,然后呢,这里面看一下啊,它的请求方式呢,跟我们之前看到的不一样。
07:04
首先呢,企的话是P是不是它后面还写了一个form,诶说明什么呢。说明它是你想嘛,写那个form是不是跟form表单有关系啊,啊,这里也写清楚了啊,它呢是以一种form表单的方式,是不是上传多媒体文件,以form表单的方式上传,好好咱们在咱们现在是在后台服务器,我们服务器是没有form表单,是不是我们是没有的,所以说呢,我们要想办法去请求的时候呢,实现这个form表单的方式去上传这个素材。啊,所有素材呢,都得使用表单啊,它这里呢,提供了一种工具啊,这个ul工具。可以把它相当于是下载一个全局的包,下载这个包呢,可以通过这个指令的方式呢,可以去上传他给你那个调用示例啊,但是咱们肯定不是通过这种,咱们要写JS代码是不是啊,咱们呢待会呢就使用我们的那个库。
08:02
诶,我们是不是有个RP啊,我们通过这个库呢,看看怎么去上传啊,上传的时候呢,看下有哪些需要传的参数啊,一个是。啊三粉,诶这个咱们清楚是不是另外一个叫做。是不啊,这是查询字符上,他说啊,这个type呢,他说了有四种类型,仅有这四种类型,是不是,也就说你要查图片,是不是要告诉他你要传的类型是什么啊,必须要告诉他啊,一共有四种类型。然后另外呢。哎,这里有个参数。但这个参数他又没告诉我,是在查询字符串中,是不是,哎,这个参数呢,就是一个。可以类似为请求体的参数,但是又不是因为呢,它是泵表单的方式是不是,哎,所以说在我们发送请求的时候,用来实现泵表单的时候呢,我们会专门的方式去实现分母表单啊,说白了这个参数呢,就得放到我那个专门的实现的那个里面作为数据去传递。
09:06
作为数据传递,这种数据呢,我们叫做form数据啊,待会我们来看form,然后呢,他说有这必须要有这些字段,是不是有这些信息啊好,那请求成功之后呢,他就会返回一个这样的包给你,然后呢,有最关键的就是这个你需要的这个媒体ID,是不是需要的媒体ID,其他的东西我都不重要啊,就需要这个媒体ID,好这个这个呢,整体就是这样,错误的方式呢,告诉你呢啊,通常咱们见到很多错误就是什么Val的叉叉,是不是什么的ul啊的Ken啊的什么ticket等等,一旦说这个错的话呢,一定是你传的这些参数出了问题,那么就是要去检查这些参数是不是是不是按find的,是不是某些值拼串拼错了等等,就去好好的去检查,对一对啊,好,然后我们来去写一写这个接口,整个呢,我们都通读了一遍,接下去实现它啊。
10:05
我们在哪里去实现它呢?在哪个里面,我们在这里去写接口啊。在哪里去写,想想我这个接口它需要一些参数,看N和type,然后还传这个东东,我在哪里去写这个接口呢?在哪个函数在哪个模块中。哎,Wech是不是因为WeChat里面呢,我有那个很方便获取到,是不是啊,我们在那里拿,现在呢,等它复制完成之后呢,我们就来看啊,好在wech里面,然后呢,待会呢,我们是不是在那个大型的wech的那个类里面,是不是定义方法,好比方说咱们这个叫上传临时素材,那我就定一个这样方法,那定义这个方法好来了,这时候就好了啊。
11:00
那定义这个方法的话呢,我就得想一想定义方法的一些需要考虑的一些事情啊,把这些都说一说,说一说。嗯,我们就放到最下面,在最下面去定义啊,在最下面来去定义,我们定义一个上传。临时素材是不是好看一下,方法呢,叫做upload。是不是上传临时叫做。Temporary素材呢,叫做。I material是不是上传临时素材?好这呢定义成一个函数,那么我们现在就考虑考虑我们定义这个方法的时候,到时候别人调用的时候需要传递什么参数。啊,永远都是先考虑这些东西,到底要传什么餐呢?
12:02
首先有。哎,有同学说到type类型是不是,因为呢,我到时候可能有四种类型的多媒体素材,那么你是不是都要传递给我啊,好,都传递给我,好这个呢,待会要传啊,其实还有一个,那还有一个呢,先不说啊,还有一个参数就是呢,是不是你那个文件到时候要传进来啊,你要告诉我那个文件到时候怎么传是不是啊,我们呢,待会呢,就把这个,你把这个文件名给我传进来就好了,File name。你告诉我哪个文件名,我到时候再去找,是不是到时候再去找好,然后这是定义这个方法,然后接下来呢,再往里面写一写,怎么写呢。待会我要上传,是不是要发送请求啊,是不是,诶既然要发送请求,我们想什么呢?请求呢,它就是一个异步的方法,是不是,所以说呢。啊promise,因为这里面肯定需要些处理的,是不是呢,我们去定那个请求,我现在先先别的不看啊,我们一步来定义起求的地址。
13:11
写的地址呢,Co URL,诶咱们呢,是不是之前把所有的API是不是都放在一个文件中啊,那咱们呢,也放进去,咱们这里呢,有一个这个地址,把这个地址复制一份啊,我们就要到前面这部分,把这个地址呢放到我们的那个模块中,叫做。在这里叫做API是不是好在这里面啊,咱们是临时素材写个temporary。临时的好,这里面呢,写一个上传的方法,Load方法是不是因为呢,除了上传,我待会还有个获取方法,所以说写在一起好,临时呢,我看一下这个方法呢,首先它呢也是需要一个。前缀的我们可以看一下啊,是不是也是有一个前面的前缀,然后后面这个呢,是不是要拼起来,是不是这个东东啊,拼起来好方法呢,也定义啊这个。
14:06
地址呢也有了,那我们这里去拼多符号大括号API点。Temporary下面的。Load的方法是不是好,下面接下来是不是要写参数了,第一个参数呢,是access是不是?To好,它等于值的话呢,我现在是不是先要获取到它才行啊,所以说在上面呢,我还得去获取access token好怎么获取呢。通过。点是不是就拿到了,然后呢,再来一个是不是,等一下,等待一下等返回值,好,现在下一位置报错了,我要将这个函数改成sin函数是不是。好,改正成后呢,我这个塔就有了,塔点是不是好,这个有了,除了这个参数以外,还有第二个参数叫做。
15:08
Type是不是type呢?就等于到时候用户调用的时候传入的type,好请求地址有了,接下来是不是要想办法去发送请求啊好,发送请求呢,咱们呢,使用的是。哎,也使用这个RP,这个库是不是好,这里面呢,我们写method为。这是POS请求方式,然后呢?请求地址是不是ul啊,然后还有那个dress true是不是好,除了这些呢,还有一些内容要写,咱们这里面还有一个参数,它叫做是一个media是不是?诶这个参数怎么传呢?啊,其实呢,如果你们去看这个文档的话呢,这个文档其实已经写出来了,告诉你怎么传啊,那我们告诉大家,他这个传的时候呢,需要你去定义一个参数,比如说叫做form。
16:00
它呢等于个对象,对象里面有个参数叫做就是这个媒体媒体媒体,那就对应的这个参数是不是好,这里面呢,需要你传个什么呢。需要你一个流的方式呢,去把这个文件给导入,说白了你要上传的素材,你要以流的方式给我导入进来,引流的方式的话呢,我对应的就要去做一些事了。我得去写个东西,哎,怎样来想一想啊,先想一想,怎样去将一个文件以流的方式读取呢?有个什么方法呢?我们讲的在哪个模块上有个方法。文件以流的方式读取什么模块?还记得FS模块吗?FS模块是不是专门是FS叫做全程是文件系统,是不是它专门对文件进行读写操作的啊,真的是你本地的文件,那么对你的文件进行操作,那么我们借助这个模块呢,就能够去做这个事,怎么去哪个方法能够去读取到我这个流呢?
17:11
叫做create read stream是不是创建可读流啊,是不是从把文件读取到你这个牛来,是不是可写流是怎么回事呢?将某一个流是不是写成一个文件啊,写成一个文件可写流,或者说可写流也可以去调用相应的方法去写入呢,啊所以说呢,我们这里是创建可读流,读取某个文件,读取某个文件啊好,可读流是不是要读取啊,读取的时候是不是要传这个文件的路径是不是啊传文件路径啊假设呢,待会呢,我们。把这个媒体素材都放在这个wech里面啊,假设放在这里面啊,如果你不想的话呢,你其实还可新建个文件夹,是不是放在这个文件夹中啊,比如说我们新建个文件夹吧,叫做media。是不是假设我待会有什么图,有什么素材,是不是都放在这个里面,那么好,那么咱们呢,就根据这个路径,首先呢,要来到这个路径,然后把这个路径呢,跟我要读取的这个方向name是不是拼在一起啊好,那么这里呢,我们该怎么去梳理呢。
18:19
大家还记不记得怎么去处理我,怎么来到我这个media这个径上,我现在在差,我怎么来这里。首先我有个刚刚发DR name,这个东西能来到哪里?来到我的这里是不是好?那怎么来到这里呢?我怎么,我要怎么做才能来到这里?嗯。对了啊,有同学说到了,有一个模块我们前面使用过的叫做pass,我呢无非是先要回退一层再进入到这个media才行,是不是我得先回退一层再进入,我没办法在同层直接进入,没办法,所以说如果想回退一层的话呢,我直接点点看,他是回退不了的,他根本就不认识,所以我们想要他做的话呢,就得引入这个pass模块去处理了,是不是好在这呢,往上走看下有没有引入过啊。
19:19
没有引入,咱们来引入一下这个pass模块,它们专门是用来去处理这个路径的,也都是我们的note的核心模块啊。Pass,好,这里面我们有这个方法叫做方法,它呢跟我们之前方法一样,是不是好在这里面呢,我们就去看一下这个路径啊。往下走往下走啊好,这里面呢,我就个路径就不能放在里面去处理了,因为呢,这个待会这个so是不会嵌套啊啊会会产生冲突,所以说在外面呢,我其实是把这个文件路径给它定义好啊,Fair pass。等于算方法的调用,是不是第二只船什么呢?
20:02
我反正我总之要来到这个media这里,你告诉我怎么来。是不是先干压压嘛,接着呢。其实是不是要先回退一层,回退一层找到这个米姐啊,然后再想办法跟我这个file name是不是拼在一起,我这时候这个路径是不是才行啊,这时候才行啊好,然后呢,这个呢是要去获取这个文件的绝对路径啊,这时候就不容易出问题,如果是相对路径的话呢,它就会出问题,他呢就看你这方法在哪调用的,在哪里调用,是不是可能路径都不一样啊,所以说呢,就千万不要使用相对路径,用决斗路径就没问题啊好,决断路径有了,我是不是把这个决斗路径传进来是不是,待会呢,就会这里创建个可读流,将这个文件所有的内容是不是读取到这个,读取到这个里面,作为我这个media点的属性啊,属性值是不是。好,接下来怎么做呢?
21:02
加这个参数传进来就可以了。它呢专门有个参数叫做啊,其实呢,就是跟这里的对应的,是不是专门有的这个参数传进来,它呢,就能够去以表达的方式呢,发送请求啊。Inform。表单的方式发送请求。啊,就是这种方式,就是说白了多个参数叫做form姆德塔,那这里面呢,有个参数叫做media,是不是form德塔的整体是个对象,这里有个media media media的值呢,是一个流,这个流呢,就是创建个可读流,将你要上传的文件,将你要发送的文件呢,导入到这个流中,是不是导入流中好这里呢,我们就相当是写的多。就差不多了,好,然后呢。接下来我呢,是不是要去接收一下最终的返回值啊,返回值里面有个很重要的信息,就是那个mid ID是不是很重要东西就是midd啊,这里的好像不能去这样去使用。
22:07
那咱们进行一个返回值吧,S结果吧,然后呢,最终呢,将这个结果给。是不是要resolve出去啊,最终呢,是由谁调这个方法,调完之后,我是不是要返回这个最终的返回值给他,是不是,所以说呢,你一定要记得result出去,首先调用的时候呢,将这个result呢返回给用户啊。将数据返回给用户。啊,因为这个东西呢,是不是会产生一个媒体ID啊,啊媒体ID呢,通常情况下来,如果你只要用一次的话呢,那我没什么说的,你拿它是不是用了就可以了,用一次的话就没什么说的,如果你要持续的使用的话呢,那么你就要将它保存在。数据库中是不是保存在数据库中才能方便你持续的使用,那这个呢,就看你们的需求到底是怎么样的,然后呢,再去决定最终返回的这个result值要不要去保存在数据库中,到时候再决定好这是一个,然后呢,如果想把这个方法做完整一点,做好一点的话呢,我们还去处理这里面的错误,是不是处理错误的话呢,就是要。
23:18
用TRY啊,用TRY去解决我这个。我这个函数中可能存在的问题。串里面呢,放置着一些。这里面放置。可能出错的代码是不是可能出错,代码不一定会出错,但是可能会出错,因为你这个请求可能会失败,是不是可能会失败,甚至呢,你这个文件是不是可能不在啊,可能压根不存在也会报错的啊,就是这个好,一旦出了错呢,我就抛出异常给他啊。啊,在咱们的一些服务器里面,它处理呢,就是在失败的时候呢,首先抛出个异常,然后呢,就返回一个500的错误给用户,返回500错误用户啊那咱们这里呢,就是抛出异常就好了,就说咱们这个上传临时素材的方法呢。
24:10
出了问题,然后呢,再加上我们这个一啊,加上这个一就可以了,好跑这个一叉好这里呢,就是一旦踹中的代码出了问题。啊,就会走开始逻辑。要出题错误。好,这个串开的用法呢,其实蛮多的,而且也很常用,它呢,甚至能在我们的,嗯,我们这里是不是写爬虫啊,我们在爬虫的时候呢,有时候呢,因为由于爬取的数据过多,它可能在某一个节点突然就卡了。那么这样就会很惨很惨很惨,结果导致什么呢?你前面辛辛苦苦爬了,比如说爬了50%的数据,后面呢,有一个数据突然就出错了,结果导致就是所有爬的东西都没了,都没了,所以说你无法的可以用分别用几个拆开始去包着,你出错就出错,我不管你,我不管你,反正你只要你成功的下载的东西我就把你保存下来,你失败的东西呢,我就不管,我下次呢再去重新盘啊,可用try cash去包着,这样呢就不会中断你的程序的运行,可以接着再去执行其他任务,可以接着再执行其他任务啊好,然后这个呢,就是我们定义的第一个方法,上传临时素材方法,它呢跟我们之前不一样的地方就是说白了,我这个请求的方式不太一样,是不是?
25:42
啊,这也是大家今后会遇到的,你呢,可能发送请求的时候呢,会有各种请求方式,它需要你设置各种请求头,才能够去成功的拿到你想要的东西啊,啊想要的东西好,这是呢,咱们的一个上传临时素材的方法,是不是咱们给他。
我来说两句