介紹
避免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 可以用一段時間不需要再登入很方便去開發