팁과 노하우 게시판

전체보기

모바일 상단 메뉴

본문 페이지

[일반] 네이버 자동 로그인 프로그램

신휘랑
댓글: 8 개
조회: 25127
추천: 7
비공감: 1
2023-01-14 07:15:35

https://www.inven.co.kr/board/lostark/4821/89729
필독하고 오셈



이전에 만드신분이 로아를 접었는지 아니면 로벤을 접으셨는지
네이버 자동 로그인이 먹통이더라구요 (아이디 비번 까지는 입력하는데 다음으로 안넘어감)

그냥 로그인 버튼 계속 손수 눌러주다가 귀찮아서 그냥 올려놓은 소스 참고해서 보고 수정했습니다
문제 자체는 네이버 로그인 측에서 뭘 바꿨는지 탭 순서를 바꿨더라구요
그냥 탭 한번 덜하게 바꿨습니다.

파이썬 소스는 처음봐서 대충 이해하고 고친거구요
그냥 몇 자 수정한거 밖에 안됩니다

문제 발생하는건 제 책임 아니구요 위 링크 주의사항도 읽고 오세요

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# 반드시 관리자 권한으로!
import os
import subprocess
import configparser
import hashlib
 
#pip install pypiwin32
import win32gui
import win32con
import win32api
 
#pip install pycryptodome
import base64 
from Crypto import Random 
from Crypto.Cipher import AES
 
import time
 
class AESCipher:
    def __init__( self, key ):
        self.key = key
        BS = 16
        self.pad = lambda s: s + (BS - len(s.encode('utf-8')) % BS) * chr(BS - len(s.encode('utf-8')) % BS)
        self.unpad = lambda s : s[:-ord(s[len(s)-1:])]
 
    def encrypt( self, raw ):
        raw = self.pad(raw)
        iv = Random.new().read( AES.block_size )
        cipher = AES.new( self.key, AES.MODE_CBC, iv )
        return base64.b64encode( iv + cipher.encrypt( raw.encode('utf-8') ) )
 
    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return self.unpad(cipher.decrypt( enc[16:] ))
 
 
class reomote:
    def __init__(self):
        print('run')
        config = configparser.ConfigParser()
 
        if os.path.isfile('./config.ini'):
            config.read('./config.ini', encoding='utf-8')
            self.누ㅖ이뻐앙뛰 = config.get('settings''nㅔaㅏvㄴeㄱrㅁiㄴd')
            self.누ㅔ이뿌능삐뮐뻔호 = AESCipher(bytes(hashlib.sha256(config.get('settings''time').encode('utf-8')).digest())).decrypt(config.get('settings''ㄴpㅇsㅂaㅂaㅁzㅂt').encode()).decode()
            self.STOVE_CLIENT_PATH = config.get('settings''STOVE_CLIENT_PATH')
        else:
            print('네위벼 아이띨룰 윕력깨쥬셰요 위휴눈 읨미엾는굴쟈입뉘댜 가낟따람마팟싸튱귀게다라')
            self.누ㅖ이뻐앙뛰 = input()
            print('입력핫씬 아위디눈 [{}]잎니따. 잚묫윕럭하셨쑬켱유 헤당뽈터위 config.ini울 싹제후다시씰행해주쎄요'.format(self.누ㅖ이뻐앙뛰))
#            self.STOVE_CLIENT_PATH = r"C:Program Files (x86)SmilegateSTOVESTOVE.exe"
            self.STOVE_CLIENT_PATH = r"C:\Program Files (x86)\Smilegate\STOVE\STOVE.exe"
            if not os.path.isfile(self.STOVE_CLIENT_PATH):
                print('수톱부 끌라이연트 퍄이뤼 확킨되쥐 안씁뉘댜. 쓰톱쁘 끌라위얹틂를 펼도위 켱료에 썰취하셧을 켱유 해닿 겅롤룰 잎력해쥬세요.')
                self.STOVE_CLIENT_PATH = input()
 
            print("네윕벼 아이뒤[{}]의 뷔뮐번효를 잎럭해춧쎄오".format(self.누ㅖ이뻐앙뛰))
            attime = str(int(time.time()))
            pwd = AESCipher(bytes(hashlib.sha256(attime.encode('utf-8')).digest())).encrypt(input())
            self.누ㅔ이뿌능삐뮐뻔호 = str(pwd.decode())
 
            config['settings'= {
                'time': attime,
                'nㅔaㅏvㄴeㄱrㅁiㄴd'self.누ㅖ이뻐앙뛰,
                'ㄴpㅇsㅂaㅂaㅁzㅂt' : self.누ㅔ이뿌능삐뮐뻔호,
                'STOVE_CLIENT_PATH' : self.STOVE_CLIENT_PATH,
            }
 
            with open('./config.ini''w', encoding='utf-8'as f:
                config.write(f)
 
            # 생성 후 바로 로그인 시 오류로 추가
            self.누ㅔ이뿌능삐뮐뻔호 = AESCipher(bytes(hashlib.sha256(config.get('settings''time').encode('utf-8')).digest())).decrypt(config.get('settings''ㄴpㅇsㅂaㅂaㅁzㅂt').encode()).decode()
        
 
    def run(self):
        subprocess.Popen([self.STOVE_CLIENT_PATH])
 
        Main_STOVE_HWND = None
        while Main_STOVE_HWND == None:
            Main_STOVE_HWND = self.get_specify_hwnd("STOVE"360524)
            win32api.Sleep(100)
 
        print(Main_STOVE_HWND)
        self.click(Main_STOVE_HWND, 203369# click naver icon
 
        Child_CHROME_HWND = 0
        Main_STOVE_HWND = None
 
        while Child_CHROME_HWND == 0:
            while Main_STOVE_HWND == None:
                Main_STOVE_HWND =  self.get_specify_hwnd("STOVE"496624)
                win32api.Sleep(100)
            print('main', Main_STOVE_HWND)
            win32api.Sleep(100)
            Child_CHROME_HWND = win32gui.FindWindowEx(Main_STOVE_HWND, None"Qt5QWindowIcon""STOVE")
        print(Child_CHROME_HWND)
 
        Child_TAB_HWND = 0
        while Child_TAB_HWND == 0:
            win32api.Sleep(100)
            Child_TAB_HWND = win32gui.FindWindowEx(Child_CHROME_HWND, None"CefBrowserWindow""")
        print(Child_TAB_HWND)
 
        Child_NAVER_HWND = 0
        while Child_NAVER_HWND == 0:
            win32api.Sleep(100)
            Child_NAVER_HWND = win32gui.FindWindowEx(Child_TAB_HWND, None"Chrome_WidgetWin_0""")
 
        print(Child_NAVER_HWND)
        win32api.Sleep(1000)
        print('type')
        #self.click(Child_NAVER_HWND, 122, 469) #
        #self.typing(Child_NAVER_HWND, win32con.VK_TAB, True) # 
        self.typing(Child_NAVER_HWND, self.누ㅖ이뻐앙뛰) #
        self.typing(Child_NAVER_HWND, win32con.VK_TAB, True#
        self.typing(Child_NAVER_HWND, self.누ㅔ이뿌능삐뮐뻔호) 
        self.typing(Child_NAVER_HWND, win32con.VK_TAB, True#
        self.typing(Child_NAVER_HWND, win32con.VK_TAB, True
        self.typing(Child_NAVER_HWND, win32con.VK_TAB, True
#        self.typing(Child_NAVER_HWND, win32con.VK_TAB, True) #
        self.typing(Child_NAVER_HWND, win32con.VK_SPACE, True)
        self.click(Child_NAVER_HWND, 86302)
 
    @staticmethod
    def click(hwnd, x, y):
        POS = win32api.MAKELONG(x, y)
        win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 0, POS)
        win32api.Sleep(100)
        win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, 1, POS)
        win32api.Sleep(300)
        win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, POS)
 
    @staticmethod
    def typing(hwnd, text, VK = False):
        if VK:
            win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, text, 0)
            win32api.SendMessage(hwnd, win32con.WM_KEYUP, text, 0)
        else:
            for x in text:
                win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(x), 0)
 
    @staticmethod
    def get_specify_hwnd(TITLE, WIDTH, HEIGHT):
        def window_enumeration_handler(hwnd, top_windows):
            top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))
        top_windows = []
        win32gui.EnumWindows(window_enumeration_handler, top_windows)
        for hwnd, title in top_windows:
            if title == TITLE:
                rect = win32gui.GetWindowRect(hwnd)
                width = rect[2- rect[0]
                height = rect[3- rect[1]
                if width == WIDTH and height == HEIGHT:
                    return hwnd
        return None
 
if __name__ == '__main__':
    a = reomote()
    a.run()
cs

위 링크랑 비교해보시면 알겠지만
53 줄은 원 제작자 님이 소스코드 이상하게 올리신건지 제가 파이썬을 몰라서 그러는건지 링크가 이상해서 고쳤구요
74~75 줄은 config.ini 만들고 바로 로그인하면 암호화된 텍스트로 로그인해서 로그인 실패라 버그 수정 한거구요
123 줄이 위에 설명했다 싶이 기존에 있던 Tap 기능을 하나 뺀겁니다 (이거 때문에 로그인 안됐었음)

제가 중간에 해킹 소스 넣었을까 싶으시면 py 파일이 파이썬 소스파일이라 직접 파이썬 설치하셔서 구동 시키시면 됩니다
무슨 개짓거리 해놨을지 못 믿겠다 하시면 그냥 안 쓰시면 됩니다

다시 한번 말씀드리지만 위 링크 꼭 읽고 하시길 바랍니다

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 로아
  • 게임
  • IT
  • 유머
  • 연예
AD