Developers開発の実験等々、クイックサーブのメンバーが好き好きに書き込んでいく場所です。非常にニッチな目的に感じる題だが、以下の流れでこうなった諸事情でチャットワークの表示名を自動で変更する手段を作りたいチャットワークAPIを使えばいけそうユーザ情報を変更するAPIが存在しなかった(見落としているだけであったら教えてください)仕方ないのでスクレイピングで強引に変更しようチャットワークにログインする必要もあるのでSeleniumを使うのが良いのかなせっかくだから最近勉強してるPython3を使おう以上より、Seleniumを用いてFirefoxを自動操作し、チャットワークにログイン、表示名を任意のに変更するスクリプトを実装する。今回はGUIを持たない環境で実装するので、Xvfbを用いた仮想画面を使って動かす(この辺理解が怪しい)下準備まずFirefoxを入れる。画面無くて良いならPhantomJSとかヘッドレスブラウザ使えばいいじゃんと思い最初はそうしたのだが、どうしてもチャットワークが正しく表示できなかったので安定を取ってFirefoxにした。その分容量が大きいけど仕方ない。firefoxFirefoxのレンダリングエンジンであるgeckoをseleniumから利用するためのドライバーが別途必要。こちらからダウンロードできるので、OSの種類に応じてダウンロードする。今回は64ビット版のLinuxなので以下のように。パスが通ってるところで展開したほうが後々楽。PyVirtualDisplayログイン情報を定義チャットワークにログインするためのメールアドレスをパスワードが必要になるが、ソースコード中にハードコーディングしてしまうとコードの共有ができなくなってしまうので、今回はJSONファイルに別途書き出すようにする。以下のようなsecret.jsonを作成した。今回は一つのファイルで全て完結させるので、前項で作成したsecret.jsonと同じフォルダに、main.pyを作成する。モジュールインポート今回使うモジュールは以下の通りなのでimportする。Displayログイン情報を取得するsecret.jsonを開いて、jsonモジュールでデシリアライズ。仮想モニタを立ち上げ、SeleniumDriverをFirefoxで初期化。画面サイズがやたらと大きいのはデバッグ時のスクリーンショットを見やすくするためなので最終的に意味はない。webdriver.Firefox()チャットワークへのアクセスSeleniumDriverのgetメソッドで簡単にWebサイトにアクセスできる。driver.get('https://www.chatwork.com/login.php?lang=ja&args=')メールアドレス/パスワードを入力find_element_by_css_selectorメソッドで、CSSセレクターを用いてDOMを取得し、それに対してsend_keysメソッドを用いてキー入力を行うことができる。JSONファイルから取得しておいたメールアドレス/パスワードを入力する。今後他にも出てくるけど、SeleniumDriverって何かとメソッド名が冗長だなと思った。input[name="password"]').send_keys(password)ログインする同じくfind_element_by_css_selectorメソッドを用いてログインボタンを取得し、clickメソッドでクリックすることでログインする。input[name="login"]').click()ログイン処理には時間がかかる上、チャットワークはJavaScriptで画面を構築していくので、構築の完了まで待機する必要がある。Seleniumでは、以下のようにWebDriverWaitを用いることで、「特定の何かが確認できるまで待機する」という記述を行うことができる。"_myStatusName")))_myStatusNameは、この部分。これが表示されたら読み込み完了と捉える。読み込み完了でようやくチャットワークの画面に到達する。プロフィール画面を開くヘッダのプルダウンメニューを開いて、編集メニューをクリックしてプロフィール編集画面を表示する。まどろっこしい事してる気がする。可能であれば最初からプロフィール編集画面を表示するためのJavaScriptコードを実行させれば一発だと思うが、Seleniumの練習も含めて地道に行う。0.5秒のスリープを毎回挟んでるのは、UIのアニメーションがあるのでスグに次のUIを操作できないため。これもっと良い方法あったら教えて下さい。.myAccountMenu__anchor').click()time.sleep(0.5)表示名を編集する編集ボタンをクリックし、テキストボックスの内容を書き換え、保存ボタンをクリックする。変更後の表示名は、コマンドライン引数から取ることを想定し、sys.argvを参照する。以下コマンドで実装できる。ネットワーク環境の影響を大きく受けるが、手元の環境で実行時間は10秒程度。APIがあれば1秒で終わるというのに。すけ"最新のソースコードはこちら所感Seleniumの入門としてはえらくニッチな使い方になったが、個人的にやりたかったことが実現できたので良かった全体的冗長なコードになりやすそう。コメントをキャンセルメールアドレスが公開されることはありません。