[Node-RED]配列の要素を取り出しながらループ
[Node-RED]SeleniumでWEBスクレイピング ~Node-REDで操作編~
前回でサーバ側の準備が整ったので、実際にNode-RED側から操作してスクレイピングします。
Node-REDにSeleniumノードを追加したらポチポチしていきます。
Remote URLはサーバを指定します。同一サーバであれば
http://localhost:4444/wd/hub
になりますね。
であとは、実際のWEB操作をなぞって配置していきます。
テキストボックスやボタンなどは、XPath指定の方が楽だと思います。
Firefoxでの取得方法は
・F12を押おすと、画面下に開発モード用の画面が開きます。
・タブでインスペクタを選択、HTML内のソースをポチポチすると実際の画面で該当箇所がわかるので
選択したい項目まで移動します
・右クリックのコピー → XPath(X) を選択すると、クリップボードにXPathの値が入ります。
・F12押して閉じる
で取得できます。
以下のフローは
【Seleniumサーバに接続する】~【IDとパスワードを入力してボタンを押す】~【移行した先の該当テキスト欄をデバッグに出力】~【画面キャプチャを行う】~【ブラウザを閉じる】~【キャプチャファイルを添付としてメールを送信】
【メール送信の完了を確認】~【キャプチャファイルを消す】
までの一連の操作です。
VNCなどでサーバ側にGUIログインしてると、実際にブラウザ開いて移行して閉じるまでの
動作確認が視認できるので面白いです。
以下フロー
[Node-RED]SeleniumでWEBスクレイピング ~Serverインストール編~
Node-REDでそろそろWEBスクレイピングをしたいと思います。
これができると、RPAに一歩近づいた気分になれます。
あまり選択肢はなく、Seleniumを使うのがよさそうのなので実験してみました。
が、Seleniumサーバ周りをインストールするのがちょっとめんどくさそうなのでDockerでデプロイする方法がよさそうでした。
~ Dockerインストールは略 ~
docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-firefox-debug
以上・・・! 上記はFirefoxのパターンの為、Chrome等の場合は別のモノを指定します。
https://github.com/SeleniumHQ/docker-selenium
debugを使うと、x11vncが立ち上がってる様子なのでVNCビューア等で5900を指定してログインする事が可能です。
あとは、Seleniumのサーバとブラウザを接続するドライバ、ブラウザが入っています。
GUIにログインすると、実際の操作しているブラウザの挙動が確認出来ます。
解像度を変更するには、Docker側の環境変数用ファイルを修正します。
/var/lib/docker/containers/コンテナID/config.v2.json
SCREEN_WIDTH ⇒幅
SCREEN_HEIGHT ⇒高さ
これでサーバ側の準備は整いました。
[Node-RED]フォームを作り、Postで送信し受け取って表示させる
[Node-RED]SSHで自動ログインしてコマンドを叩き、出力結果をWEBで表示したい編
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020/4/27 追記
node-red-contrib-ssh-v2-reconnection
ですが、2個以上設置した時点で挙動がおかしいのでやめました。
現状は直接execノードとsshpassコマンドで実装しています。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
そしていきなりハマった。すでにくじけそう。
まず、追加ノード:node-red-contrib-ssh-v2-reconnection を利用してみました。なんか他のがうまくいかなかったぽいので。
実行するコマンドはmsg.payloadに入れて渡せばいいんですが、実行後の出力結果を取る情報に関しては全く記載がない。
Usage
Input: msg.payload has to contain the command.
Output: none
て書いてある。none?! どういう事なんだぜ・・・。ノードのソースコードをみたら、msg.stdoutで取れそうなのでdebugで確認した所、恐らくいけそうでした。
ただ、その出力結果をWEBで表示できない。
色々調べたところhttp getが実行された場合、 .req と . res というパラメータができ、それを元にhttpレスポンスを返す仕組みぽいです。これが消えると No response object というエラーがでてうまくいきません。
SSHノードを経由するとこれが消えてしまうので、一旦フローの変数に入れてSSHを実行し、.reqと.resを戻してからhttpレスポンスするという荒業でなんとかできました。
もうちょっとスマートなやり方がある気がしてならないけど、いかんせん情報が少ない。これでいいのかすらわからない。Javascriptよく知らんし。
まあまだ触り始めただけなので、空いた時間で進めていこうと思います。
以下フロー
[Node-RED]CentOS7にインストール編
社内の業務をそろそろできるところから自動化していきたいのですが、UiPathはあまりうちの会社にはマッチしなかったです。お役所仕事とかにはとてもいいかもしれないけど。
まあ自動化の前に、小さい単位で効率化が必要だと思ってます。
とあるRPAサービスがあって、ベースはNode-REDで動いていました。まずはOSSのNode-REDで出来る範囲で理解を深めようかと思います。
今回はインストール編です。
(以下全てrootにて)
〇最新のnodejsを指定してインストール※今回は13入れました。
curl -sL https://rpm.nodesource.com/setup_13.x | bash -
yum install -y nodejs
〇epel経由でnpmをインストール
yum install epel-release
yum install npm --enablerepo=epel
〇node-redをインストール
npm install -g node-red
〇起動確認
node-red
で起動し、
http://IPアドレス:1880
で接続できる事を確認、CTRL+Cで抜ける。
〇systemctlに登録します。
githubに転がっているものはraspi用だったりしたので、そのまま使えませんでした。
その為、ExecStart行は実際にいれた環境に合わせる必要があります。
事前にターミナルにて、
/usr/bin/node --max-old-space-size=128 /usr/lib/node_modules/node-red/red.js -v
が起動できる事を確認しても良いかもです。
vi /etc/systemd/system/node-red.service
[Unit]
After=syslog.target network.target
Documentation=http://nodered.org/
[Service]
Environment="NODE_OPTIONS=--max-old-space-size=128"
Environment="NODE_RED_OPTIONS=-v"
ExecStart=/usr/bin/node $NODE_OPTIONS /usr/lib/node_modules/node-red/red.js $NODE_RED_OPTIONS
WorkingDirectory=/root/.node-red/
User=root
Group=root
Nice=10
SyslogIdentifier=Node-RED
StandardOutput=syslog
Restart=on-failure
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
〇systemctlのdaemon-reloadと起動確認
systemctl daemon-reload
systemctl start node-red
systemctl status node-red
〇完成!
ここからがスタート・・・!
Nixie Version2
ぱっと見、Nixie管時計です。
本サイトが稼働しているサーバが、これなのです。
Ver1は音声認識がなく、だんだんと後から改造していった結果マイクを外につけていたので、一度ガワを全部作り直してマイクも内臓してみました。
中味は色々なモノを詰め込んでいて、数年かけてじっくりプログラミングしています。
こんなものが入っています。
どういったものが稼働しているかというと
・WEBサーバ
・ラズパイ制御で動くNixie時計
・AnyEventによるイベント駆動プログラム
┣ 音声認識による各種イベント操作
┣ 外出時の動体検知によるカメラ撮影
┣ 赤外線による照明操作
┣ 温度・湿度・気圧の情報測定
┣ 地震情報取得及び音声通知
┣ 天気情報取得
┣ 時報お知らせ
┣ 目覚ましアラーム
┣ 一定以上の温度になったらファンで冷却
┗ etc...
がこの中でうごいてます。スマホにTermuxを入れ、一部機能はスマホから操作できるようにもしてあります。
Nixie管は こちら で作成させて頂いたものを使って、Perlで作り直しました。Nixie管には寿命があるので、家にいない時はOFFにするリレー回路も入れて、Nixie管の寿命が極力長くなるように努めます。
なぜならもうNixie管は製造してないから。今のストックが無くなったら絶滅するでしょうね。
検索パフォーマンスの現状
Linuxでユーザ単位にてSSHログインのIPアクセス制限をかける方法と注意点
/etc/hosts.allowではユーザ単位で細かく制限をかけられないので、pamを利用して制限します。
ラズパイのMicroSDカードが逝って更新してませんでした。
無調整で3年ぐらい運用してたんですが、やっぱり壊れました。中途半端に壊れたので日記の更新もできません。
稼働中はファイルの書き込みや更新等はできるんですが、再起動するとすべてが元に戻ります。
inodeの管理領域あたりが壊れたんかしら。
MicroSDの寿命を延ばす方法を考えてみます。










