반응형

콜백 함수 이야기를 많이 듣는데 개념이 모호해서 정리

 

일반함수는 사용자가 직접 호출해서 사용한다

 

콜백함수는 콜백 함수를 등록해둔 코드가 실행되면서 호출된다. 말이 참.. ㅎㅎㅎ

 

app.get('/', (req,res) =>{
  res('hello');
});

간단한 노드.js 코드로 설명하면

 

get('/') 요청 응답후  두번째 인수로 등록된

(req,res) 함수를 부른다 

 

 

그냥 저냥 볼만했던 .. ㅠㅠ

반응형
반응형

해당 설정은

왼쪽 값이 undefined, null ,false 이면 오른쪽 값을 사용하라는 설정

ex)

const port = process.env.PORT || 8080;

이면
포트 설정 값이 따로 없으면 8080 으로 세팅 된다

오늘 팁 끝

대충 쌓아도 잘 타는 장작

반응형
반응형

request 모듈이 필요하다.

python3 -m poetry add request

 

replit.com 에서 코드 테스트하고 있다.

패키지 검색이 안되어서 shell 탭에 직접 명령어 넣어서 설치

 

from  requests import get

# 상태 체크  웹사이트 튜플로 정의 하기
websites =(
  "google.com",
  "naver.com",
  "https://facebook.com"
)

#상태 저장
result = {}

# 루프
for web in websites:
  # 첫 문장이 https:// 가 없으면 https:// 추가한다
  if not (web.startswith("https://")):
    web = f"https://{web}"
  
  # 상태 체크
  response = get(web)

  if response.status_code == 200:
    result[web] = "OK"
  else:
    result[web] = "FAILED"

#전체 사이트 체크 정보 출력
print(result)
반응형
반응형
days =["Mon","Tue","Wed","Thur","Fri"]

days.append("Sat")

print(days)

#튜플과 리스트에 다른점은  []  >>> ()ㅁ
#튜플은 변경할 수 없다.

# Dicts : 딕셔너리
# 키가 있는 데이터 리스트는 인덱스로 접근

player ={
  'name' : 'hong',
  'age' : 33,
  'alive' : True,
  'fav_food' :['piz','buger']
}

print( player)
player.pop('age')
player['XP'] = 1500
player['fav_food'].append("라면")
print( player)

#튜플과 리스트에 다른점은  [ ]  >>> () 로 정이한다.


#튜플은 변경할 수 없다. 불변이다

#  딕셔너리
# 키가 있는 데이터 기존 리스트는 인덱스로 접근  딕셔너리는 여러가지 데이터를 복합적으로 넣을 수 있다.

 

반응형
반응형
from random import randint

# 랜덤하게 1~50 사이 숫자 생성
pc_choice = randint(1,50)

palying = True

# 맞출때 까지 루프
while palying:
 
  # 유저가 고른 숫자
  user_choice = int(input("choose Number "))

  # 같으면 짝짝
  if user_choice == pc_choice:
    print("you won ",pc_choice)
    palying = False
  elif user_choice > pc_choice:
    print("Lower")
  elif user_choice < pc_choice:
    print("Higher ")

반응형
반응형

node 개발 .. 삽질 기록 220623

 

code: 'ERR_HTTP_HEADERS_SENT'

 

 

res. 2개 이상 하면 세션도 날라가고 오류가 발생한다..

 

 

 

반응형
반응형

얍얍

<html>
    <head></head>
    
    <body>
        <div>
            <span id="num">5</span></div>
    </body>
    
    <script>
        // 1초 마다  1씩 차감
        let time = 5;
        var 타이머 = setInterval(얍,1000);

        function 얍(){

            if ( time >= 1 ) {
                time = time-1;
                document.querySelector('#num').innerHTML = time;
            }else{
                clearTimeout(타이머);
                // 이걸 안하면 타이머 계속 호출한다..흐음 ..
            }
            // 계속 호출 되는거 확인용 콘솔
            // console.log('ttttt') 
        }
    </script>
    
</html>

이거 왜 할때마다 헷갈리지 ㅎㅎ

 

 

반응형
반응형

좋은행동 칭찬합니다 같이가치 사이트 흥하시길

클릭 기부하고 싶은데 

예전에는 어린이들만 했다.. 왜 그랬는지 노인들은 싫었는데 ㅎㅎ

이제 40대가 되니  에헴 

 

여하튼 생각날때마다 들어가서 

응원 (하트) 누리고 댓글을 달았다

 

그래도 개발자인데 한방에 하는 방법이 없을까 하다 크롤링 배워서 해보기로 함

 

그래서 백수기념으로 한번 만들어봤다 

재밌다 파이썬

 

겁나 빠르게 90개 정도 9천원 !!! 기부ㅋㅋ

 

코드 참고 하시고 시간 되시는 분 파이썬 돌려서 기부해주시면 좋을 거 같다 

시간 되면 댓글까지 할 예정

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pyautogui
import pyperclip
import time


#브라우저 생성
browser = webdriver.Chrome()

#로그인
def kakao_login():
    login ='https://accounts.kakao.com/login/together?continue=https%3A%2F%2Ftogether.kakao.com%2Ffundraisings%2Fnow'
    browser.implicitly_wait(2)  # 로딩 기다림
    browser.maximize_window() # 화면 최대환
    browser.get(login)

    #아이디 입력 #id_email_2
    browser.find_element_by_css_selector("#id_email_2_label").click()
    #id.send_keys('nayha77')  #이렇게 하면 bot 감지 대상
    pyperclip.copy('카카오아이디')
    pyautogui.hotkey('ctrl','v')
    time.sleep(2)

    #비밀번호 입력 #id_password_3
    browser.find_element_by_css_selector('#id_password_3_label').click()
    pyperclip.copy('카카오비밀번호')
    pyautogui.hotkey('ctrl','v')
    time.sleep(2)

    #로그인 버튼 
    login_send = browser.find_element_by_css_selector("#login-form > fieldset > div.wrap_btn > button.btn_g.btn_confirm.submit")
    login_send.click()



#웹사이트 열기
browser.get('https://together.kakao.com/fundraisings/now')
browser.implicitly_wait(3) #로딩이 끝날 때까지 10초까지는 기다려줌
kakao_login() #로그인 

#스크롤 전 높이
before_h = browser.execute_script("return document.body.scrollHeight")

#무한 스크롤 제일 하단까지 이동
while True:
    # 맨 아래로 스크롤 내린다.
    browser.find_element_by_css_selector('body').send_keys(Keys.END)
    time.sleep(1)     # 스크롤 사이 페이지 로딩 시간

    # 스크롤 후 높이 
    after_h = browser.execute_script("return window.scrollY")

    # 스크롤 전 후 같으면 while 탈출
    # 같지 않으면 스크롤 후 높이를 스크롤 이전 변수에 할당한다.
    if after_h == before_h:
        break
    before_h = after_h

# 상품 정보 div 에서 URL 정보 가져온다
items = browser.find_elements_by_css_selector('.listcard')

#  기부 URL 배열
link_url = []
for item in items:
    try:
        link_pack = item.find_element_by_css_selector('.link_pack').get_attribute('href')
        link_url.append(link_pack)
    except:
        pass

# 가져온 링크 하나씩 접속
#for idx in range(1,3):  #테스트 3개만
for idx in range(len(link_url)):
    try:
        browser.get(link_url[idx])
    except:
        print("Time Out!")
        continue

    ######## 접속한 URL에서 응원 클릭 받아오기 ########
    try:
        browser.find_element_by_css_selector('#mArticle > div.fund_float > button.btn_g.btn_cheer').click()
    except:
        browser.switch_to_alert().alert()
        print("게시글이 삭제된 경우입니다.")
        continue
반응형
반응형

처음 시작 높이를 

execute_script("return window.scrollY")

이걸로 하는데 계속 0 으로 찍히는 오류?

 

 

아래 스크립트로 변경 하니 정상 

execute_script("return document.body.scrollHeight")

 

출처 https://june98.tistory.com/13

반응형
반응형
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
# 파이썬에서 키움증권의 클래스를 사용하려면 PyQt의 QAxWidget 클래스를 사용해 인스턴스를 생성
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PYSTOCK")
        self.setGeometry(300,300,300,400)
        
        # QAxWidget 클래스의 인스턴스
        # QAxWidget 클래스는 QWidget / QAxBase 상속받음 
        # QAxWidget 요거 하나로 QWidget / QAxBase 정의된 메서드 사용가능
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")

        bnt1 = QPushButton("로그인",self)
        bnt1.move(20,20)
        # 이벤트와 이벤트를 처리할 메서드를 connect라는 메서드로 연결
        bnt1.clicked.connect(self.loginClick)

        bnt2 = QPushButton("로그인 체크",self)
        bnt2.move(20,70)
        bnt2.clicked.connect(self.loginCheck)


    def loginClick(self):
    	# 인스턴스를 통해 CommConnect 메서드를 호출하기만 하면 
        # 로그인을 위한 윈도우가 자동으로 실행 / 반환값으로 로그인 여부 체크
        # 리턴 0 성공 , 음수 실패
        ret =self.kiwoom.dynamicCall("CommConnect()")
        
    def loginCheck(self):
    	# 0 미연결/ 1 연결완료
        if self.kiwoom.dynamicCall("GetConnectState()") == 0:
            self.statusBar().showMessage("접속 안됨")
        else:
            self.statusBar().showMessage("접속중")

if __name__ =="__main__"        :
    app = QApplication(sys.argv)

    mywindow = MyWindow()
    mywindow.show()
    
    app.exec_()

실행화면

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PYSTOCK")
        self.setGeometry(300,300,300,150)

        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        # CommConnect 메서드를 MyWindow 클래스의 생성자에서 호출했습니다. 
        # 따라서 윈도우가 생성됨과 동시에 로그인 창도 함께 화면에 표시
        self.kiwoom.dynamicCall("CommConnect()")

        # self를 사용하는 이유는 클래스의 다른 메서드에서도 해당 변수를 사용해 객체에 접근하기 위해서
        #  event_connect 메서드에서도 사용되기 때문에 text_edit가 아니라 self.text_edit
        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(10,60,200,80)
        #읽기/쓰기 모드를 변경하기 위해 setEnabled
        self.text_edit.setEnabled(False)
        # OnEventConnect  이벤트가 발생하면 event_connect 메서드 실행..
        # 이벤트와 이벤트 처리 메서드를 연결할 때는 connect 메서드를 사용
        self.kiwoom.OnEventConnect.connect(self.event_connect)

    # 메서드의 첫 번째 인자는 인스턴스를 의미 두 번째 인자로 nErrCode에 해당하는 값을 받으면 됩니다
    def event_connect(self ,err_code):
        if err_code == 0:
            self.text_edit.append("로그인 성공")

if __name__ =="__main__"        :
    app = QApplication(sys.argv)

    mywindow = MyWindow()
    mywindow.show()
    
    app.exec_()

로그인 전 실행 화면
로그인 성공 후 키움 API 이벤트( OnEventConnect ) 받아온 화면

반응형

+ Recent posts