よく使う npx コマンド

さらっとnodeを使用したいときに使うコマンド。

Browser Sync

軽いコーディングとか、自分の環境にサーバ立てて作業していたけど他の人にも見せたいときに便利。
[shell]
# 作業ディレクトリを指定
$ npx browser-sync start -s path/to/directory
# サーバのurlを指定
$ npx browser-sync start -p www.hoge.test
[/shell]
デザイン制作時とかでも、ネットワーク内の他の人に確認してもらうのにも使える。

node-sass

[shell]
$ npx node-sass input.scss -o path/to/directory –output-style compressed
# watch
$ npx node-sass -w path/to/directory
[/shell]

nodeからスプレッドシートを操作

nodeからスプレッドシートを操作。今回はnpmからgoogle-spreadsheetをインストールして使用。

下準備

Google Developer コンソールからAPIキーを取得。このページの2番とかを参考に
https://dev.classmethod.jp/server-side/node-js-server-side/nodegooglespreadsheet/
ダウンロードしたjsonファイル(以下 apikey.json)にclient_emailという項目があるので、全体公開していないスプレッドシートの場合はこのメールアドレスを共有に追加します。

google-spreadsheetをインストール

npm i --save google-spreadsheet

サンプルコード

// spreadsheetのidはスプレッドシートのURLの"/d/"と"/edit"の間にある値。
const sheetObj = new googleSpreadsheet('spreadsheetのid');
let sheet;

const credential = require('path/to/apikey.json');

sheetObj.useServiceAccountAuth(credential, function(err){
  sheetObj.getInfo(function(err, data){
    sheet = data;
    for(var i in sheet.worksheets) {
      if(sheet.worksheets[i].title === 'シート名') {
        sheet.worksheets[i].getRows(function(err, rows) {
          for(var i in rows) {
            // 1行目がkeywordのセルを表示
            console.log(rows[i].keyword);
          }
        });
        // 行の追加
        sheet.worksheets[i].addRow({
          'keyword': '追加キーワード',
        },(err)=>{
          if(err) console.log(err);
        });
      }
    }
  });
});

 

 

PuppeteerでHeadless Chromeを操作してスクレイピング

スクレイピングをするのにnode + Headless Chrome + Puppeteerが便利だった。

公式サイト
https://github.com/GoogleChrome/puppeteer

インストール

npm i --save puppeteer

これでChromiumも一緒に入ります。ちなみにCentOS6だと依存の関係でChrome入らなくて動きませんでした。悲しい。

サンプルコード

const puppeteer = require('puppeteer');

const url = 'https://example.com/';

(async () => {
  // puppeteer.launch({headless: false})にするとGUIあり。なぜかこっちの方が速かった。
  let browser = await puppeteer.launch();
  let page = await browser.newPage();
  // 画面サイズの設定。書かなくても動くが、画面が小くて
  // クリックが画面から見切れていて遷移できないことがあった。
  await page.setViewport({ 'width':1600, 'height':2000, 'deviceScaleFactor': 2, });

  // await page.goto(url); はページの読み込みが読み終わるまで待機する。
  // DOMContentLoadedになったら操作したい場合は以下。
  // await page.goto(url,{'waitUntil':'domcontentloaded'});
  await page.goto('http://example.com');

  await page.focus('input[name="sitem"]');
  await page.type('input[name="sitem"]', '検索ワード');
  await page.waitForNavigation({'waitUntil':'domcontentloaded'});

  // リンククリック時(page.click('a.-next'))やフォームの送信時のページ遷移は
  // loadやDOMContentLoadedで待つ必要がある。
  await Promise.all([
    await page.keyboard.press('Enter'),
    page.waitForNavigation({'waitUntil':'domcontentloaded'}),
  ]);

  let list = await page.$$('.list');
  for (let i = 0; i < list.length; i++) {
    let getText = await (await list[i].getProperty('textContent')).jsonValue();
    console.log(getText);
  }

  await page.screenshot({'path':'example.png'});

  await browser.close();
});

 

Nodemailerを使用してnodeからメールを送信

 

nodeでメールの送信がしたかったので、Nodemailerを使ってみた。

Nodemailer 公式サイト
https://nodemailer.com

Nodemailerをインストール

npm install nodemailer --save

サンプルコード

 

let transporter = mailer.createTransport( {
  host: 'mail.example.com',
  port: 465,
  secure: true,
  auth: {
    user: 'username',
    pass: 'password'
  }
});
let mailOptions = {
  from: 'mail@example.com',
  to: 'mail@example.com',
  cc" 'mail@example.com',
  subject: '件名',
  text: '本文',
  attachments: [
    { path: 'path/to/attachment_file.jpg' }
  ]
}

await transporter.sendMail( mailOptions, function(error,info) {
  if( error ){
    return console.log( error );
  } else {
    console.log('Message sent: ' + info.response);
  }
});

mailOptionsのマニュアル
https://nodemailer.com/message/

添付ファイルのマニュアル
https://nodemailer.com/message/attachments/