使用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实现table单双行不同显示并能单行选中
Jul 25 Javascript
JQuery 学习笔记01 JQuery初接触
May 06 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
javascript操作cookie
Jan 17 Javascript
JavaScript判断变量名是否存在数组中的实例
Dec 28 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
Mar 02 Javascript
在vue组件中使用axios的方法
Mar 16 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
node读写Excel操作实例分析
Nov 06 Javascript
vue修饰符.capture和.self的区别
Apr 22 Vue.js
如何从零开始手写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连mysql和oracle数据库性能比较
2006/10/09 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
解析js原生方法创建表格效率测试
2013/07/08 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
python搜索指定目录的方法
2015/04/29 Python
详解Django框架中的视图级缓存
2015/07/23 Python
Python匹配中文的正则表达式
2016/05/11 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Python如何实现FTP功能
2020/05/28 Python
Pycharm Git 设置方法
2020/09/15 Python
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
C++的几个面试题附答案
2016/08/03 面试题
机械设计及其自动化专业推荐信
2013/10/31 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
图书室标语
2014/06/21 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫