使用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 相关文章推荐
jquery键盘事件介绍
Jan 31 Javascript
容易被忽略的JS脚本特性
Sep 13 Javascript
浅谈javascript中this在事件中的应用
Feb 15 Javascript
jquery实现无限分级横向导航菜单的方法
Mar 12 Javascript
JS更改select内option属性的方法
Oct 14 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
Jul 26 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
Oct 30 Javascript
vue项目实现图片上传功能
Dec 23 Javascript
Vue发布订阅模式实现过程图解
Apr 30 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
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
splice slice区别
2006/10/09 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python中的计时器timeit的使用方法
2017/10/20 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
实例介绍Python中整型
2019/02/11 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
ORACLE第二个十问
2013/12/14 面试题
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
大学军训感言300字
2014/03/09 职场文书
新郎新娘致辞
2015/07/31 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
品德与社会教学反思
2016/02/24 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis