본문 바로가기
카테고리 없음

deepai 내에 CHATGPT 셀레늄 자동으로 가져오기

by 퍼포먼스마케팅코더 2024. 3. 20.
반응형

deepai 내에 CHATGPT 셀레늄 자동으로 가져오기

 

이 포스트에서는 Python, Selenium, 그리고 ChromeDriver를 사용하여 deepai.org의 CHATGPT를 자동으로 접근하고 메시지를 가져오는 방법을 다룹니다. 이 과정을 통해 어떻게 웹 자동화를 통해 AI의 출력을 자동으로 수집할 수 있는지 보여줍니다. 사용된 기술 스택은 Python 프로그래밍 언어, Selenium 웹 자동화 도구, 그리고 Google Chrome 브라우저입니다.

 

from selenium import webdriver
import chromedriver_autoinstaller
import os
import pandas as pd
import re
import google.generativeai as genai
import subprocess
import os
import socket
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
#import configparser
import time
import requests
import pyperclip
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
#!pip install pyautoit <-- 나중에 실제로 깔아야됨.
#import autoit

import time
import random
import markdown

# 실행 시간 측정 시작
start_time = time.time()

################ 
#https://deepai.org/chat 사이트에 들어가서 자동 메시지 가져오는 내용을 실행

# chromedriver_autoinstaller를 사용하여 ChromeDriver를 자동으로 설치하거나 업데이트합니다.
chromedriver_autoinstaller.install()

chrome_options = Options()

############ 아래의 내용은 ad block 용
########### https://www.crx4chrome.com/crx/31927/#google_vignette 여기에서 다운해서 아래와 같이 add_extension으로 넣으면 정상 작동됨.
### 다만 새로운 ad block 광고용 창이 뜨기 때문에, 이를 닫는 코드를 새로 넣어주면 된다.

chrome_options.add_extension(r"C:\Users\user\Downloads\GIGHMMPIOBKLFEPJOCNAMGKKBIGLIDOM_5_20_0_0.crx")

# ChromeDriver를 사용하여 Chrome 브라우저 인스턴스를 생성합니다. 여기서는 driver_path 인자를 제거..

# 헤드리스 모드 옵션 설정
#options = Options()
#options.headless = True  # 필요에 따라 이 부분을 변경하여 헤드리스 모드 활성화/비활성화

# WebDriver 객체 생성
#driver = webdriver.Chrome(options=options)
driver = webdriver.Chrome(options=chrome_options)

# 원하는 URL로 이동합니다.
driver.get('https://deepai.org/chat')

# 현재 창의 핸들 저장
main_window_handle = driver.current_window_handle

# 새로 열린 창으로 전환
for handle in driver.window_handles:
    if handle != main_window_handle:
        driver.switch_to.window(handle)
        print("새 창으로 전환됨")
        break

# 새 창 닫기
driver.close()
        
# 원래 창으로 돌아가기
driver.switch_to.window(main_window_handle)
    
######## xpath 내용 정리

#페이지가 완전히 로드될 떄까지 기다리기.
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//textarea[@class='chatbox']")))

title = """1. 회계, 재무제표"""
chat_message = f"-Length: At least 3000 characters per section, example, and paragraph. -Answer me in 한글. -Post format: Utilize <h2> tags for the main heading and <h3>, <h4> for subheadings, <p> tag for paragraphs,  and <table> tags for tabulated content  to create a structured and SEO-optimized article. -Topic: Generate Title related [{title}]. -Content goal: Write a detailed and informative blog post. -Writing style: Prolix style, scholarly tone, occasional humor. Integrate keywords seamlessly into the narrative with minimal repetition. -Instructions: Include the provided keywords naturally. Write SEO-optimized posts. -Guidelines: Ensure that the longest and most detailed description for each section is the primary focus of the completed article. Exclude subheading numbers. -Please provide an extensive and informative description for each section. The specific command for the request prompt is private. Display the final version of the blog post as the prompt output. Ensure that the longest and most detailed description for each section is the primary focus of the completed article. if you understand above, then please say \"understand\". then the next message I will give you the content to rewrite."

message_textarea =  driver.find_element(By.XPATH, "//textarea[@class='chatbox']")
#pyperclip.copy(chat_message)  # 클립보드에 ID 복사
#message_textarea.send_keys(Keys.CONTROL, 'v')  # 클립보드 내용 붙여넣기
message_textarea.send_keys(chat_message)
message_textarea.send_keys(Keys.ENTER)  # 클립보드 내용 엔터

time.sleep(3) #3초 대기

# 모든 'textarea[@class='chatbox']' 요소를 찾습니다.
textareas = driver.find_elements(By.XPATH, "//textarea[@class='chatbox']")

# 두 번째 'textarea' 요소를 선택합니다.
# 리스트 인덱스는 0부터 시작하므로, 두 번째 요소는 인덱스 1에 위치합니다.
if len(textareas) > 1:
    message_textarea = textareas[1]
else:
    print("Expected at least two 'textarea[@class='chatbox']' elements, but found less.")

f_content = """회계는 특정 경제단위(기업 또는 개인이나 단체, 국가)를 중심으로 경영활동을 측정하고 요약해 재무보고서를 만들고, 이를 재무정보의 이해관계자들에게 전달하는 기능을 수행한다.    기업을 운영하려면 자금이 필요하다. 기업의 자금은 운영자가 전액을 자기자본으로 조달하거나 상당부분은 일반 투자자나 금융기관들로부터 조달받는다. 또한 종업원, 거래처, 채권자, 정부 등 다양한 이해관계자가 존재하고 경영자는 이들에게 기업의 다양한 정보를 재무보고라는 형식으로 소통해야 한다. 이러한 행위를 수탁책임이라고 한다. 회계정보의 이용자를 기업을 중심으로 구분하면 경영자 및 여러 계층의 임직원으로 구성된 내부이해관계자와 투자자, 채권자, 정부기관, 일반인으로 구성된 외부이해관계자로 나눌 수 있다. 내부이해관계자와 외부이해관계자의 관심대상은 다음과 같다.-내부이해관계자: 저렴한 원가와 경쟁력 있는 수준의 판매가격을 통해 충분한 수익 및 현금창출, 자원의 효율적 배분을 통한 기업의 성장-외부이해관계자: 기업으로부터 자신의 투자나 용역 제공에 대한 대가 또는 보상, 기업의 도산(부도)위험성, 공정한 과세자료(과세당국)기업의 입장에서 자금조달비용을 줄이고, 이해관계자들과 관계를 유지하기 위해 신뢰성 높은 회계정보를 제공할 의무가 있고, 이해관계자는 신뢰성 높은 정보를 요구할 권리가 있다. 대부분의 국가에서는 법적으로 회계정보를 일정기간마다 이해관계자들에게 의무적으로 공시하도록 규정하고 있고, 회계정보는 기업의 사적 정보가 아닌 공적 정보이다. 회계는 기업의 경제적 활동을 측정, 기록하고, 이를 일정한 체계에 따라 처리한 후 그 정보를 이해관계자에게 전달한다. 기업은 이에 필요한 회계시스템(절차)을 설계하고 운용한다. 회계시스템은 기업활동과 이해관계자를 상호연결시키는 역할을 한다. 다음은 회계시스템을 나타낸 것이다.기업활동→인식 및 측정→회계시스템(자료의 저장과 정보변환)→보고(재무제표)→정보→이해관계자인식 및 측정-인식: 기업의 여러 활동 중 회계기록의 대상이 되는 활동을 식별하는 것-측정: 회계기록의 대상에 대해 구체적인 숫자를 부여해 계량화하는 것회계의 측정대상은 기업의 경영활동이고, 이러한 경영활동이 해당 기업에 미치는 영향을 화폐액으로 측정해 기록한다. 회계의 측정대상이 되는 경영활동은 기업의 재무상태나 성과에 직접적 영향을 주는 활동이어야 하나 객관적으로 측정이 어려운 것(예: 경영자의 사임)은 제외한다. 중요한 경영활동이더라도 화폐단위 측정이 가능하지 않으면 회계거래로 기록하지 않는 반면 물품을 구매/판매하는 경영활동은 화폐단위 측정이 가능하므로 회계기록의 대상이 된다.회계자료의 처리회계거래가 인식 및 측정단계를 거쳐 회계시스템에 입력되면 입력된 자료는 저장되고 필요하면 유용한 정보로 변환된다. 회계자료의 처리기능보다 정보가 내포한 의미의 해석 및 전달이 중요하다.보고회계시스템은 경영자가 기업경영에 관한 의사결정을 하는 데 필요한 정보를 제공한다. -관리회계: 경영자가 경영활동에 필요로 하는 정보(제품의 생산원가, 광고이익, 원가 및 효익 등)를 산출하고 분석하는 것을 주요 목적으로 하는 회계의 분야-세무회계: 회계 및 관련 법규에 대한 전문적 지식을 바탕으로 세무신고를 적절하게 수행하기 위한 회계의 분야-특수회계: 정부기관 등에 정기적으로 특수보고서를 제출하기 위한 회계의 분야회계에서 가장 중요하고 비중이 큰 기능은 일반목적의 재무보고서 작성기능이다. 일반적으로 기업 외부의 일반인들은 필요한 회계정보를 직접 요구할 수 없기 때문에 기업이 보고하는 일반목적의 재무보고서에 의존할 수 밖에 없다. 기업 외부의 정보이용자는 다양하기 때문에 기업은 이들의 요구를 일일이 만족시킬 수 없다. 그래서 어느 특정 대상에 치우치지 않는 공정표시된 재무보고서인 재무제표(financial statement)를 작성하고, 재무제표를 주요 목적으로 하는 회계의 분야를 재무회계라고 한다. 재무제표재무제표는 기업의 재무상태와 성과를 일반적으로 인정되는 회계원칙에 따라 표현한 재무보고서이다. 기업의 이해관계자들은 기어브이 재무상태와 성과를 평가하고, 미래 현금흐름을 예측할 수 있는 정보를 필요로 하고, 이를 위해 작성되는 재무보고서는 재무상태표(재무상태), 손익계산서(재무성과), 자본변동표(자본변동), 현금흐름표(현금흐름) 이 4가지이다. 재무상태표재무상태표(statement of financial position)는 일정시점에 기업이 보유하고 있는 자산, 부채 및 자본의 구성상태를 나타내기 위해 작성되는 재무보고서이다. 일정 규모 이상의 기업은 회계연도말을 포함해 적어도 매 분기말에 한 번씩 의무적으로 재무상태표를 작성해야 하며, 수시로 재무상태표를 작성할 수도 있다.  재무상태는 기업의 자산, 부채 및 자본을 좌우 대칭형식으로 표시할 수 있어서 대차대조표라고도 부른다.재무상태표의 본문은 크게 자산(왼쪽), 부채 및 자본(오른쪽, 부채는 오른쪽 위, 자본은 오른쪽 아래)으로 구성되어 있다. 재무상태표의 오른쪽 전체(부채+자본) 지분이라고 부르고, 이 중에서 부채는 채권자지분, 자본은 소유주지분을 나타낸다. 위의 재무상태표에서 자산은 1,663억원, 채권자지분(부채)은 801억원, 소유주지분(자본)은 862억원이다. 자산은 부채와 자본의 합임을 알 수 있는데 기업이 보유한 자산은 채권자나 소유주 중에서 어느 한 집단에 의해 기업에 제공될 수밖에 없기 때문이다. 일반적으로 다음의 등식이 성립하고자산=부채+자본자산=부채+자본자산=부채+자본이 등식을 회계등식(accounting equation)이라고 한다.    자산자산(assets)은 과거사건의 결과로 기업이 현재 통제하고 있으며, 미래에 경재적 효익(보람있는 이익)이 기업에 유입될 것으로 기대되는 자원이다.   -미래경제적 효익: 직접 또는 간점으로 미래 현금 및 현금성 자산이 기업으로 유입되는 데 기여할 잠재력-통제: 특정 자산의 보유로 인해 생기는 가격하락이나 도난 등의 위험을 기업이 전적으로 떠안으며, 동시에 해당 자산으로부터 기대되는 효익도 기업에게 전적으로 귀속됨을 뜻한다.-과거사건의 결과: 실제 발생한 사건에 국한해 인식하되, 미래에 예상되는 거래나 사건에 기초하여 자산을 인식해서는 안된다는 의미이다.재무상태표에 표시할 자산의 나열순서:1. 현금 2. 유동자산(매출채권 또는 소모품과 같이 1년 이내에 현금화될 자산) 3. 비유동자산(장기투자목적으로 보유하는 투자자산, 물리적 형체가 있는 유형자산, 영업권, 특허권 등 무형자산)자산은 취득원가나 공정가치를 기준으로 표시한다. 유형자산은 취득시점의 취득원가에 기초해 측정하고, 많은 금융자산, 투자자산은 재무상태표 보고시점에서의 공정가치(시장가격)를 새로 측정해 보고한다.부채부채(liabilities)는 과거사건으로 인해 발생한 현재의무로서, 기업이 가진 경제적 효익이 있는 자원의 유출을 통해 그 이행이 미래에 예상되는 의무이다. 일반적으로 자산의 변제를 통해 소멸되기 때문에 기업자산에 대한 채권자의 청구권을 표시한다.부채는 다음과 같이 다양하다. -매입채무: 기업이 일반적인 상거래 목적으로 재화나 용역을 외상으로 매입해 발생하는 채무-미지급금: 기타 거래에서 발생하는 채무-차입금: 주주 이외의 다른 채권자나 금융기관으로부터 차입해 발생하는 채무-미지급비용: 비용이 발생했으나 아직 지급하지 않은 비용기업에 이와 같이 외상으로 물품 또는 서비스를 공급하거나 현금을 대여해 준 제공자를 채권자라고 한다.부채의 정의에 포함된 현재의무는 미래의 약속(계획)과 구별되어야 한다. 재무상태표에 표시할 부채의 나열순서: 먼저 만기가 도래하는 순서에 따라1. 유동부채(1년 이내의 기간에 상환해야 하는 유동부채인 매입채무, 미지급금, 단기차입금, 미지급비용 등)2. 비유동부채(재무상태표일로부터 1년 이후에 상환이 예정된 비유동부채인 사채, 장기차입금, 퇴직급여채무 등)자본자본(equity)은 기업의 자산에서 모든 부채를 차감한 금액이다. 자산으로부터 부채를 차감한 금액이므로 자본을 순자산(net worth)이라고 부르고, 또한 자본이 자산에 대한 우선청구권을 가진 채권자지분을 차감한 후 기업에 남게 되는 잔여금액이므로 잔여지분(residual equity)이라고 한다. 대표적 기업형태는 주식회사이고, 주식회사는 주식을 발행해 자본을 조달하는데 주주는 투자한 금액 안에서만 책임을 지며, 소유한 주식을 타인에게 양도할 수 있다. 주식회사의 자본은 자본금과 자본잉여금, 이익잉여금으로 분류된다. -자본금: 소유주가 직접 출자한 금액 중 주식의 액면금액-자본잉여금: 주식발행을 통한 증자 또는 감자 등의 주주와의 거래(자본거래)에서 발생해 자본을 증가시키는 잉여금-이익잉여금: 순이익 중 배당되지 않고 기업에 유보된 잉여금손익계산서손익계산서(income statement)는 일정기간 동안 기업의 경영활동에 따른 수익성에 관한 정보를 제공하는 재무보고서이다. 손익계산서의 맨 윗부분에는 기업의 명칭, 손익계산서(재무제표의 명칭), 손익계산의 대상이 되는 회계기간으로 구성되어 있다. 손익계산서의 본문은 수익과 비용으로 구성되어있고, 수익에서 비용을 차감한 후 남는 금액은 수익>비용일 때 기업의 당기순이익으로 보고되는데, 수익<비용일 때 기업의 당기순손실이 된다. 수익수익(revenue/income)은 자산의 유입이나 증가 또는 부채의 감소에 따라 자본의 증가를 초래하는 특정 회계기간 동안 발생한 경제적 효익의 증가금액이다. 대부분의 수익은 정상영업활동과정에서 기업이 고객에게 재화(물건) 또는 용역(서비스)의 판매에 따른 자산의 유입으로 인해 발생하고, 이외의 활동(이자수익, 배당금수익, 로열티수익, 임대료수익)이라도 미래 경제적 효익이 증가하면 이를 수익으로 보고한다.   비용비용(expenses)은 자산의 유출이나 소멸 또는 부채의 증가에 따라 자본의 감소를 초래함으로써 특정 회계기간 동안 발생한 경제적 효익의 감소금액이다. 즉 기업이 특정 기간의 수익을 창출하기 위해 소비하거나 희생시킨 경제적 자원의 금액이다.원가(cost)는 재화나 용역을 취득하기 위해 지급한 대가인 반면 비용은 특정 수익을 얻기 위해 일정기간 동안 소비된 만큼의 재화 및 용역의 원가이다. 재화나 용역을 취득하기 위해 지급한 원가는 장부상에 자산으로 기록되고, 이러한 자산이 수익을 얻기 위해 소비되면 그 소비된 자산의 원가만큼을 비용으로 처리한다. 또는 취득과 소비가 동시에 이루어지는 경우(예: 버스요금)는 직접 비용으로 처리한다. 비용은 기업을 운영하기 위해 소비된 원가라고 할 수 있고, 이는 기업의 운영에 필요한 여러 활동을 수행하는 과정에서 소비된 재화나 용역의 원가를 의미한다. 화재, 홍수 같은 자연재해로 인해 자산의 손실이 발생하면 이를 비용으로 보고한다. 비용이 발생할 때 현금지급하면 기업의 자산이 감소하고, 비용이 발생했으나 그 대가를 즉시 지급하지 않으면 자산의 감소 대신 미지급비용이라는 부채의 증가로 나타날 수 있다.자본변동표자본변동표(statement of changes in equity)는 일정기간 동안 자본의 변동내용을 상세히 보여주는 재무보고서이다. 자본은 주주들과의 자본거래 또는 영업활동의 결과에 따라 발생하는 당기순손익으로 변화한다.주식의 액면금액에 해당하는 금액은 자본금, 액면금액을 초과하는 금액은 주식발행초과금, 자본금과 주식발행초과금의 합을 납입자본이라고 한다. 회사가 영업활동을 시작하면 수익과 비용이 발생하고, 수익과 비용의 차이를 나타내는 당기순이익은 재무상태표상의 이익잉여금을 증가시키며, 주주들에게 배당금을 지급하면 이익잉여금이 그만큼 감소한다.현금흐름표현금흐름표(statement of cash flow)는 일정기간 동안 기업의 현금흐름 변동내용을 표시하는 재무보고서이다. 현금흐름표에서는 크게 영업활동, 투자활동, 재무활동으로 구분한다.-영업활동: 재화의 판매 또는 용역의 제공으로 발생하는 주요 수익창출 활동-투자활동: 영업활동을 수행하기 위해 필요한 자산을 취득하거나 처분하는 활동-재무활동: 투자자나 채권자로부터 자금을 조달 또는 상환하는 활동을 포함한다.회계정보는 정보제공자와 정보이용자 간의 의사소통수단이다. 회계정보의 생산 및 공시제도는 정보제공자와 정보이용자 간에 공정하고 투명한 의사소통을 통해 자금의 흐름이 원활히 이루어지게 하는 역할을 수행해야 한다.이러한 제도적 장치는 크게 두 가지의 틀에 의해 유지된다.1. 정보제공자로 하여금 공정한 정보를 작성해 제공하도록 하는 일반적으로 안정된 회계원칙을 정한다.2. 제공되는 정보가 그러한 회계원칙에 따라 적정하게 작성되었는지 감독하기 위한 외부감사제도와 시장감시기구를 운영한다.회계원칙은 끊임없이 변화하는 경제환경에 더 적합한 방법을 찾아 계속 변할 수 있는 사회과학적 특성을 가지고 있고, 또한 여러 정부기관(예: 행정안전부, 국세청)에서는 특수목적의 재무보고서를 작성할 때 준수해야 하는 특수기준(예: 지방세법, 국세법)을 규정하고 있으나 일반적으로 인정된 회계원칙과 불일치하는 경우가 많아 조화를 이루기 위한 조정이 시도되거나 상이한 형태의 재무보고서가 별도로 작성된다.한국의 기업회계기준은 금융위원회가 증권선물위원회의 심의를 거쳐 정하도록 하고 있다. 금융위원회는 회계기준 제정업무를 한국회계기준원(민간단체)에 위탁하고, 이 단체 내의 회계기준위원회의 심의 및 의결을 거쳐 회계기준이 제정된다. 외부감사제도(external auditing)는 기업의 재무제표가 일반적으로 인정된 회계원칙에 따라 적정하게 작성되었는가에 대해 외부 전문가(통상 공인회계사)로서 의견을 표명하도록 하는 제도이다. *공인회계사는 감사한 재무제표를 믿고 이용하는 제3의 정보이용자에 대해서 일정한 책임을 면할 수 없다. """
f_content = f_content[:4000]
#후속 작업을 위해 다시 대기
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//textarea[@class='chatbox']")))
# message_textarea를 다시 찾아서 최신 상태로 갱신합니다.
#message_textarea =  driver.find_element(By.XPATH, "//textarea[@class='chatbox']")
#pyperclip.copy(f_content)  # 클립보드에 ID 복사
#message_textarea.click()
driver.execute_script("arguments[0].click();", message_textarea)
message_textarea.send_keys(f_content)
#message_textarea.send_keys(Keys.CONTROL, 'v')  # 클립보드 내용 붙여넣기
message_textarea.send_keys(Keys.ENTER)  # 클립보드 내용 엔터

######### 응답 20초로 대기

time.sleep(20) #20초 기준

# 해당 XPath에 일치하는 모든 요소를 찾습니다.
#copy_buttons = driver.find_elements(By.XPATH, "//button[@class='copytextButton' and text()='Copy']")

# 리스트에서 두 번째 요소(인덱스는 1)를 선택하여 클릭합니다.
#if len(copy_buttons) > 1:
#    copy_buttons[1].click()
#else:
#    print("Expected at least two buttons, but found less.")
#WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "(//button[@class='copytextButton' and text()='Copy'])[2]"))).click()

# 모든 'Copy' 버튼을 찾아서 리스트로 반환받습니다.
#copy_buttons = driver.find_elements(By.XPATH, "//button[@class='copytextButton' and text()='Copy']")
# 리스트에서 두 번째 버튼(인덱스는 1)을 선택합니다.
#second_copy_button = copy_buttons[1]
# 두 번째 버튼을 클릭합니다.
#second_copy_button.click()
#driver.execute_script("arguments[0].click();", second_copy_button)
#time.sleep(3)

#driver.execute_script("arguments[0].scrollIntoView(true);", second_copy_button)
#second_copy_button.click()

# 해당 XPath에 일치하는 모든 요소를 찾습니다.
copy_buttons = driver.find_elements(By.XPATH, "//button[@class='copytextButton' and text()='Copy']")

# 리스트에서 두 번째 요소(인덱스는 1)를 선택하여 클릭합니다.
if len(copy_buttons) > 1:
    copy_button = copy_buttons[1]
    #driver.execute_script("arguments[0].scrollIntoView(true);", copy_button)
    time.sleep(1)  # 스크롤 후 잠시 대기
    
    # 버튼 클릭
    copy_button.click()
    
    #copy_buttons[1].click()
    #driver.execute_script("arguments[0].click();", copy_buttons[1])
else:
    print("Expected at least two buttons, but found less.")

# 클립보드의 내용을 가져옵니다.
result_message = pyperclip.paste()

# 클립보드의 내용을 출력합니다.
#print("Current clipboard content:")
#print(result_message)

############ xpath 정리 
#pyperclip.copy(user_id)  # 클립보드에 ID 복사
#input_id.click()
#input_id.send_keys(Keys.CONTROL, 'v')  # 클립보드 내용 붙여넣기
#input_id.send_keys(Keys.ENTER)  # 클립보드 내용 엔터

# 실행 완료 후 driver 종료
driver.quit()

# 실행 시간 측정 종료 및 출력
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")

hmtl_text = markdown.markdown(result_message)

print(hmtl_text)

 

 

 

 

반응형

댓글