使用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 相关文章推荐
JTrackBar水平拖动效果
Jul 15 Javascript
javascript void(0)的妙用
Oct 21 Javascript
leaflet的开发入门教程
Nov 17 Javascript
基于JavaScript实现Tab选项卡切换效果
Nov 24 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
Sep 18 Javascript
分析JavaScript数组操作难点
Dec 18 Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
Aug 31 Javascript
在nuxt中使用路由重定向的实例
Nov 06 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
浅析SVN常见问题及解决方法
2013/06/21 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
angularJS 入门基础
2015/02/09 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
Python递归函数定义与用法示例
2017/06/02 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
《鸟的天堂》教学反思
2014/02/27 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
组织委员竞选稿
2015/11/21 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL