UNPKG

node-weibo-simulation-api

Version:
247 lines (237 loc) 8.54 kB
const request = require('request'); const { urlToBase64 } = require('./pictureTool'); const fse = require('fs-extra'); const {NO_PICTURE} = require('../constans/code') const format = require('./format'); const config = require('rc')('weibo', { cookieErrorRetryTime: 3 }) exports.request = function (params) { // console.log('request params', params); return new Promise((resolve, reject) => { // return resolve({ // statusCode:302, // body:`{"code":"100000","msg":"","data":{"html":"<html></html>"}}` // }) request(params, function (err, r, b) { if (err) { return reject(err); } else { if (r.statusCode >= 200 || r.statusCode < 400) { return resolve(r); } else { return reject(r); } } }); }) } let retryTime = config.cookieErrorRetryTime; exports.weiboRequest = function (params) { const cookie = params.cookie; // console.log('weiboRequest', params); const host = 'https://weibo.com'; var headers = { 'Origin': host, "Host":"weibo.com", 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': host + '/friends' }; let promise; if(params.cookieStr){ headers.Cookie = params.cookieStr; promise = Promise.resolve() }else{ promise = cookie.getWeiboCookie().then(cookieStr => { headers.Cookie = cookieStr; return Promise.resolve() }) } promise = promise.then(data => { let requestParams = Object.assign({ url: host + params.url, headers: headers, method: params.method || 'POST', form: params.form }, params.extra); return exports.request(requestParams).then(data => { if (data.statusCode === 302) { console.log('retryTime', retryTime); //登录态问题,获取到登录态之后重试 //todo if (retryTime > 0) { retryTime--; return cookie.getWeiboCookie({ force: true }).then(() => { return Promise.resolve() }).then(() => { return exports.weiboRequest(params); }) } else { return Promise.reject({ code: 9001, message: "cookie 无效" }) } } // console.log('status', data.statusCode); // console.log('header', data.header); // console.log('body', data.body); return data; }) }); return promise } /** * 微博批量上传图片 */ exports.weiboMultiUploadPicture = function (params) { // console.log('params',params); let promises = [] // console.log('pictureBase64Datas',params.pictureBase64Datas.length); if (Array.isArray(params.pictureBase64Datas) && params.pictureBase64Datas.length>0) { promises = params.pictureBase64Datas.map((pic)=>{ return (exports.weiboUploadPicture({ pictureBase64Data:pic, cookie:params.cookie })) }) } else if (Array.isArray(params.pictureUrls) && params.pictureUrls.length>0 ) { promises = params.pictureUrls.map((pic)=>{ return (exports.weiboUploadPicture({ pictureUrl:pic, cookie:params.cookie })) }) } else if (Array.isArray(params.pictureFiles) && params.pictureFiles.length>0) { promises = params.pictureFiles.map((pic)=>{ return (exports.weiboUploadPicture({ pictureFile:pic, cookie:params.cookie })) }) } else { return Promise.reject({ code: NO_PICTURE, msg: "图片不存在" }) } return Promise.all(promises) } /** * 微博上传图片 */ exports.weiboUploadPicture = async function (params) { // console.log('params',params); let base64Data = ''; //优先读取base64 if (params.pictureBase64Data) { // console.log('here',); base64Data = params.pictureBase64Data.split('base64,')[1] || params.pictureBase64Data.split('base64,')[0]; // console.log('base64Data',base64Data); // return; } else if (params.pictureUrl) { try { base64Data = await urlToBase64(params.pictureUrl) } catch (error) { console.log('error',error); return Promise.reject(error) } } else if (params.pictureFile) { try { base64Data = await fse.readFile(params.pictureFile,'base64') } catch (error) { console.log('error',error); return Promise.reject(error) } // console.log('base64Data',base64Data); } else { return Promise.reject({ code: NO_PICTURE, msg: "图片不存在" }) } const cookie = params.cookie; const host = 'https://weibo.com'; var headers = { 'Origin': host, 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': host + '/friends' }; let promise = cookie.getWeiboCookie().then(cookieStr => { headers.Cookie = cookieStr; return Promise.resolve() }) promise = promise.then(data => { let requestParams = Object.assign({ url: 'https://picupload.weibo.com/interface/pic_upload.php', qs:{ cb: `https://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_${new Date().getTime()}`, mime: 'image/jpeg', data: 'base64', url: '0', ori:'1',//原图 markpos: '1', logo: '', nick: '0', marks: '0', app: 'miniblog', s: 'rdxt' }, headers: headers, method: params.method || 'POST', form: { b64_data: base64Data } }, params.extra); return exports.request(requestParams).then(data => { // delete requestParams.form // console.log('requestParams',requestParams); // console.log('data.status',data.statusCode); // console.log('data.body',data.body); // console.log('data',data.headers); // console.log('location',data.headers.location); // return; if (data.statusCode === 302) { let response = format.parseUploadResponse(data.headers.location); if(response.ret == 1 && response.pid){ //上传成功 return { pid:response.pid, url:`http://ww3.sinaimg.cn/large/${response.pid}` } }else if(response.ret == -1){ //cookie无效 console.log('retryTime', retryTime); //登录态问题,获取到登录态之后重试 //todo if (retryTime > 0) { retryTime--; return cookie.getWeiboCookie({ force: true }).then(() => { return Promise.resolve() }).then(() => { return exports.weiboUploadPicture(params); }) } else { return Promise.reject({ code: 9001, message: "cookie 无效" }) } }else{ return Promise.reject({ code:response.ret, message:"上传图片错误" }) } } }) }); return promise }