ブラウザを使用せずにワイヤレスプロバイダーの「オープン」ネットワークに対して認証するにはどうすればよいですか?


13

この種の設定は、ショッピングモールや空港では一般的なようです。カナダ西部では、Shawはそのようなサービスを提供し、「Shaw Open」と呼んでいます。他のロケールにもT-Mobileなどのプロバイダーからの同様のサービスがあると確信しています。

携帯電話のようなものからそれを行うことはそれほど複雑ではありません。Wi-Fiホットスポットはパブリックアクセス用に「開いている」ため、Wi-Fiホットスポットに接続するために認証は必要ありません。ただし、ブラウザを使用してISPが提供する特定のWebページにサインインするまで、携帯電話はアプリを介してWebサイトまたはリモートサービスに接続しません。

簡単に言えば私の質問は、「従来のブラウザを通常備えていないデバイスからの認証手順を自動化するにはどうすればよいですか?」です。

私の特定のケースでは、トレードショーなどで使用したいソフトウェアで構成されたラズベリーパイがあります。これらの場所には、同じ種類の「オープン」ホットスポットがあります。Raspiは自己完結型であるためのものです。ただビジネスを行い、ウェブサイトに話しかけます。しかし、このアウトバウンド接続はISPの「オープン」接続によってブロックされます。これは、プロセスのブラウザー部分を完了していない、または完了できないためです。

特定のプロバイダーのネットワークでこれを行うための資格情報があると仮定すると、Piへのターミナルセッションを開く必要なくプロセスのその部分を自動化するにどうすればよいですか? ここではどのような技術が使用されていますか?


PiにLinuxがある場合、wgetプログラムはインストールされていますか?
デビッドウィルキンス14年

1
あなたの質問は実際にはLinuxやUnixに関するものではなく、スーパーユーザーに適しているでしょう。また、piにブラウザをインストールしたくない理由はありますか?links2たとえば、シンプルなテキストベースのコマンドラインブラウザを常に使用できます。
テルドン

@terdon PiがLinuxまたは他のUnixバリアントを実行している限り、ここで問題は完全に話題になります。逆に、私はPiがSUの定義に従ってコンピューターだとは思いません(しかし、私はそれについて確信がありません。
ジル 'SO-悪であるのをやめる' 14年

@Gillesはい、それは話題です、私は閉会に投票しませんでした。私はそれがSUにより適しているかもしれないと示唆していました。そして、はい、パイの質問はそこに歓迎されています。
テルドン

回答:


12

このような問題を解決するための鍵は、質問をする方法を知ることです。「パネラパンWiFiへのアクセス方法」を探してGoogleを検索し、この逸品を見つけました。

この記事には、自動ログインを容易にするために使用できるいくつかのスクリプトがありました。PythonのMechanizeライブラリーを活用するPanera Breadの例を含めることを選択しました。

このソリューションでは、NetworkManagerのdispatcher.dディレクトリを使用して、特定のネットワークインターフェイスがアップまたはダウンするたびにスクリプトを実行します。資料では、このディレクトリに置くだろうとスクリプトの詳細を、/etc/NetworkManager/dispatch.dと呼ばれます07-autologin_openwifi。そのスクリプトは次のとおりです。

#!/bin/bash
#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------

export LC_ALL=C
LogFile="/var/log/07-WIFI_ACCESS.log"

# The parameters that get passed to the script are:
# $1 = The interface name ( eth0, wlan0 ...etc)
# $2 = Interface status ( "up" or "down" )

# Check if wireless status is up
# I have two wifi cards in my laptop, named "wlan0 and wlan1"
# so I use regular expression "wlan[01]" to match both of them.
if [[ "$1" =~ wlan[01] && $2 == "up" ]]; then

    # Get the network name from "iwconfig" or (can also locate the network based on IP or MAC address if needed)
    ESSID=$(/sbin/iwconfig $1 | grep ESSID | cut -d'"' -f2)

    # Record the date and time for debugging purposes only
    echo "[`date`] ESSID=($ESSID)" >> $LogFile

    # If the wireless name matches then run its python script
    if [[ "$ESSID" == "BCPL-PUBLIC-WIFI" ]]; then
        /usr/bin/python /myscripts/baltimore-county_library_wifi.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "PANERA" ]]; then
        /usr/bin/python /myscripts/panera.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "Nordstrom_Wi-Fi" ]]; then
        /usr/bin/python /myscripts/nordstrom.py 1>> $LogFile 2>&1
    #elif .... (you can add more open wifi here)

    fi
fi

#if [[ "$1" =~ wlan[01] && $2 == "down" ]]; then
    ##If you want to do somehting when the network is down
#fi

そして、これがPaneraパンスクリプトですpanera.py

#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------
import mechanize
import sys

br = mechanize.Browser()
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0')]

testURL = 'http://fadvisor.net/blog/'
response = br.open(testURL)

if response.geturl() == testURL:
  print "FAD: You are already logged in to Panera."
  sys.exit()

try:
  forms = mechanize.ParseResponse(response, backwards_compat=False)
except:
  print "FAD: Error in parsing forms, Am I already logged in to Panera?"
  sys.exit()

response.close

form = forms[0]
#print form
#print "----------------------------------- Login"
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin New"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- CompleteLogin New"
#print

request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- HttpLoginRequest"
#print

request = form.click()
response = br.open(request)
#print response.read()

response.close()
print "--- Panera Done ---"

自動ログインを行うための他の方法に興味がある場合は、記事全体を読むことをお勧めします。この記事には、メリーランド州ボルチモア地域向けにスクリプト化された他のオープンWiFiネットワークがいくつかありました。


これは唯一の解決策かもしれませんが、残念ながら、開発者がすべての可能なプロバイダーを知っている必要があり、少なくとも独自の課題を抱えている異なるプロバイダーごとに送信するURLとフォームフィールドを決定するには、かなりのリバースエンジニアリングが必要ですそれらへの直接アクセス。私の特定のシナリオでは必ずしも可能ではありません。しかし、それは私が期待できる最高のものだと思います。もちろん、いずれかのプロバイダーのソリューションは、Web認証フォームの更新を決定するとすぐに壊れる可能性があります。
タコ14年

1

認証の実装方法によっては、HTTPリクエストを送信してアクセスできる場合があります。ただし、これは特定の実装の多くの側面に依存します。

これらのタイプの認証は、自律システムを排除し、ブラウザーのみにアクセスを許可するために導入されています。これはまさにあなたが回避しようとしていることです。

理想的には、Wi-Fiホットスポットとして設定し、Piをそのネットワークに接続できる電話があれば、何でもできるようになりますが、無料ではありません。

TL; DR:B食は選択者にはなれません


1
ブラウザ経由で行う場合は、HTTPを使用する必要があるため、これは確かに可能です。ただし、この種類の認証(AFAIK)にはプロトコルや標準がないため、プロバイダーごとに何かを実装する必要があります。実装されていない場所に持って行きたい場合、これは役に立ちません。電話のホットスポットに行きます。電話をオープンネットワークに接続すると無料なります。
goldilocks 14年


1

2番目のネットワークデバイスがある場合は、NAT転送を設定できます。携帯電話またはラップトップを使用して「内部」ネットワークに接続し、RPiがその接続をネットワーク全体に転送するようにします。次に、ラップトップまたは電話のブラウザで認証します。ネットワークは、RPiの外部MACアドレスを確認し、それを認証済み接続に関連付けます。

ポケットトラベルルーター(古いAirMac Express)を使ってこれを定期的にホテルのインターネットに接続し、Chromecastやその他のデバイスを再認証なしでそのネットワークに接続できます。

さらに簡単に...ネットワークデバイスがUSBでラップトップで動作する場合は、ラップトップに接続してネットワークにログインします。次に、RPiに再接続します。数時間動作するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.