node-webot / co-wechat-api

Wechat API. Support Async Functions
Other
723 stars 170 forks source link

使用上传临时素材接口的时候,返回 一段buffer #19

Open vimer opened 8 years ago

vimer commented 8 years ago

按照官方的api,及co-wechat-api不是也是应该返回json吗? 然后我用JSON.parse来解析 得到的结果是 {"errcode":41005,"errmsg":"media data missing"}

JacksonTian commented 8 years ago

具体接口?

vimer commented 8 years ago

uploadMedia 新增临时素材,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) 详情请见:http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html Examples:

api.uploadMedia('filepath', type); Result:

{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789} Shortcut: * - exports.uploadImage(filepath);

exports.uploadVoice(filepath); exports.uploadVideo(filepath); exports.uploadThumb(filepath); * @param {String} filepath 文件路径 方法签名

方法 exports.uploadMedia() 参数 type(String)
媒体类型,可用值有image、voice、video、thumb

vimer commented 8 years ago

@JacksonTian var res = yield* api.uploadMedia("...", 'image'); 使用的时候,res返回还是一段buffer,按照文档应该返回: {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}

co接口是不是有问题,我刚才试了下callback方式的 是正常的

JacksonTian commented 8 years ago

https://github.com/node-webot/co-wechat-api/blob/master/lib/api_common.js#L115 你在这里打个断点看看

vimer commented 8 years ago

分两次输出 第一次 application/json; encoding=utf-8 第二次 text/plain

JacksonTian commented 8 years ago

为何会是2次?

vimer commented 8 years ago

test

JacksonTian commented 8 years ago

单独请求。把根wechat的关联挪开。

var result = yield api.uploadMedia()

vimer commented 8 years ago

test

还是一样

logerzhu commented 8 years ago

@JacksonTian 我遇到和vimer 同样的问题,

const media = yield weChatApi.uploadMedia(achievementImg, "image")
console.log(media.toString("utf-8"))

总是报: {"errcode":41005,"errmsg":"media data missing hint: [dR0571sz59]"}

vimer commented 8 years ago

@logerzhu 我用callback形式了

logerzhu commented 8 years ago

@vimer 我重写了request方法,然后好了

WechatAPI.prototype.request = function * (url, opts) {

  var options = {dataType: "json"};
  Object.assign(options, this.defaults)
  for (var key in opts) {
    if (key !== 'headers') {
      if (key === 'data' && opts[key] && typeof(opts[key].pipe) === 'function') {
        options["stream"] = opts[key]
      } else {
        options[key] = opts[key]
      }
    } else {
      if (opts.headers) {
        options.headers = options.headers || {}
        Object.assign(options.headers, opts.headers)
      }
    }
  }

  var res = yield urllib.requestThunk(url, options)
  if (res.status < 200 || res.status > 204) {
    var err = new Error(`url: ${url}, status code: ${res.status}`)
    err.name = 'WeChatAPIError'
    throw err
  }
  return res.data
}
daimiao commented 7 years ago

@只能在5.5以下的版本使用,在5.5和5.5以上的版本就失效了,所以如果是5.5或者以上的可以用CURLFile这个

miwoy commented 7 years ago

@JacksonTian 我也遇到同样的问题,调试了一下感觉是使用httpx库的文件数据没有写进去,data属性接受String|Buffer,而form是个流对象。如果直接改造request函数是否会对其他函数有影响

JacksonTian commented 7 years ago

@miwoy httpx的opts.data可以是一个Stream啊。

miwoy commented 7 years ago

@JacksonTian 我没看他的源码,只看了文档说接受String|Buffer,这个接口确实不能用,返回一段buffer,解码后是{"errcode":41005,"errmsg":"media data missing hint: [dR0571sz59]"},而同样的参数es5版本的接口是正常的,您可以测试一下,我的node版本是v6.2.0,co-wechat-api版本是v2.3.1

miwoy commented 7 years ago

@JacksonTian 我引用了楼上那位大神的代码,上传接口可以了,但是会影响下载接口,于是我封装了一个给上传用的request专用接口

vimer commented 7 years ago

@miwoy pull request

dahuahe commented 6 years ago

我也是同样的问题 default

wx20171029-010910 2x

但是他的接口就是返回 text/plain 所以判断直接给buffer了

真是服了微信..........

lhwu commented 5 years ago

uploadMedia可用的,await api.uploadMedia(buffer, 'image', 'test.jpg', ‘image/jpeg’);,但是返回的数据是 buffer,需要先 JSON.parse(buffer),才能获取到 media_id