masalibの日記

システム開発、運用と猫の写真ブログです

puppeteerでツイッターカードの更新

自分のブログを他の人に広めるためにツイートしたりします。そのツイートしたときに表示された画像が間違えていた場合は、Card Validatorというサイトで更新しないといつまでも残る形になっています。

twitterカードの更新イメージ
twitterカードの更新イメージ

私が知っている範囲では1ページ単位しか更新できない・・・・ めっちゃめんどくさいのpuppeteerで自動化をした

puppeteerを知らない人はこちら

masalib.hatenablog.com

masalib.hatenablog.com

const puppeteer = require('puppeteer');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    ignoreHTTPSErrors : true ,
  });

  console.log("ツイッターキャッシュ更新");

  var page = await browser.newPage();
  await page.setViewport({width: 1280, height: 700});
  await page.waitFor(500);

  //想定外のダイアログを無視する
  page.on('dialog', dialog => {
    dialog.accept();
  })

  //初期設定
  const twitterUser = 'masalib@gmail.com';
  const twitterUserPass = 'password'
  const clearInputFocus = '#ValidationForm > div > div:nth-child(1) > input.FormControl';
  const clickFocus = '#ValidationForm > div > div.Grid-cell.u-sizeFill.u-marginTm > input';
  const cleartargetpageURL = 'https://masalib.hatenablog.com/entry/';

  console.log("Login start");
  await page.goto('https://twitter.com/login?redirect_after_login=https%3A%2F%2Fcards-dev.twitter.com%2Fvalidator')
  await page.type('#page-container > div > div.signin-wrapper > form > fieldset > div:nth-child(2) > input',twitterUser);
  await page.waitFor(1000); //←1秒待たないと入力できなかった
  await page.focus('#page-container > div > div.signin-wrapper > form > fieldset > div:nth-child(3) > input');
  await page.type('#page-container > div > div.signin-wrapper > form > fieldset > div:nth-child(3) > input',twitterUserPass);
  await page.waitFor(1000);
  inputElement = await page.$('#page-container > div > div.signin-wrapper > form > div.clearfix > button');
  await inputElement.click();
  await page.waitFor(2000);
  //console.log("Login end");
  //console.log("cache clear start");
  await page.focus(clearInputFocus);
  await page.type(clearInputFocus,cleartargetpageURL + '2018/11/20/000000');    //この部分を動的にするのは別に・・・・
  await page.waitFor(1000); 
  inputElement = await page.$(clickFocus);
  //console.log("cache clear first ");
  await inputElement.click();
  await page.waitFor(3000);
  inputElement = await page.$(clickFocus);
  //console.log("cache clear second ");
  await inputElement.click();
  await page.waitFor(3000); 
  //エビデンスがとりたい人はここで画面キャプチャーをとる
  //await page.screenshot({path: 'images/site_logined.png'});

  browser.close();

})();

ログイン時にメールが飛んでくるのはご愛嬌で・・・・