通过 Unix 脚本自动登录沃达丰社区 WiFi(Fon)

通过 Unix 脚本自动登录沃达丰社区 WiFi(Fon)

首先我要说我的问题类似于这个

我正在使用 Vodafone Community Fon AP,它经常断开连接。在我使用的 OS X 中,有一个名为 Captive Network Assistant 的工具可以连接到这些 AP。它可以完成这项工作,但不幸的是它不保留用户名/密码(我已向 Apple 提交了错误报告),因此每次我都必须再次输入它们。

我安装了 curl、lynx、wget,但我对这些工具不太熟悉。我可以通过 Macport 获取所需的一切。使用 Google Chrome,我识别出几个用于登录的 URL,但都不起作用。至少我无法让它们工作。以下是一些示例:

这是起始 URL:

https://it.portal.vodafone-wifi.com/jcp/it?res=welcome&nasid=90-55-6E-E5-E0-60&uamip=192.168.6.1&uamport=80&mac=00-19-E3-33-E0-72&challenge=bd551b56b4a5......26061f111ceaf&ip=192.168.6.2&userurl=http%3A%2F%2Fwww.google.com&lang=it&LANGUAGE=it

这是实际应该进行登录的 URL:

http://192.168.6.1/logon?用户名=FON%2FVF_IT%2F<用户>%40<领域>&密码=6223980fe........93ea753ef4de

其中 USER 是用户名,DOMAIN 是电子邮件地址域。出于安全原因,我在密码字段中将一些数字改为带点的数字,这可能是我使用的密码的加密。

我尝试使用 wget/curl/lynx 传递凭据,但链接中总是返回一个带有“密码错误”的 URL。

有人有解决这个问题的方法吗?

答案1

我终于找到了解决方案。可能需要几个循环才能连接,但最终它会进行身份验证。它适用于 OS X El Capitan 10.11.4,任何针对以前 OS X 版本(如果需要)或 Linux 的调整都应该很容易。

请注意,它需要安装“wget”并将其放在 $PATH 中。

在登录时作为 OS X 用户代理启动脚本检查一下。脚本如下:

#!/bin/sh

######################################################################
#
# OS X Script to automatically reconnect to a Vodafone Community AP
# when the connection drops.
#
# It's designed to support to be launched as an OS X login agent
# logging to the console.
# 
# Tested only on OS X EL Capitan. It should also run on Linux without
# many modifications
#
# Version 3.0
# Author: Michele Dall'Agata
#
# CHANGELOG:
#
# v3.0: All connection parameters are automatically retrieved from the 
#       Vodafone Station.
#       Force the use of Vodafone-WiFi APs.
#       Cleaner log.
# v2.2: Check after restarting the WiFi if the connection is up and continue
#       in case. It happens quite often.
# v2.1: All references to the WiFi interface now correctly use $WIFI_IF.
# v2.0: Reorganized the logic.
#       Added section OS X specific.
#       Loop waiting for WiFi connecting after restarting.
#       Added $WIFI_IF variable for WiFi interface.
#       Check if it is a Vodafone Community AP.
#       Fixed all wget commands.
#       Complete although stripped logging. Now it's clearer which step
#       is executed.
# v1.1: Restarts the WiFi interface.
# v1.0: first working skeleton. Hey, it did the job! :)
#
######################################################################


# $PATH should include the location where wget is installed
export PATH=$PATH:/opt/local/bin

# The Vodafone Country code. This is the code for Italy
COUNTRY=VF_IT

# The URL uses "%40" for "@". We do the same
USERNAME=<Your username>%40<Your domain>
PASSWORD=<Your Password>

# This will be visible in the Console app
# Set it to /dev/null if you don't want any log
LOGFILE=~/Library/Logs/Vodafone.log

# WiFi network interface. Option+Click on WiFI icon to get the one on
# your Mac. Change it accordingly.
WIFI_IF=en0

######################################################################
# For reference only. They get automatically set by the script
#

# MAC address of the Vodafone Station. 
NASID=
# MAC address of your WiFi interface. 
MACADDR=
# Vodafone Station (gateway) IP address.
IPADDR=


#######################################################################
# Begin Script
#######################################################################

# Log beginning of execution
echo >> $LOGFILE
echo $(date "+%d %b %H:%M:%S") Starting Vodafone Connection agent >> $LOGFILE

while [ true ]
do

# If the WiFi is switched off do nothing.  Otherwise check if we are connected to
# a captive network

    ! ifconfig $WIFI_IF | grep  "RUNNING" || \
        wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | \
        grep 'Success' >> /dev/null

    if [ $?  != 0 ]; then

        echo $(date "+%d %b %H:%M:%S") >> $LOGFILE
        echo $(date "+%d %b %H:%M:%S") Connection is down. Reauthenticating >> $LOGFILE

# This is OS X specific
        if [ $(uname) == "Darwin" ]; then

# Turn WiFi off and on in case the connection has got stuck (exclamation mark on WiFi icon)
            echo $(date "+%d %b %H:%M:%S") Switching WiFi Off >> $LOGFILE
            networksetup -setairportpower $WIFI_IF off

            echo $(date "+%d %b %H:%M:%S") Switching WiFi On >> $LOGFILE
            networksetup -setairportpower $WIFI_IF on

# We are here to reconnect to a Vodafone Community netwok.      
            networksetup -setairportnetwork $WIFI_IF Vodafone-WiFi

# Wait for the WiFi to connect to the router and get an IP address
            while ! ifconfig $WIFI_IF | grep  "inet " 2>&1 > /dev/null ; do
                echo $(date "+%d %b %H:%M:%S") Waiting for WiFi to connect >> $LOGFILE
                networksetup -setairportnetwork $WIFI_IF Vodafone-WiFi
                sleep 1
            done
            sleep 2

The connection may be up already. Check and in case loop again
            wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | grep 'Success' > /dev/null && \
                echo $(date "+%d %b %H:%M:%S") The connection is up and running\! >> $LOGFILE && \
                continue

# This could be at the beginning of the loop but the connection was down 
# so restarting the WiFi interface may help anyway.

# TODO: To check what happens if we use a different a different network
            if [ $(networksetup -getairportnetwork $WIFI_IF | awk '{print $NF}') != "Vodafone-WiFi" ];
            then
                echo $(date "+%d %b %H:%M:%S") Not a Vodafone AP
                sleep 60
                continue
            fi

        fi
#
# if Captive Network Assistant app launches for some reason DNS doesn't work.
# Just kill it

        pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
            $(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE

# We can get all needed parameters from the returned URL.
# Grab them querying any IP number and store them in $IPPARM

        IPPARM=$(wget -qO- --timeout=10 -t 1 8.8.8.8 2>&1 | grep loginVodafone | grep -i challenge | \
            sed -e 's/\&/=/g' | awk -F= '{ print $7 " " $9 " " $13 " " $15}')

# Assign each value
        read NASID IPADDR MACADDR CHALLENGE <<< $IPPARM

# If empty either the Captive Network Assistant deamon restored the connection or something went wrong. 
# Loop again

        if [ -z $CHALLENGE ]; then
            echo $(date "+%d %b %H:%M:%S") The station returned no login URL. The connection may be up. \
                >> $LOGFILE
        else

# Kill it again...
            pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
                $(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE
            echo $(date "+%d %b %H:%M:%S") Connecting to AP $IPADDR with BSSID $NASID >> $LOGFILE

            wget -qO-  --timeout=10 --keep-session-cookies \
                --post-data "chooseCountry=$COUNTRY%2F&userFake=$USERNAME$&UserName=$COUNTRY%2F$USERNAME&Password=$PASSWORD&_rememberMe=on" \
                "https://it.portal.vodafone-wifi.com/jcp/it?res=login&nasid=$NASID&uamip=$IPADDR&uamport=80&mac=$MACADDR&challenge=$CHALLENGE" \
                2>&1 >> /dev/null
        fi

# It may need some time to fully establish the connection?
        sleep 3

# And kill it again...
        pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
            $(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE

# Log if the connection was re-established
        (wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | grep 'Success' > /dev/null && \
            echo $(date "+%d %b %H:%M:%S") The connection is up and running\! >> $LOGFILE) || \
            echo $(date "+%d %b %H:%M:%S") The connection is still down. Retrying >> $LOGFILE

    else

# No need for more than 1s. When the connection is up it's just 1 HTTP query per loop.
        sleep 1
    fi
done

相关内容