原文链接: puppeteer 用cookie登录osc批量修改文章
上一篇: 在线粒子动效制作和使用
下一篇: 希望有一天, 知识可以轻易的获取, 学习也不是为了谋生存
第一种是安装chrome-cookies-secure库, 但是只有在mac和linux上可行, win10安装失败
const chrome = require('chrome-cookies-secure');
const puppeteer = require('puppeteer');
const url = 'https://my.oschina.net/ahaoboy';
chrome.getCookies(url, 'puppeteer', function(err, cookies) {
if (err) {
console.log(err, 'error');
return
}
console.log(cookies, 'cookies');
callback(cookies);
} ) // e.g. 'Profile 2'
}
// find profiles at ~/Library/Application Support/Google/Chrome
getCookies(async (cookies) => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.setCookie(...cookies);
await page.goto(url);
await page.waitForTimeout(10000);
browser.close()
});
第二种是通过访问自己主页面, 拿到实际使用的cookie字符串, 然后自己处理一下
const str = ``
const cookies = str.split(";").map(i => {
const [name, value] = i.split("=")
return {
name: name.trim(),
value: value.trim(),
url: "https://my.oschina.net/ahaoboy",
}
})
module.exports = cookies
批量修改状态
const puppeteer = require("puppeteer")
const cookies = require("./cookie")
const url = "https://my.oschina.net/ahaoboy"
const getBlogList = require("./blogList")
const sleep = (n = 100) => new Promise(r => setTimeout(r, n))
async function check(page, url) {
console.log("check url", url)
await page.goto(url)
await sleep(1500)
// 如果返回的是一个promise, 那么久等待这个promise结束
const pageRendered = page.evaluate(async () => {
const sleep = (n = 100) => new Promise(r => setTimeout(r, n))
// 检查是否是隐藏
const q1 = `#writeArticleWrapper > div > div > form > div.inline.fields.footer-fields > div:nth-child(4) > div > input.hidden`
const d1 = document.querySelector(q1)
if (d1.checked) {
d1.click()
await sleep(100)
}
// 如果没有选择分区
const q2 = `#writeArticleWrapper > div > div > form > div.inline.fields.footer-fields > div.required.field.set-bottom.field-groups > div > div.menu`
const d2 = document.querySelector(q2)
const flag = [...d2.children].some(i => i.className.includes("selected"))
if (!flag) {
d2.children[0].click()
}
await sleep(200)
// 提交修改
const btn = document.querySelector(
"#writeArticleWrapper > div > div > form > div.inline.field.actions > div",
)
btn.click()
return await sleep(2000)
})
// 等待十秒, 或者所有图片加载完毕
await Promise.race([pageRendered, sleep(6000)])
try {
await page.waitForSelector(".article-box__header", {
visible: true,
timeout: 4000,
})
} catch (e) {
console.log("===e", e)
return
}
}
async function main() {
const start = "https://my.oschina.net/ahaoboy/blog/write/1835346"
const blogList = await getBlogList()
while (true) {
const t = blogList.shift().url
console.log(t)
if (t === start) break
}
console.log("blogList", blogList.length)
console.log("blogList", blogList[0])
const browser = await puppeteer.launch({
headless: false,
})
const page = await browser.newPage()
await page.setCookie(...cookies)
await page.setViewport({
width: 1920,
height: 1080,
})
await page.goto(url)
for (const { url } of blogList) {
try {
await check(page, url)
} catch (e) {
console.log("ee", e)
}
}
browser.close()
}
main()