iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 19
0
DevOps

Puppeteer系列 第 19

Puppeteer & 鐵人自動發文(二)

  • 分享至 

  • xImage
  •  

介紹

避免GG寫一隻可以自動發文的鐵人,前篇已經介紹登入這邊就開始來寫一個自動PO文的範例

接續前篇登入之後,就可以到發文頁面把預先處理好的文章藉由 moment對應哪一天的文章,再配合crontab來完成自動貼文這件事情

效果就如同這樣
http://www.giphy.com/gifs/l0HUg6t786IANUyaY

程式碼如下

這邊使用了typescript 所以可以用 import,node 新版的也支援import功能 https://nodejs.org/api/esm.html


import * as puppeteer from 'puppeteer'
import { MyKey } from './key/myKey';
//這邊使用FB登入放入自己的帳號
(async function go() {

  const browser = await puppeteer.launch({
    headless: false,
    args: ['--start-maximized'],
    //userDataDir: "./userData/"

  });
  const page = await browser.newPage();


  // await watchDog;
  let currentScreen = await page.evaluate(() => {
    return {
      width: window.screen.availWidth,
      height: window.screen.availHeight,
    };
  });
  //設定預設網頁頁面大小
  await page.setViewport(currentScreen);

  try {


    await page.goto('https://member.ithome.com.tw/login', { timeout: 0 });
    await page.click(".btn-facebook")
    //這邊不能用 waitForNavigation
    await page.waitForSelector('#pass');
    await page.type('#email', MyKey.account);
    await page.type('#pass', MyKey.password);
    await page.click('#loginbutton');
    await page.waitForNavigation({ timeout: 3000 });

    const ithomeId = 20103438;
    const url = `https://ithelp.ithome.com.tw/users/${ithomeId}`;
    await page.goto(url);
    // //await page.waitForNavigation({ timeout: 0 });


    await page.waitForSelector(".menu__item-link");
    await page.click('body > div.header > nav > div.menu__bg > div > ul.list-unstyled.menu__right > li:nth-child(2) > a');

    await page.waitForSelector(".menu__ironman-btn");
    await page.click('body > div.header > nav > div.menu__bg > div > ul.list-unstyled.menu__right > li.menu__item.menu__ironman--hidden > button');

    //這邊要看自己的項目有幾項 因為我參加三項所以這邊選 li:nth-child(3)
    await page.waitForSelector(".ir-modal__team", { timeout: 3000, visible: true });
    await page.click("#group > div > div > div.modal-body > ul > li:nth-child(3) > a");

    await page.waitForSelector(".post-header__title");
    //  await page.waitForNavigation({ timeout: 0 });
    await page.type("#ironmanEditForm > div.board.ir-board > div.post-header > div > input", "測試")
    await page.click('#ironmanEditForm > div.board.ir-board > div.post-markdown > div.CodeMirror.cm-s-paper.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code');
    await page.type('#ironmanEditForm > div.board.ir-board > div.post-markdown > div.CodeMirror.cm-s-paper.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code', `  
      今天想po什麼文章呢
    
    `);


  } catch (err) {
    console.log('err')
    console.log(err)
  }
  //await browser.close();
})()


總結
Code都是之前提供的功能 , 這邊的 userDataDir: "./userData/" 功能是Mark起來的,通常我會在第一次FB登入後把這個打開來這樣就可以有一個登入的cookies token 可以用一段時間不需要再登入很方便去開發


上一篇
Puppeteer & 工人智慧 驗證
下一篇
Puppeteer & 自動鐵人發文(一)
系列文
Puppeteer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言