Selenium(UserAgentをiOSに設定)でInstagramを開くと処理ができない通知が発生する問題について

1,389 views
Skip to first unread message

yoshi

unread,
Jan 25, 2019, 1:22:24 AM1/25/19
to 日本Seleniumユーザーコミュニティ
より詳しい内容やこれまでのトライについてはteratailで

現在、Selenium × RubyでInstagramのスクレイピングツールを作成しているのですが、下記のような「アプリをインストールしますか?」の通知が発生するとウインドウ上のどのボタンもSelenium上で操作することができなくなるので困っています。

fdf02c04befbc8b571c4d963d79becc6.png


AWSで契約したWindowsサーバー上にSeleniumを使ってChromeを操作しInstagramをスクレイピングするプログラムをRubyで記述しています。

バージョンは以下のとおりです

  • ruby 2.3.3
  • selenium-webdriver 3.14.0
  • chromedriver 2.43

Instagramにアクセスするまでのコードは以下のとおりです。WindowsからクローリングしていることがInstagram社に知られるとブロックされる可能性もありますのでUSERAGENTをiOSに設定しています

require 'selenium-webdriver'

USER_AGENT
=
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 12_1_2 like Mac OS X; ja-jp) AppleWebKit/605.1.15 (KHTML,like Gecko) Version/12.0 Mobile/15E148Safari/604.1"

setting
= Selenium::WebDriver::Chrome::Options.new(
args: [ "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"])

driver
= Selenium::WebDriver.
for :chrome, options: setting

driver
.get(
'https://www.instagram.com/account_name/')


このプログラムでアクセスするとまれに上記の画像にあるような通知が発生します。この通知が非常に強力で、これを手動で何らかのボタンを押さないとSeleniumが動作しません。
ネットでググって

driver.switch_to.alert.dismis

などで対応ができると書いてあったので実行してみたのですがオブジェクトを取得できず失敗しました。

USERAGENTをWindowsのままであればこの通知は発生しないと思いますが、都合上、iOSのままにしておきたいです。この通知を操作する方法をご存知の方がいらっしゃいましたら教えてください。

※ちなみに、この通知ですが、作成したばかりのInstagramアカウントで、ログイン処理をすることで再現をしやすくなります
一度、手動でクリックしてしまうとしばらく発生しなかったりするので2回目以降の再現性が少し低めです。
Windows以外でもMacOSでもこの現象が発生したことを確認しております。


伊藤望

unread,
Jan 25, 2019, 5:41:16 AM1/25/19
to 日本Seleniumユーザーコミュニティ
伊藤です。

普通のAlertとは別物っぽいので、switchTo().alert()などでは対処できないと思います。

Chromeの起動時引数でこれが出ないよう制御するか、一度このダイアログをOKしたユーザープロファイルを保存しておいて毎回Chromeテスト時に使用すればできないかなと思いましたが、
調べた限りではちょっとわかりませんでした。

yoshi

unread,
Jan 27, 2019, 9:22:59 AM1/27/19
to 日本Seleniumユーザーコミュニティ
検証ありがとうございます。
そうですか…こちらも海外の文献なども調べてみてdefault_content_setting_values.notificationsの値をプロファイルで設定する方法も試してみたのですがダメでした。謎ですね…
再現性は極めて低いですが、まれに表示を防ぎきれない場合もあるので、引き続き検証してみて、どうしても無理な場合はマウスクリックによる操作も検討してみます。


2019年1月25日金曜日 19時41分16秒 UTC+9 伊藤望:

タカミ哲朗

unread,
Feb 5, 2019, 1:01:56 AM2/5/19
to yoshi, 日本Seleniumユーザーコミュニティ
的外れかもしれませんが
以下サイトの手法はいかがでしょうか?






2019年1月27日日曜日 yoshi <yoshinor...@future-i-mark.co.jp>:

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Jun-ichi Sakamoto

unread,
Feb 5, 2019, 7:45:44 AM2/5/19
to 日本Seleniumユーザーコミュニティ
以下サイトの手法はいかがでしょうか?


自分の Windows OS で、Windows SDK 入れてあったので Spyxx.exe 使って Google Chrome のウィンドウ構成を見てみました。
が、やはりといいますか、GPU レンダリングする関係でしょうか、Google Chrome の出す alert ウィンドウなどはいわゆる Win32 API 的な意味でのウィンドウではないようでした。

つまり、Google Chrome として1枚だけどかーんと Win32 API で言うウィンドウを持ってて、そのウィンドウ内のレンダリングは GPU などによるレンダリングとなってて、alert ウィンドウも (個別のウィンドウではなく) "描かれて" いるようです。

Spyxx.exe の観察結果のみならず、下図のように、Chrome のウィンドウサイズを小さくすると、alert ウィンドウが Chrome のウィンドウ外には出てこないことからも、これらポップアップ系の "ウィンドウ" が、Win32 API で言うようなポップアップウィンドウではなさそうであることを示していると思われました。

fig-01-001.png


自分、ちゃんとChromium とかのソースコード読んだり、まぁ、そこまでしないとしても、Chromium の実装について調べたり学んだりしたわけではないので、迂闊な判断は禁物かとは思いますが、上記のとおり観察結果を見る限り、残念ながらご紹介頂いた技法は、今回は応用できなさそうかな、と予想しております。

Jun-ichi Sakamoto

unread,
Feb 5, 2019, 8:05:41 AM2/5/19
to 日本Seleniumユーザーコミュニティ
実際に試していないのですが、自分で調べた・考えた結果を投稿します。

まず、件の通知は、"ネイティブアプリのインストールバナー" というものではないか、と、Google 検索してて行き着きました。
下記などご参照下さい。


この予想が正解だとして、上記で解説されているネイティブアプリのインストールバナーが表示される条件のうち、特に注目すべきは下記であると思われました。

  1. Service Worker が必要
  2. ウェブアプリ マニフェスト ファイルが存在する
  3. 2 週間のうち異なる 2 日間で、ユーザーが 2 回アクセスしている
"この通知が、出たり出なかったりする" のは、上記条件 3 に由来するものかもしれない、と思いました。

さて、このネイティブアプリのインストールバナーが表示されるのを阻止するには、上記条件を踏まえ、以下の方法 A か B かのいずれかの手法が使えるのではないか、と思いました。

  • 方法A. Service Worker を無効化する
  • 方法B. ウェブアプリマニフェスト(よくある例: "/manifest.json")のダウンロードを阻止する・または改竄する

方法 A については、ネットで「Service Worker 無効化」で検索するとやり方がわかると思います。
ただし、対象サイトが Service Worker が無効化されていると動作しない場合は、この方法 A は使えません。

方法 B ですが、Windows OS 上であれば、Fiddler ( https://www.telerik.com/fiddler ) や BlackJumboDog ( http://www.sapporoworks.ne.jp/spw/ ) を含め、方法は問いませんのでプロクシサービスを使って、ウェブアプリマニフェストへのアクセスを阻止して HTTP 404 にしてしまうとか、はたまた、ネイティブアプリのインストールバナーを表示させる設定を無効化するようプロクシで改竄してからブラウザに返すようにするとか、そのような技法を取れば実現できそうです。

以上、どこまでこの仮説があっているか、はたまた、方法 A および B の効果の程はわかりませんが、何かしら参考になれば幸いです。

最後にもうひとつ。
いろいろ無知で申し訳ないのですが、Google Chrome ではなく Mozilla Firefox や Microsoft Edge でも、この "ネイティブアプリのインストールバナー" は表示されるものなのでしょうか?
もしも、このネイティブアプリのインストールバナーが表示されるのは、あくまでも Google Chrome 独自の機能なのであるならば、Chrome 以外のブラウザを使うことでそもそも表示されないことになるのかな、と思いました。
特に、ブラウザの操縦・スクレイピングのために、Selenium を利用されているようですから、使用するブラウザの乗り換えもさほど苦にならないのかな? などと想像するところです。
(対象サイトとの兼ね合いや、たとえ Selenium といえどもブラウザごとに微妙に挙動が異なるなどあって、Chrome から乗り換えは難しいのかも、とも想像しますが)


Reply all
Reply to author
Forward
0 new messages