iT邦幫忙

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

Puppeteer系列 第 8

Puppeteer & FB Token

介紹

這一篇來介紹 Puppeteer 拿到網頁 FB Token的辦法,這樣可以用網頁Token的權限來做事情

這邊要自已的fb帳號密碼 key 在自己輸入自己的格式如下

module.exports = {
  account: '',
  password: ''
}

這時候可以使用 userDataDir ,使用這個時候記得要設定用一個資料夾,不然會產生很多檔案, userDataDir 很好用他可以紀錄目前 cookies 跟操作的一些記錄,所以當FB有登入一次的時候如果有設定這個選項,就不用反覆在登入了速度會加快很多。

const browser = await puppeteer.launch({
		headless: false
		userDataDir: "./userData"
	});

page.click 是點擊這個dom一下, 接下來入資料 page.type 最後點擊登入,waitForNavigation這個是等待下一頁的導覽列出來,通常這樣會比較保險不會網頁都還沒Load 完就跑去做其他的事情

    awiat page.click('#email');
  	await page.type('#email', keyData.account);
	await page.click('#pass');
	await page.type('#pass', keyData.password);
	await page.click('#loginbutton');
	await page.waitForNavigation();

接著找到要點選的link 點擊一下 document.querySelector(path).click();

let content = await page.evaluate(() => {
		var path =
			'table.uiGrid:nth-child(2) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > a:nth-child(1)';
		document.querySelector(path).click();
	});

最後拿到developr的開發權限 token

let token = await page.evaluate(() => {
		var path = (path =
			'body > div._li._4xit > div._53vp > div > div > div > div._3a8w._4-u3 > div > div._5wpg._5wph > label > input');
		return document.querySelector(path).value;
	});

寫入到檔案,提供其他需要用到token的程式使用


fs.writeFile('../../credentials/authKey.js', `module.exports = token= '${token}'`, options, (err) => {
		console.log(err);
	});
    

以下是全部的程式碼


const puppeteer = require('puppeteer');

const keyData = require('key');
const fs = require('fs');
console.log(keyData.account);
async function go() {
	const browser = await puppeteer.launch({
		headless: false
		userDataDir: "./userData"
	});
	const page = await browser.newPage();

	await page.goto(
		'https://www.facebook.com/login/?next=https%3A%2F%2Fdevelopers.facebook.com%2Ftools-and-support%2F'
	);
    await page.click('#email');
	await page.type('#email', keyData.account);
	await page.click('#pass');
	await page.type('#pass', keyData.password);
	await page.click('#loginbutton');
	await page.waitForNavigation();
  
  
  
	let token = await page.evaluate(() => {
		var path = (path =
			'body > div._li._4xit > div._53vp > div > div > div > div._3a8w._4-u3 > div > div._5wpg._5wph > label > input');
		return document.querySelector(path).value;
	});
	var options = { flag: 'w' };

	fs.writeFile('../../credentials/authKey.js', `module.exports = token= '${token}'`, options, (err) => {
		console.log(err);
	});
	console.log(token);
}

go();

總結

Puppeteer 在爬蟲這塊寫的方法都很簡單語法都縮短很多,也提供不同情境的加速 ,爬完Fb Token比透過Api拿到的權限比較多 就看個人要怎樣運用了


上一篇
Puppeteer & API class: Browser
下一篇
Puppeteer & Jest
系列文
Puppeteer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Wolke
iT邦新手 1 級 ‧ 2017-12-26 10:24:58

與時具近
我上一版在寫時,
還沒有這些東西可以用。

polo iT邦新手 4 級 ‧ 2017-12-26 10:37:49 檢舉

恩恩 用userDataDir 可以省很多時間

我要留言

立即登入留言