国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

使用node搭建自動發(fā)圖文微博機器人的方法

2024-05-06 16:49:20
字體:
供稿:網(wǎng)友

本文僅供學(xué)習(xí)交流,請勿用于商業(yè)用途,并遵守新浪微博相關(guān)規(guī)定。

代碼目錄

node,微博,機器人

此微博機器人的實現(xiàn)功能如下:

  • 模擬登陸新浪微博,獲取cookie;
  • 自動上傳圖片至微博圖床;
  • 自動發(fā)送內(nèi)容不同的圖文微博;
  • 通過定時任務(wù),實現(xiàn)周期性發(fā)微博任務(wù)。

效果圖

node,微博,機器人

圖文內(nèi)容我固定了,可自行使用第三方api獲取要發(fā)送的內(nèi)容或爬取第三方內(nèi)容發(fā)送。(偷個懶...

node,微博,機器人

要實現(xiàn)發(fā)送圖文微博可以分為三個步驟

  • 登錄微博。
  • 圖片上傳至微博圖床獲取PID。
  • 發(fā)送微博。

登錄

登錄可以使用Puppeteer node庫,很輕松的實現(xiàn)登錄獲取微博cookie,這里不多介紹,可以自行搜索Puppeteer學(xué)習(xí)。

Puppeteer是谷歌官方出品的一個通過DevTools協(xié)議控制headless Chrome的Node庫。可以通過Puppeteer的提供的api直接控制Chrome模擬大部分用戶操作來進行UI Test或者作為爬蟲訪問頁面來收集數(shù)據(jù)。
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();//關(guān)閉打開的瀏覽器        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圖片信息。所以上傳前把圖片轉(zhuǎn)換成base64編碼,而本地圖片的編碼和互聯(lián)網(wǎng)鏈接圖片的編碼又不一樣,這里使用的是互聯(lián)網(wǎng)鏈接的圖片,node本地圖片轉(zhuǎn)換成base64編碼更簡單些。上傳成功后返回微博圖床圖片的pid。記住這個pid,發(fā)微博用的就是這個pid。

發(fā)送微博

有了微博cookie和圖片pid后就可以發(fā)微博了,多張圖片時pid之間以|隔開的。

async function weibopost(text, pic_ids = '', cookie) { //發(fā)送微博內(nèi)容(支持帶圖片)  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');    }  });}

最后就是定時任務(wù)了,定時任務(wù)可以使用node-schedule node庫,這里不多介紹,可以自行搜索學(xué)習(xí)。這里使用的是每隔10分鐘發(fā)送一次。

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 () => { //定時任務(wù)      try {        let cookie = await getCookie();        getContent(cookie);      } catch (error) {        console.log(error);      }    });  })}

代碼地址: github地址

參考

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 繁峙县| 志丹县| 佛山市| 博白县| 湛江市| 宜宾县| 新平| 黔江区| 东兰县| 平武县| 鹤峰县| 枣阳市| 安阳市| 元朗区| 永顺县| 旬邑县| 彩票| 山阴县| 黄浦区| 丰都县| 东丰县| 黄梅县| 项城市| 天门市| 亳州市| 马鞍山市| 东方市| 吉安县| 苗栗市| 兴义市| 徐州市| 武胜县| 交城县| 揭阳市| 墨江| 方正县| 敦化市| 临泉县| 泉州市| 余江县| 西华县|