로그인

반응형

 

SharedPreferences 사용법은 이분의 블로그를 보고 참고하였음

https://re-build.tistory.com/37

 

[Android] SharedPreferences 사용하기

이래저래 바쁘다는 핑계로 미루다가 오랜만에 포스팅을 하게 되었습니다. 벌써 새해가 밝았네요. 저만 시간이 빨리 가는 것처럼 느껴지는 건 아니겠죠? 모두 새해에는 좋은 일이 생겼으면 좋겠습니다. SharedPrefe..

re-build.tistory.com

앱을 쓰면 자주 보이는 로그인 정보 저장 기능을 구현한다. 

UI 는 다음과 같다

구현 목표는

  • 아이디와 암호를 체크박스 옵션으로 저장 유무를 결정한다.
  • 아이디와 암호를 따로 구분하지 않고 같이 저장함
  • 로그인시 아이디와 암호 둘 중 하나가 입력되지 않으면 "아이디/암호를 입력해주세요" 토스트메시지를 띄운다
  • 아이디/암호 입력 후 로그인 정보 기억하기 체크만 해도 정보가 저장된다.
  • 로그인 정보 기억하기를 체크하면 저장되고 해제하면 정보를 삭제한다

이런 동작을 하도록 구현

위 블로그를 참고하여 PreferenceManager를  만들어주고 MainActivity 이렇게 2개의 파일만 준비되어있으면 된다.

빨간 상자의 클래스는 필수 생성

 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="로그인"
            android:id="@+id/parse"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="QR Scan"
            android:id="@+id/scanQR"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="자산목록"
            android:id="@+id/dbList"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/et_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName"
            android:hint="사번" />

        <EditText
            android:id="@+id/et_pw"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPassword"
            android:hint="암호"/>

        <CheckBox
            android:id="@+id/cb_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="로그인 정보 기억하기" />

    </LinearLayout>

</RelativeLayout>

 

자세한 설명은 주석 참고

MainActivity.java

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private Button parsingBtn;
    private Button scanQRBtn;
    private Button ListBtn;
    private EditText et_id;
    private EditText et_pw;
    private CheckBox cb_save;
    String id,pw;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this; // 이거 필수!

        parsingBtn = (Button) findViewById(R.id.parse);
        scanQRBtn = (Button) findViewById(R.id.scanQR);
        ListBtn = (Button) findViewById(R.id.dbList);
        et_id = (EditText) findViewById(R.id.et_id);
        et_pw = (EditText) findViewById(R.id.et_pw);
        cb_save = (CheckBox) findViewById(R.id.cb_save);
        
        
        boolean boo = PreferenceManager.getBoolean(mContext,"check"); //로그인 정보 기억하기 체크 유무 확인
        if(boo){ // 체크가 되어있다면 아래 코드를 수행
            //저장된 아이디와 암호를 가져와 셋팅한다.
            et_id.setText(PreferenceManager.getString(mContext, "id")); 
            et_pw.setText(PreferenceManager.getString(mContext, "pw"));
            cb_save.setChecked(true); //체크박스는 여전히 체크 표시 하도록 셋팅
        }

        parsingBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){ //로그인 버튼 눌렀을 때 동작
                //아이디 암호 입력창에서 텍스트를 가져와 PreferenceManager에 저장함
                PreferenceManager.setString(mContext, "id", et_id.getText().toString()); //id라는 키값으로 저장
                PreferenceManager.setString(mContext, "pw", et_pw.getText().toString()); //pw라는 키값으로 저장
                
                Intent intent = new Intent(MainActivity.this, Parsing.class); //이건 없어도 무방
                // 저장한 키 값으로 저장된 아이디와 암호를 불러와 String 값에 저장
                String checkId = PreferenceManager.getString(mContext, "id"); 
                String checkPw = PreferenceManager.getString(mContext, "pw");
                //아이디와 암호가 비어있는 경우를 체크
                if (TextUtils.isEmpty(checkId) || TextUtils.isEmpty(checkPw)){
                    //아이디나 암호 둘 중 하나가 비어있으면 토스트메시지를 띄운다
                    Toast.makeText(MainActivity.this, "아이디/암호를 입력해주세요",
                            Toast.LENGTH_SHORT).show();
                }else { //둘 다 충족하면 다음 동작을 구현해놓음
                    intent.putExtra("id",checkId);
                    intent.putExtra("pw",checkPw);
                    startActivity(intent);
                }
            }
        });

        //로그인 기억하기 체크박스 유무에 따른 동작 구현
        cb_save.setOnClickListener(new CheckBox.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (((CheckBox)v).isChecked()) { // 체크박스 체크 되어 있으면
                    //editText에서 아이디와 암호 가져와 PreferenceManager에 저장한다.
                    PreferenceManager.setString(mContext, "id", et_id.getText().toString()); //id 키값으로 저장
                    PreferenceManager.setString(mContext, "pw", et_pw.getText().toString()); //pw 키값으로 저장
                    PreferenceManager.setBoolean(mContext, "check", cb_save.isChecked()); //현재 체크박스 상태 값 저장
                } else { //체크박스가 해제되어있으면
                    PreferenceManager.setBoolean(mContext, "check", cb_save.isChecked()); //현재 체크박스 상태 값 저장
                    PreferenceManager.clear(mContext); //로그인 정보를 모두 날림
                }
            }
        }) ;


        scanQRBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(MainActivity.this, ScanQR.class);
                startActivity(intent);
            }
        });

        ListBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
//                Intent intent = new Intent(MainActivity.this, DBHelper.class);
//                startActivity(intent);
            }
        });
    }
}

 

동작 별 코드를 설명하자면

1. 아이디와 암호를 입력 후 로그인 기억하기를 체크했을 때

이 코드가 동작하게 되어 PreferenceManager에 아이디와 암호가 각각 "id","pw"라는 키값으로 저장된다. 사용할 때는 getString에서 이 키값으로 불러와 사용하면 된다.

 

2. 로그인 기억하기가 체크된 상태로 앱을 종료하고 다시 실행했을 때

        boolean boo = PreferenceManager.getBoolean(mContext,"check"); //로그인 정보 기억하기 체크 유무 확인
        if(boo){ // 체크가 되어있다면 아래 코드를 수행
            //저장된 아이디와 암호를 가져와 셋팅한다.
            et_id.setText(PreferenceManager.getString(mContext, "id"));
            et_pw.setText(PreferenceManager.getString(mContext, "pw"));
            cb_save.setChecked(true); //체크박스는 여전히 체크 표시 하도록 셋팅
        }

위 코드에서 로그인 정보 기억하기 체크 유무를 확인한다. 체크가 된 상태로 종료했기 때문에 boo는 true 가 나올 테고 저장되어 있던 "id","pw"키 값을 불러와 아이디,암호 입력창에 셋팅해놓는다.

 

3. 로그인 기억하기 체크를 해제했을 때

위 코드가 동작하여 현재 체크 해제 상태이므로 false를 PreferencerManager에 상태 값을 저장하고 저장된 로그인 정보를 clear 코드로 모두 날린다. 그럼 앱을 종료하고 다시 실행했을 때 입력창에 아무것도 입력되어있지 않는 상태로 나타난다.

 

구현 방법은 사용자마다 다르고 더 깔끔하고 단순하게 작성할 수도 있지만 동작만 된다면 끝. 더 건드렸다가 다시 미궁 속으로 빠지긴 싫다.

 

반응형
반응형




https://yonoo88.tistory.com/1210


위 링크에서 만들었던 로그인 창은 암호 입력시 암호가 가려지지 않는다.


암호를 가리기 위해서는 다음 코드가 필요하다.


self.lineEdit_PW.setEchoMode(QtWidgets.QLineEdit.Password)


이 코드를 암호 입력 코드에 추가해준다.





아니면 코드를 추가하지 않고 Qt designer 에서 GUI 를 구성할 때 속성을 변경해주면 자동으로 코드가 추가되어 있다.



echoMode를 password로 변경해주면 다음과 같이 암호가 가려진다.






반응형
반응형


GUI 구성하기

Qt designer로 생성한 .ui 파일 파이썬 .py로 변환

http://yonoo88.tistory.com/1209


GUI 구성상태


기능 : ID와 PW 입력 후 시작버튼을 누름 > 동작 완료 후 listWidget에 로그인 성공 표시


아래 코드를 보면 UI 객체 명 별로 코드가 구성되어 있다

핵심은 시작 버튼에 이벤트 처리를 해주는 것. 시작 버튼 객체명은  startButton  이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
from PyQt5 import QtCore, QtGui, QtWidgets
from selenium import webdriver
import time
 
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(180234)
 
        self.listWidget = QtWidgets.QListWidget(Dialog)
        self.listWidget.setGeometry(QtCore.QRect(2016014161))
        self.listWidget.setObjectName("textBrowser")
 
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(80101616))
        self.label.setObjectName("label")
 
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(80702116))
        self.label_2.setObjectName("label_2")
 
        self.startButton = QtWidgets.QPushButton(Dialog)
        self.startButton.setGeometry(QtCore.QRect(501307523))
        self.startButton.setObjectName("startButton")
 
        self.lineEdit_ID = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_ID.setGeometry(QtCore.QRect(303011320))
        self.lineEdit_ID.setObjectName("lineEdit_ID")
 
        self.lineEdit_PW = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_PW.setGeometry(QtCore.QRect(309011320))
        self.lineEdit_PW.setObjectName("lineEdit_PW")
 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
#startButton 클릭시 autoExcute 함수 수행
        self.startButton.clicked.connect(self.autoExcute)
 
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog""Naver Login"))
        self.label.setText(_translate("Dialog""ID"))
        self.label_2.setText(_translate("Dialog""PW"))
        self.startButton.setText(_translate("Dialog""시작"))
 
 #셀레니움 동작 코드 함수 autoExcute 생성
    def autoExcute(self):
        driver  = webdriver.Chrome('C://chromedriver.exe')
        driver.implicitly_wait(3)
        driver.get('http://www.naver.com')
        driver.maximize_window()
        id = self.lineEdit_ID.text()
        pw = self.lineEdit_PW.text()
        driver.find_element_by_class_name('lg_local_btn').click()
        driver.find_element_by_id('id').send_keys(id)
        driver.find_element_by_id('pw').send_keys(pw)
        driver.find_element_by_class_name('btn_global').click()
        time.sleep(3)
        driver.close()
#listWidget에 로그인 성공 표시
        self.listWidget.addItem('로그인 성공')
        # self.addItem()
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
 

cs


코드를 실행시킨 후 아이디와 암호 입력 > 시작을 누르면 로그인 자동화가 진행되고 끝나면 로그인 성공 텍스트가 나타난다




반응형
반응형




사전 작업은 링크 참고


파이썬에서 selenium을 이용하여 크롬 브라우저 띄우기

http://yonoo88.tistory.com/1200 





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
import time
 
driver = webdriver.Chrome('C://chromedriver.exe')
driver.implicitly_wait(3)
driver.get('http://www.naver.com')
 
driver.maximize_window()
 
 
driver.find_element_by_class_name('lg_local_btn').click()
driver.find_element_by_id('id').send_keys('아이디')
driver.find_element_by_id('pw').send_keys('비번')
driver.find_element_by_class_name('btn_global').click()
 
time.sleep(3)
driver.close()
cs



반응형
반응형

진짜 이상한 걸로 스트레스 주는 사이트들은 반성해야함


xbox 앱 로그인이 안되는데 0x8015dc0c 이런 에러코드가 발생한다.


고객지원가서 에러코드 검색해도 나오지도 않는다. 뭐 이따구인지..


보니까 이 문제 겪는 사람이 꽤 많다 근데도 에러코드 설명을 추가하지 않는 건 무슨 똥고집인지


아무튼 이 에러코드의 원인은 나이 인증을 하지 않아서이다.


Xbox 홈페이지에 들어가 로그인 한 후 오른쪽 상단에 자신의 로그인 된 계정을 눌러준다.


그 메뉴에서 프로필을 눌러준다.




그럼 confirm age 라는 페이지가 나오는데 클릭한다.


그럼 아이핀 인증 창이 나온다.


인증완료 하면 이제 로그인이 된다.


마이크로소프트는 이 에러코드를 빨리 반영해놓길.



반응형

+ Recent posts