自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

Raspberry PiからPythonでWEB経由でWoLしてみる

前回はAndroidアプリの「Wol Wake on Lan Wan」からグローバルIPを指定してポートフォワーディングでマジックパケットを転送していました。

しかし、これではルーターに穴を開けることになるのでセキュアじゃない。

ような気がするので自宅で常時起動しているRaspberry Piを経由してWOLすることにします。

あと、なんか9月になってから「Wol Wake on Lan Wan」が公開停止になってるし。

できるようになること

  • Google Homeなどから音声コマンドでPCを起動

用意するもの

  • Raspberry Pi
  • IFTTTアカウント
  • Beebotteアカウント
  • Google Assistantが使える端末
  • WoLできるようにしたPC

WoLできるようにする設定は前回の記事の「PCのMACアドレスを確認」までを参照ください。

code-life.hatenablog.com

まずはPythonのライブラリをインストールしてテスト

wakeonlan

https://pypi.org/project/wakeonlan/

続きを読む

Python×Seleniumでswitch_to.frameが効かずハマったがchromedriver.exeを更新したら直った

朝のルーチンワークを少しでも減らそうとPythonで売上・アクセスデータの集計報告ツールを作って動作させているのですが、ある日正常に動かなくなった話。

売上・アクセスデータ集計報告ツール

  1. タスクスケジューラからPythonファイルを実行
  2. SeleniumでGoogle Analyticsへログイン
  3. Google AnalyticsからCSVデータをダウンロード
  4. pandasで過去のCSVデータと統合
  5. Excelで集計・分析
  6. 対目標・対前年で比較したデータをSlack BotにPOST

こいつが7月に入ってある日突然CSVデータがダウンロードされなくなった。 Google Analyticsにログインすることはできている。でもCSVはダウンロードされない。

いや、まぁ、手でやっても2分もかからない作業ではあるんですが、やっぱり単純作業はやらなくていいならやりたくないですよね。

chromedriver.exeが古かった

結論から言うと原因はchromedriver.exeが2018年3月時点のものだったこと。 そんなに頻繁に更新があるものと思っていなかったため最初はGoogle Analytics側のDOMが変わったのだろうと疑っていた。

しかし実際のところは以下から最新のchromedriver.exeをダウンロードして以前のexeファイルに上書き保存すれば済む話でした・・・。 2018年6月のバージョンを使うことで改善。

ChromeDriver - WebDriver for Chrome http://chromedriver.chromium.org/downloads

見てもしょうがないかもしれませんが、色々試した経緯を残しておきます。

Google AnalyticsのDOMが変わった・・・?

CSVダウロードに必要な箇所は変わっていませんでした。 ちなみにログインからCSVダウンロードまでのプログラムは以下のようなもの

download_directory = 'ダウンロード先ディレクトリ'
user_id = 'ユーザー名'
user_pass = 'パスワード'
  
driver = init_selenium(download_path=download_directory) # デフォルトダウンロードフォルダ変更
driver.implicitly_wait(10) # 要素表示までの最大待機秒数
driver.get('カスタムレポートのURL')
  
driver.find_element_by_css_selector('#identifierId').send_keys(user_id)
driver.find_element_by_css_selector('#identifierNext > content > span').click()
driver.find_element_by_name('password').send_keys(user_pass)
time.sleep(2)
  
driver.find_element_by_css_selector('#passwordNext span').click()
time.sleep(10)
  
# 操作対象をインラインフレームに移す
iframe = driver.find_element_by_css_selector('#galaxyIframe')
driver.switch_to.frame(iframe)
  
driver.find_element_by_css_selector('.ACTION-exportMenu').click()
driver.find_element_by_css_selector('.TARGET-CSV').click()
time.sleep(10)

Google Analyticsの画面はレポート表示領域がインラインフレームで形成されています。

故に操作対象をiframeに移す処理switch_to.frameが必要になるわけです。

途中からブラウザ接続が切断されていた

find_element_by_css_selectorの指定がおかしいのか? でもエラーで止まってるのはフレームに移動する前段階・・・。

driver.switch_to.frame(iframe)がおかしいのか・・・? でも推奨されている記述どおりで、driver.switch_to_frame(iframe)は使っていないし・・・。

まずdriver.find_element_by_css_selector('#galaxyIframe')が正常に動作しているのか・・・?

と思い検証したところAnalyticsにログインした直後からブラウザーとの接続自体が切れており、何の操作も受け付けられていなかったことが判明。

これは明らかにwebdriver自体がおかしいと思い、冒頭の「chromedriver.exe」の更新にたどり着いたということです。

すごい遠回りでしたねー。次からはまず最初にバージョン確認してみることにします!

よく使う? Python 3.x 関数とメソッドチートシート

勉強中のPythonでよく使う?使いそうなものを自分用にまとめ。 これ便利だ!って思ったら随時追加予定です。

組み込み関数

Python標準機能の関数

別途モジュールをインポートすることなく利用可能

数値計算

abs(数値)・・・数値の絶対値を返す

>>> abs(-2)
2


divmod(数値1, 数値2) ・・・数値1を数値2で割った結果を(商,余り)のタプルで返す

>>> divmod(15, 2)
(7, 1)


続きを読む

Pythonにおける繰り返し処理(forとwhile)の使用例と使い分け

Pythonで繰り返し処理を書くときに毎回検索しているので自分用にメモ。

forとwhileと疑似的なdo~whileの書き方。

for

繰り返す回数が決まっている場合や配列(リスト)に対して処理を実行する場合に利用する。

回数を指定

5回の繰り返し処理

for i in range(5):
    print(i)
続きを読む

4行でPythonからSlackへ投稿する(着信 Web フック)

f:id:maru0014:20180516215325p:plain

色々な通知をするのにも超便利なSlack。

会社のSlackでもIFTTTから自動投稿させたりしていますが、Pythonでいろいろ業務を自動化していくにあたって「自動業務が完了したよ!」をSlackに通知してほしいと思い調べたところ思いの外簡単だったのでサクッとメモしておきます。

前準備Slackに着信Webフックをインテグレーション

SlackのAppディレクトリで「hooks」と検索すると「着信 Web フック」というのが出てくるはず。

f:id:maru0014:20180516214011p:plain

続きを読む