使用node搭建自动发图文微博机器人的方法


Posted in Javascript onMarch 22, 2019

本文仅供学习交流,请勿用于商业用途,并遵守新浪微博相关规定。

代码目录

使用node搭建自动发图文微博机器人的方法

此微博机器人的实现功能如下:

  • 模拟登陆新浪微博,获取cookie;
  • 自动上传图片至微博图床;
  • 自动发送内容不同的图文微博;
  • 通过定时任务,实现周期性发微博任务。

效果图

使用node搭建自动发图文微博机器人的方法

图文内容我固定了,可自行使用第三方api获取要发送的内容或爬取第三方内容发送。(偷个懒...

使用node搭建自动发图文微博机器人的方法

要实现发送图文微博可以分为三个步骤

  • 登录微博。
  • 图片上传至微博图床获取PID。
  • 发送微博。

登录

登录可以使用Puppeteer node库,很轻松的实现登录获取微博cookie,这里不多介绍,可以自行搜索Puppeteer学习。

Puppeteer是谷歌官方出品的一个通过DevTools协议控制headless Chrome的Node库。可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进行UI Test或者作为爬虫访问页面来收集数据。
async function login(username, password) {
  const browser = await puppeteer.launch({
    // headless: false,
    slowMo: 250,
    executablePath: ''
  });
  const page = (await browser.pages())[0];
  await page.setViewport({
    width: 1280,
    height: 800
  });

  await page.goto("https://weibo.com/");
  await page.waitForNavigation();
  await page.type("#loginname", username);
  await page.type("#pl_login_form > div > div:nth-child(3) > div.info_list.password > div > input", password);
  await page.click("#pl_login_form > div > div:nth-child(3) > div:nth-child(6)");
  await page.waitForNavigation().then(result => {
    return new Promise((resolve) => {
      page.cookies().then(async cookie => {
        fs.createWriteStream("cookie.txt").write(JSON.stringify(cookie), "UTF8");//存储cookie
        await browser.close();//关闭打开的浏览器
        resolve(cookie);
      });
    })
  }).catch(e => {
    page.screenshot({
      path: 'code.png',
      type: 'png',
      x: 800,
      y: 200,
      width: 100,
      height: 100
    });
    return new Promise((resolve, reject) => {
      readSyncByRl("请输入验证码").then(async (code) => {
        await page.type("#pl_login_form > div > div:nth-child(3) > div.info_list.verify.clearfix > div > input", code);
        await page.click("#pl_login_form > div > div:nth-child(3) > div:nth-child(6)");
        await page.waitForNavigation();
        page.cookies().then(async cookie => {
          fs.createWriteStream("cookie.txt").write(JSON.stringify(cookie), "UTF8");
          await browser.close();
          resolve(cookie);
        });

      })
    })
  })
}

图片上传至微博图床

上传到微博图床可以看这里 http://weibo.com/minipublish 抓包看上传的接口过程,可以看到上传的是base64图片信息。所以上传前把图片转换成base64编码,而本地图片的编码和互联网链接图片的编码又不一样,这里使用的是互联网链接的图片,node本地图片转换成base64编码更简单些。上传成功后返回微博图床图片的pid。记住这个pid,发微博用的就是这个pid。

发送微博

有了微博cookie和图片pid后就可以发微博了,多张图片时pid之间以|隔开的。

async function weibopost(text, pic_ids = '', cookie) { //发送微博内容(支持带图片)
  return new Promise(async (resolve, reject) => {
    if (cookie === '') {
      reject('Error: Cookie not set!');
    }
    let post_data = querystring.stringify({
      'location': 'v6_content_home',
      'text': text,
      'appkey': '',
      'style_type': '1',
      'pic_id': pic_ids,
      'tid': '',
      'pdetail': '',
      'mid': '',
      'isReEdit': 'false',
      'rank': '0',
      'rankid': '',
      'module': 'stissue',
      'pub_source': 'main_',
      'pub_type': 'dialog',
      'isPri': '0',
      '_t': '0'
    });

    let post_options = {
      'Accept': '*/*',
      'Accept-Encoding': 'gzip, deflate, br',
      'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
      'Connection': 'keep-alive',
      'Content-Length': Buffer.byteLength(post_data),
      'Content-Type': 'application/x-www-form-urlencoded',
      'Cookie': cookie,
      'Host': 'weibo.com',
      'Origin': 'https://weibo.com',
      'Referer': 'https://weibo.com',
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',
      'X-Requested-With': 'XMLHttpRequest'
    };


    let {
      data
    } = await axios.post('https://weibo.com/aj/mblog/add?ajwvr=6&__rnd=' + new Date().getTime(), post_data, {
      withCredentials: true,
      headers: post_options
    })
    if (data.code == 100000) {
      console.log('\n' + text + '-----Sent!' + '---' + new Date().toLocaleString());
      resolve(data);
    } else {
      console.log('post error');
      reject('post error');
    }

  });
}

最后就是定时任务了,定时任务可以使用node-schedule node库,这里不多介绍,可以自行搜索学习。这里使用的是每隔10分钟发送一次。

function loginTo() {
  login(config.username, config.password).then(async () => {
    let rule = null;
    rule = new schedule.RecurrenceRule();
    rule.minute = [01, 11, 21, 31, 41, 51];
    try {
      let cookie = await getCookie();
      getContent(cookie);
    } catch (error) {
      console.log(error);
    }

    j = schedule.scheduleJob(rule, async () => { //定时任务
      try {
        let cookie = await getCookie();
        getContent(cookie);
      } catch (error) {
        console.log(error);
      }

    });
  })
}

代码地址: github地址

参考

https://github.com/itibbers/weibo-post

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Knockout数组(observable)使用详解示例
Nov 15 Javascript
javascript检测是否联网的实现代码
Sep 28 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
Sep 23 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
基于canvas粒子系统的构建详解
Aug 31 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 Javascript
如何从零开始手写Koa2框架
Mar 22 #Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 #Javascript
详解ES6中的Map与Set集合
Mar 22 #Javascript
js控制随机数生成概率代码实例
Mar 21 #Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 #Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 #Javascript
javascript中call()、apply()的区别
Mar 21 #Javascript
You might like
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
Python中的pack和unpack的使用
2018/03/12 Python
简单实现python数独游戏
2018/03/30 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
Python 变量的创建过程详解
2019/09/02 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
合伙经营协议书
2014/04/18 职场文书
租赁协议书范本
2014/04/22 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
火锅店的活动方案
2014/08/15 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
长城导游词400字
2015/01/30 职场文书
检讨书之工作不认真
2019/08/14 职场文书