特定网站的基本 NSURLSession 用法

Basic NSURLSession usage with particular website

我几乎不好意思问,但我正在尝试为自己构建一个小应用程序,但我对错综复杂的网络技术感到困惑。

这不是 Swift 我需要的帮助,更多的是方法...

我正在尝试以编程方式在此处登录https://account.tfl.gov.uk/oyster

这只是一个英国网站,可让您查看旅行卡上的余额。

我很讨厌网络东西,但我相信 POST URL 我需要点击的是:https://oyster.tfl.gov.uk/oyster/security_check (来自检查页面)

然而,下面的代码一直返回 200 OK,但 Web 服务器出错,指出该页面不可用。当然,该站点只是通过 POST?

进行的简单登录

任何见解都会很棒 - 即使只是指向正确方向的指针! - 非常感谢...当前方法如下:

func login() {

    var user = "myUsername"
    var pass = "myPassword"

    var config = NSURLSessionConfiguration.defaultSessionConfiguration()
    config.allowsCellularAccess = true


    var connection = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

    var request = NSMutableURLRequest(URL: NSURL(string: "https://oyster.tfl.gov.uk/oyster/security_check")!)
    request.HTTPMethod = "POST"

    var params = "username=\(user)&password=\(pass)"

    var err: NSError?

    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")


    connection.dataTaskWithRequest(request, completionHandler: {

        (data : NSData!, response : NSURLResponse!, error : NSError!) in


        var dataString = NSString(data: data, encoding: NSUTF8StringEncoding)


        println(response)
        println(dataString)



    }).resume()
}

查看登录页面的 HTML,有几点观察:

  1. 您可能需要确认 usernamepassword 字段名称的大小写。有时 Web 服务区分大小写。

  2. 如果您查看HTML中的表单,表单上还有其他字段。您可能希望发送该登录表单中存在的所有字段(即使它们在网络浏览器中不可见)。

    虽然这里似乎不是这种情况,但有时这些字段是动态生成的,您实际上必须先请求登录 html 页面,解析出这些字段,并将它们包含在您的请求中.

  3. 您可能想使用 Charles 等工具观看 Web 浏览器的交互。您可能希望尽可能忠实地重现请求。

  4. 构建请求正文时要小心。通常值必须被转义百分比。例如,如果密码包含 +& 等保留字符,则此代码将无效。在您的测试中可能不是这种情况,但需要警惕。

  5. 您可能需要查看此服务的服务条款,因为它们有时会禁止与其 Web 服务器进行编程交互。您不想 运行 违反他们的条款和条件。更重要的是,您不希望用户在使用您的应用时违反服务条款。

    您可能还想联系网络服务器提供商,看看他们是否已批准 API 执行您正在尝试执行的任务。

在该网页上,POST 需要一些额外的参数:这些隐藏在 HTML 中。我认为您需要提供所有必需的参数才能使其正常工作。

列表似乎是:

ReturnUrl="https://oyster.tfl.gov.uk/oyster/security_check"

AppId="8ead5cf4-4624-4389-b90c-b1fd1937bf1f"

用户名=""

密码=""

NB UserName 和 Password 的名称要大写。

尝试使用全部 4 种方法,看看效果如何。没有在这上面花很多时间,所以可能遗漏了一些东西。

var params = "ReturnUrl=https://oyster.tfl.gov.uk/oyster/security_check&AppId=8ead5cf4-4624-4389-b90c-b1fd1937bf1f&UserName=\(user)&Password=\(pass)"

您可能会发现使用 UIWebView 并使用 javascript 填写表单和执行登录按钮更简单。登录完成后,您可以使用 javascript 来抓取您想要的任何数据。这样你就可以简单地在他们的标准网页上自动化用户交互。有了这个,如果您显示 WebView,您还可以看到发生了什么。您还可以从处理所有需要 运行 让事情正常进行的重定向、脚本等的 WebView 中受益。

例如要设置用户名和密码并登录,您需要在 WebView 中 运行 in javascript 是:

username=document.getElementById("UserName");
username.value="<put in your username>";
password=document.getElementById("Password");
password.value="<put in your password>";
signinbutton=document.getElementsByName("Sign in")[0];
signinbutton.click();

这将处理 WebView 中登录的所有页面加载。

您可以使用 Safari 检查器尝试所有这些 window。