使用 Android 应用程序 (Java) 登录网站
Logging into a website using Android app (Java)
我目前正在尝试制作一个应用程序,允许您登录到您的帐户并查看需要显示的任何数据。
我没有使用 webview,而是为了显示信息,我将从 HTML 解析数据,然后从那里开始工作,提取我需要显示的数据。我将从下面的应用中 post 代码。
我需要帮助的是弄清楚如何使用我的应用程序登录网站。
基本上,步骤如下:
1.Enter 用户名
2.Enter 密码
3.Press 登录按钮
4.Send 网站用户名和密码
5.If - 网站 returns "Successful login",继续并解析 HTML 的下一页,否则 - 显示 "Wrong username or password"
但是,我不知道如何让我的应用程序登录,或者至少在网站的登录字段中输入数据,这样我至少可以通过某种方式获得响应。
我对此很陌生,所以请至少指出正确的方向,以便我弄明白。非常感谢。
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class MainActivity extends AppCompatActivity {
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView LoginTitle = findViewById(R.id.tvLoginTitle);
EditText Username = findViewById(R.id.etUsername);
EditText Password = findViewById(R.id.etPass);
Button Login = findViewById(R.id.btLogin);
Login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Parse().execute();
Intent intent = new Intent(MainActivity.this,UserAccount.class);
intent.putExtra("data",data);
startActivity(intent);
}
});
}
public class Parse extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Document WebPage = Jsoup.connect("https://myurl").get();
Log.d("data", WebPage.toString());
data=WebPage.toString();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//Used in guide, however, my implementation of the app doesn't seem to need this.
}
}
}
我不确定您在此处记录网页内容的目的是什么。
您首先需要做的是检查 "browser" 是否启用了 Javascript 但在您的情况下这没有实际意义,因为您使用的是自己的 WebView。只检查是否启用了 JS 仍然是明智的。
下一步显然涉及使用 JS,因为我要求您检查它是否已启用。这是代码,但请注意我没有对此进行测试,但这是朝着正确方向迈出的一步:
public void loginUser(View view) {
InputMethodManager inputMan = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(layout.getWindowToken(), 0);
webView.loadUrl("https://yourwebsite.net");
webView.setVisibility(View.INVISIBLE);
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
webView.loadUrl("javascript: {" + "document.getElementById('login_account').value = '" + "USERNAME" + "';" + "document.getElementById('login_password').value = '" + "PASSWORD" + "';" + "document.getElementById('submit').click();" + "};");
}
public void onPageFinished2(WebView view, String url) {
webView.loadUrl(url);
}
});
webView.clearCache(true);
webView.clearHistory();
WebView webView2 = (WebView) this.findViewById(R.id.web_view);
String url = "https://yourwebsite.net";
webView2.loadUrl(url);
}
一些注意事项:为了安全起见,请将 login_account 和 login_password 的值更改为人们不容易猜到的值。
解决方法如下:
class HTTPRequest implements Runnable {
private URL url;
private User user;
private Handler handler;
private String cookie;
//**REDEFINED CONSTRUCTOR
HTTPRequest(Handler in_handler, User in_user) {
try {
url = new URL("https://yoururl.com");
handler = in_handler;
user = in_user;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//**Preparing to open connection
//**Using POST method
//**Enabling Input & Output
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
//**Setting Headers to send with POST request
conn.setRequestProperty("Accept", "text/html");
conn.setRequestProperty("Accept", "text/xml");
conn.setRequestProperty("Cookie", "upassword=" + user.getPasswordHashed() + "; ulogin=" + user.getUsername());
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "UTF-8");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
//**READING RESPONSE FROM THE SERVER:
//**IF LOGIN WAS SUCCESSFUL, SEND MESSAGE WITH XML DATA BACK TO UI THREAD, ELSE SEND NULL TO UI THREAD
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
if (isLoginSuccess(input)) {
StringBuilder response = new StringBuilder();
String tempString;
while ((tempString = input.readLine()) != null) {
response.append(tempString);
}
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = response.toString();
handler.sendMessage(msg);
} else if (!isLoginSuccess(input)) {
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = "Wrong";
handler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//**LOGIN IS SUCCESSFUL WHEN THE RESPONSE'S FIRST LINE EQUALS XML DECLARATION
//**RETURNS TRUE IF THAT IS THE CASE, MEANING YOU HAVE SUCCESSFULLY LOGGED IN
private boolean isLoginSuccess(BufferedReader input) throws IOException {
String LoginSuccess = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String response = input.readLine();
return response.equals(LoginSuccess);
}
}
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public static final String EXTRA_MESSAGE = "Message 1";
public static final String EXTRA_MESSAGE_2 = "Message 2";
Handler mainHandler;
Thread thread;
User user;
EditText etUsername;
EditText etPassword;
CheckBox cbRememberMe;
Button btLogin;
SharedPreferences preferences;
SharedPreferences.Editor SPEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.LoginPageTheme);
setContentView(R.layout.activity_main);
//**DECLARATION OF SHARED PREFERENCES
preferences = getApplicationContext().getSharedPreferences("Preferences", MODE_PRIVATE);
SPEditor = preferences.edit();
SPEditor.apply();
//**HANDLER INSTANTIATING AND HANDLING MESSAGES FROM HTTPRequest
mainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
String message = msg.obj.toString();
thread.interrupt();
if (!message.equals("Wrong")) {
if (cbRememberMe.isChecked()) {
user.RememberLoginSuccess(preferences);
}
Intent intent = new Intent(getApplicationContext(), ProfilePageActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_MESSAGE_2, user);
startActivity(intent);
finish();
} else {
etUsername.setError("Wrong username or password");
etUsername.setText("");
etPassword.setText("");
}
}
};
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
cbRememberMe = findViewById(R.id.cb_rememberMe);
btLogin = findViewById(R.id.bt_login);
btLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String temp_user = etUsername.getText().toString();
String temp_pass = etPassword.getText().toString();
if (!TextUtils.isEmpty(temp_user) && !TextUtils.isEmpty(temp_pass)) {
user = new User(etUsername.getText().toString(), etPassword.getText().toString());
thread = new Thread(new HTTPRequest(mainHandler, user));
thread.start();
} else {
etUsername.setError("Please, fill-out the form");
etUsername.setText("");
etPassword.setText("");
}
}
});
}
}
我目前正在尝试制作一个应用程序,允许您登录到您的帐户并查看需要显示的任何数据。
我没有使用 webview,而是为了显示信息,我将从 HTML 解析数据,然后从那里开始工作,提取我需要显示的数据。我将从下面的应用中 post 代码。
我需要帮助的是弄清楚如何使用我的应用程序登录网站。
基本上,步骤如下:
1.Enter 用户名
2.Enter 密码
3.Press 登录按钮
4.Send 网站用户名和密码
5.If - 网站 returns "Successful login",继续并解析 HTML 的下一页,否则 - 显示 "Wrong username or password"
但是,我不知道如何让我的应用程序登录,或者至少在网站的登录字段中输入数据,这样我至少可以通过某种方式获得响应。
我对此很陌生,所以请至少指出正确的方向,以便我弄明白。非常感谢。
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class MainActivity extends AppCompatActivity {
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView LoginTitle = findViewById(R.id.tvLoginTitle);
EditText Username = findViewById(R.id.etUsername);
EditText Password = findViewById(R.id.etPass);
Button Login = findViewById(R.id.btLogin);
Login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Parse().execute();
Intent intent = new Intent(MainActivity.this,UserAccount.class);
intent.putExtra("data",data);
startActivity(intent);
}
});
}
public class Parse extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Document WebPage = Jsoup.connect("https://myurl").get();
Log.d("data", WebPage.toString());
data=WebPage.toString();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//Used in guide, however, my implementation of the app doesn't seem to need this.
}
}
}
我不确定您在此处记录网页内容的目的是什么。 您首先需要做的是检查 "browser" 是否启用了 Javascript 但在您的情况下这没有实际意义,因为您使用的是自己的 WebView。只检查是否启用了 JS 仍然是明智的。
下一步显然涉及使用 JS,因为我要求您检查它是否已启用。这是代码,但请注意我没有对此进行测试,但这是朝着正确方向迈出的一步:
public void loginUser(View view) {
InputMethodManager inputMan = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(layout.getWindowToken(), 0);
webView.loadUrl("https://yourwebsite.net");
webView.setVisibility(View.INVISIBLE);
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
webView.loadUrl("javascript: {" + "document.getElementById('login_account').value = '" + "USERNAME" + "';" + "document.getElementById('login_password').value = '" + "PASSWORD" + "';" + "document.getElementById('submit').click();" + "};");
}
public void onPageFinished2(WebView view, String url) {
webView.loadUrl(url);
}
});
webView.clearCache(true);
webView.clearHistory();
WebView webView2 = (WebView) this.findViewById(R.id.web_view);
String url = "https://yourwebsite.net";
webView2.loadUrl(url);
}
一些注意事项:为了安全起见,请将 login_account 和 login_password 的值更改为人们不容易猜到的值。
解决方法如下:
class HTTPRequest implements Runnable {
private URL url;
private User user;
private Handler handler;
private String cookie;
//**REDEFINED CONSTRUCTOR
HTTPRequest(Handler in_handler, User in_user) {
try {
url = new URL("https://yoururl.com");
handler = in_handler;
user = in_user;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//**Preparing to open connection
//**Using POST method
//**Enabling Input & Output
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
//**Setting Headers to send with POST request
conn.setRequestProperty("Accept", "text/html");
conn.setRequestProperty("Accept", "text/xml");
conn.setRequestProperty("Cookie", "upassword=" + user.getPasswordHashed() + "; ulogin=" + user.getUsername());
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "UTF-8");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
//**READING RESPONSE FROM THE SERVER:
//**IF LOGIN WAS SUCCESSFUL, SEND MESSAGE WITH XML DATA BACK TO UI THREAD, ELSE SEND NULL TO UI THREAD
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
if (isLoginSuccess(input)) {
StringBuilder response = new StringBuilder();
String tempString;
while ((tempString = input.readLine()) != null) {
response.append(tempString);
}
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = response.toString();
handler.sendMessage(msg);
} else if (!isLoginSuccess(input)) {
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = "Wrong";
handler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//**LOGIN IS SUCCESSFUL WHEN THE RESPONSE'S FIRST LINE EQUALS XML DECLARATION
//**RETURNS TRUE IF THAT IS THE CASE, MEANING YOU HAVE SUCCESSFULLY LOGGED IN
private boolean isLoginSuccess(BufferedReader input) throws IOException {
String LoginSuccess = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String response = input.readLine();
return response.equals(LoginSuccess);
}
}
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public static final String EXTRA_MESSAGE = "Message 1";
public static final String EXTRA_MESSAGE_2 = "Message 2";
Handler mainHandler;
Thread thread;
User user;
EditText etUsername;
EditText etPassword;
CheckBox cbRememberMe;
Button btLogin;
SharedPreferences preferences;
SharedPreferences.Editor SPEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.LoginPageTheme);
setContentView(R.layout.activity_main);
//**DECLARATION OF SHARED PREFERENCES
preferences = getApplicationContext().getSharedPreferences("Preferences", MODE_PRIVATE);
SPEditor = preferences.edit();
SPEditor.apply();
//**HANDLER INSTANTIATING AND HANDLING MESSAGES FROM HTTPRequest
mainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
String message = msg.obj.toString();
thread.interrupt();
if (!message.equals("Wrong")) {
if (cbRememberMe.isChecked()) {
user.RememberLoginSuccess(preferences);
}
Intent intent = new Intent(getApplicationContext(), ProfilePageActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_MESSAGE_2, user);
startActivity(intent);
finish();
} else {
etUsername.setError("Wrong username or password");
etUsername.setText("");
etPassword.setText("");
}
}
};
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
cbRememberMe = findViewById(R.id.cb_rememberMe);
btLogin = findViewById(R.id.bt_login);
btLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String temp_user = etUsername.getText().toString();
String temp_pass = etPassword.getText().toString();
if (!TextUtils.isEmpty(temp_user) && !TextUtils.isEmpty(temp_pass)) {
user = new User(etUsername.getText().toString(), etPassword.getText().toString());
thread = new Thread(new HTTPRequest(mainHandler, user));
thread.start();
} else {
etUsername.setError("Please, fill-out the form");
etUsername.setText("");
etPassword.setText("");
}
}
});
}
}