Android:如何使用 HttpsURLConnection 以编程方式登录网页

2024-01-16

我是 Android 新手(也是 Java 新手),如果我的问题是一个基本命题,那么很抱歉! 我必须编写一个 Android 应用程序,在后台登录一个 aspx 网页,从中获取一些数据,然后从该网页注销。 (并以编程方式完成这一切)

基本上,该过程就像从 Gmail 获取电子邮件列表:
1.转到“https://mail.google.com”,然后登录
2.点击“联系人”(==转到“https://mail.google.com/mail/?shva=1&zx=dzi4xmuko5nz#contacts”)
3.使用 HttpsURLConnection (或类似的东西)获取页面,并在(例如 Map 或 String)对象中获取电子邮件
4.单击“退出”链接

我希望,这是可以理解的。在互联网上查找,我找到了仅“获取部分”的解决方案,所以这不是问题。但我对“点击部分”没有任何想法。

  ......
    // Get the connection
    URL myurl = new URL("https://mail.google.com");
    HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();

    // complete the fields
    con.setRequestProperty("Email","myacc");
    con.setRequestProperty("Passwd","mypass");

    /* 
     * in this part, should make sign in, and go directly to contacts... 
     * I don't have any idea how to do it...
     */

    // for the present, just write out the data
    InputStream ins = con.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(ins));

    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        Log.d("Page:"," "+inputLine);
    }

    in.close();

    /*
     * And here should be the "Sign out" part
     */
  ......

任何帮助都会很棒,谢谢! (抱歉,如果我的英语不太好......)

编辑:问题已解决。谢谢你!

 .......    
    String GMAIL_CONTACTS = "https://mail.google.com/mail/?shva=1#contacts";
    String GMAIL_LOGIN = "https://mail.google.com";

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(GMAIL_LOGIN);

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
        nameValuePairs.add(new BasicNameValuePair("Email", MY_ACC));
        nameValuePairs.add(new BasicNameValuePair("Passwd", MY_PASS));
        nameValuePairs.add(new BasicNameValuePair("signIn", "Sign In"));

        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request 
        HttpResponse response = httpClient.execute(httpPost);
        Log.d(TAG, "response stat code " + response.getStatusLine().getStatusCode());

        if (response.getStatusLine().getStatusCode() < 400) {

            String cookie = response.getFirstHeader("Set-Cookie")
                    .getValue();
            Log.d(TAG, "cookie: " + cookie);

            // get the contacts page 
            HttpGet getContacts = new HttpGet(GMAIL_CONTACTS);
            getContacts.setHeader("Cookie", cookie);
            response = httpClient.execute(getContacts);

            InputStream ins = response.getEntity().getContent();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    ins));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                Log.d(TAG, " " + inputLine);
            }

            in.close();
        } else {
            Log.d(TAG, "Response error: "
                    + response.getStatusLine().getStatusCode());
        }
 .......

“点击”基本上就是向服务器发送请求并显示返回信息。

1/找出该请求要调用的url(如果是网页,请参阅firebug)

2/ 查明参数是什么,查明方法是GET还是POST

3/ 以编程方式复制。

4/“登录”阶段可能意味着使用 cookie,服务器为您提供该 cookie,并且您必须在每次请求后发回该 cookie

然而,你的做法是错误的。您不应尝试通过 url 连接直接登录 google。 (您还应该使用 HttpClient)。此外,请求属性不是参数。它们是标题。

我强烈建议您从更简单的东西开始,以便熟悉 java 中的 HTTP、GET、POST、参数、标头、响应、cookie...

edit

收到回复后,您需要检查一下

response.getStatusLine().getStatusCode() < 400

它会告诉你登录成功。 (2xx 是成功,3xx 是移动等。4xx 是请求中的错误,5xx 是服务器端错误;Gmail 响应 302 登录以建议重定向到收件箱)。然后,您会注意到响应“Set-Cookie”中有一个特定标头,其中包含您想要用于进一步连接的 cookie,因此:

String cookie = response.getFistHeader("Set-Cookie");

然后,您应该能够调用请求来获取联系人:

HttpGet getContacts = new HttpGet(GMAIL_CONTACTS);
getContacts.setHeader("Cookie", cookie);
response = httpClient.execute(getContacts);
InputStream ins = response.getEntity().getContent();

应该是这样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:如何使用 HttpsURLConnection 以编程方式登录网页 的相关文章

随机推荐

  • ComboBox 无法识别韩语

    我的 WPF 中有一个组合框 用户可以在其中编写要以英语 日语或韩语搜索的文本 我对日语或英语没有任何问题 但控件无法识别韩语字符 但前提是它们直接写入组合框中 如果我复制 粘贴韩文文本 它们会被正确识别 例如 我有这个测试代码 priva
  • 生成私有、唯一、安全的 URL

    我想生成一个安全的一键访问类型的 url 类似于下面的示例 我将使用 PHP 但这无关紧要 因为我只是想了解基本概念 有些答案建议使用 GUID 但我认为这不会给我一个绝对唯一 安全的 URL 如下所示 Google Calendar 3q
  • Logstash Web UI 无法启动

    当我尝试使用 Web 前端启动 Logstash 时 我遇到了异常 尽管我遵循了以下位置的所有步骤官方教程 http logstash net docs 1 1 10 tutorials getting started centralize
  • 使用 iOS 访问相机

    显然 有些人已经能够弄清楚如何通过 SDK 访问 iPhone 摄像头 例如 Spore Origins 如何才能做到这一点 您需要使用UIImagePickerController类 基本上 UIImagePickerController
  • 在 vb.net 中读取文件中的字节

    获取文件名后 我创建一个新的文件流并将 FileStream 中的所有字节加载到字节数组中 现在我需要获取某些字节并将它们存储在字段中 例如第二个 4 个字节是创建文件的时间 当将它们存储在变量中时 我应该将它们存储为字节或字符串 整数 等
  • eclipse 中未定义的引用 glBindVertexArrayOES、glGenVertexArraysOES、glDeleteVertexArraysOES

    尝试使用 Android NDK 编译 C 代码 但这些错误不会消失 undefined reference to glBindVertexArrayOES undefined reference to glGenVertexArraysO
  • webpack + babel - 反应,意外的令牌“导入”

    我正在努力使index js https github com logary logary js blob master examples webpack index js与 es2015 一起工作 在引导我访问 babelrc 之前 请注
  • 防止用户在文本框中触发空格

    之前我用jQuery处理这个问题的方法如下 textInput keydown function e return e which 32 您将如何使用新的 Angular 和 Typescript 来处理它 或者简单地说
  • 使用 python winrt 模块进行 Windows Toast 通知和操作

    我已经尝试让它工作很长时间了 但我总是陷入检测按钮按下的困境 我做了一个 toast 通知 如下所示 这是我的代码 import winrt windows ui notifications as notifications import
  • SQLite 的小数位问题

    我有一个 SQLite3 表 其中一列的格式为 DECIMAL 7 2 但是每当我选择值不具有非零小数点第二位 例如 3 00 或 3 10 的行时 结果总是有尾随零缺失 例如 3 或 3 1 有什么方法可以在 SELECT 语句中应用格式
  • Gem::LoadError:为数据库适配器指定了“sqlite3”,但未加载 gem

    我正在尝试将我的应用程序推送到 heroku 但收到此消息 Gem LoadError Specified sqlite3 for database adaptor but the gem is not loaded 但我没有 我的 dat
  • 从 Docker 容器进行 dotnet 恢复失败

    我在过去的几天里研究了这个问题 但我发现的研究都没有帮助我解决这个问题 包括重新启动 Docker 重新启动 Docker 服务 重新启动 Visual Studio 删除 Nuget 调整代理设置 调整 Nuget config 等 最终
  • 调试:当类型标记为可序列化时,如何调试“类型未标记为可序列化”异常

    我试图 Request Params crmid null 在网页中 但它不断抛出序列化异常 在中键入 QC Security SL SiteUser 装配 QC Security 版本 1 0 0 1 文化 中立 PublicKeyTok
  • 在 C# 中访问 WindowsInstaller.Installer COM 对象

    我找到了一个不错的Powershell功能 https gist github com MyITGuy 153fc0f553d840631269720a56be5136在 GitHub 上 它使用 WindowsInstaller Inst
  • ASP.NET MVC 3 Razor 递归函数

    好的 所以我想显示一个包含列表列表的列表 我无法知道要显示多少层 所以我想这就是我打破旧的递归例程的地方 不过 我在具体如何解决这个问题上遇到了麻烦 这是我到目前为止所拥有的 视图 简化 foreach MyObject item in M
  • HTML 页脚问题

    是否可以创建一个位于网站底部的页脚 div 无论中间有多少信息 目前 我的 div 的位置取决于我的正文中有多少内容 也可以看看 如何让页脚停留在网页的底部 https stackoverflow com questions 42294 h
  • 将一个项目的 Dll 引用引用到另一个项目

    我有 2 个项目 一个是用 VB NET 构建的 另一个是用 C NET 构建的 我想在 C NET 中使用 VB NET 的某些功能 因此我通过从系统浏览 dll 将 VB NET 解决方案的 dll 文件添加到 C NET 中作为参考
  • 如何将邻接矩阵保存为 CSV 文件?

    我在 R 中使用 CSV 文件创建了一个邻接矩阵 如下所示 Gene1 Gene2 Weight A B 1 A C 0 5 B D 0 5 A D 1 这是我的 R 代码 el read csv my csv sep t library
  • 为什么 std::getline 不阻塞?

    我在 Objective C 类中 在 Objective C 文件中 有以下代码 NSString readString string res std getline cin res return NSString stringWithC
  • Android:如何使用 HttpsURLConnection 以编程方式登录网页

    我是 Android 新手 也是 Java 新手 如果我的问题是一个基本命题 那么很抱歉 我必须编写一个 Android 应用程序 在后台登录一个 aspx 网页 从中获取一些数据 然后从该网页注销 并以编程方式完成这一切 基本上 该过程就