공부2019. 1. 15. 19:28

3학년 1학기 네트워크 과제물로 제출했던 구글 smtp 를 통해 메일 보내기 입니다.


github 주소입니다. 

https://github.com/choinamki/send_use_smtp_google/tree/master


사용하실 경우 구글 SMTP 사용 허용과 보안 수준이 낮은 앱 사용 허용 옵션을 체크해야 합니다.


from socket import *
import ssl
import base64
#컴퓨터 공학과 201421282 최남기 2018년 5월 17일
#참고 홈페이지
#https://github.com/seanwatson/school-work/blob/master/ece4436a-assignments/asn1/SMTPClient.py#L73
#https://gist.github.com/msyinmei/fccd95933dae95355bde2cef8fe15f0d
#https://support.google.com/a/answer/3726730?hl=ko&ref_topic=1355150
#https://terms.naver.com/entry.nhn?docId=2272016&cid=51207&categoryId=51207&expCategoryId=51207
#https://support.google.com/mail/answer/7126229?hl=ko&visit_id=1-636621534525936162-2166872604&rd=2
# 아이디 패스워드는 보안 문제로 삭제했습니다.

msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"

mailserver = ("smtp.gmail.com",587)
userid = '' ### 아이디 부분
password = '' ### 패스워드 부분

userid = userid.encode()
password = password.encode()

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(mailserver)

recv = clientSocket.recv(1024)
recv = recv.decode()

print(recv)
if recv[:3] != '220':
print( '220 reply not received from server.')
#send HELO
heloCommand = 'HELO uyom589\r\n'
heloCommand = heloCommand.encode()

clientSocket.send(heloCommand)
recv1 = clientSocket.recv(1024)
recv1 = recv1.decode()

print(recv1)
if recv1[:3] != '250':
print('250 reply not received from server.')
#starttls
startTlsCommand = 'STARTTLS\r\n'
startTlsCommand = startTlsCommand.encode()

clientSocket.send(startTlsCommand)
recv2 = clientSocket.recv(1024)
recv2 = recv2.decode()
print(recv2)
if recv2[:3] != '220':
print('220 reply not received from server')


#ssl socket
wrapsocket = ssl.wrap_socket(clientSocket)


#login
authCommand = 'AUTH LOGIN\r\n'
authCommand = authCommand.encode()
wrapsocket.send(authCommand)
recv3 = wrapsocket.recv(1024)
recv3 = recv3.decode()
print(recv3)
if recv3[:3] != '334':
print('334 reply not received from server')


#id
uid = base64.b64encode(userid)
wrapsocket.send(uid)
wrapsocket.send('\r\n'.encode())
recv4 = wrapsocket.recv(1024)
recv4 = recv4.decode()
print(recv4)
if recv4[:3] != '334':
print('334 reply not received from server')


#password
upassword = base64.b64encode(password)
wrapsocket.send(upassword)
wrapsocket.send('\r\n'.encode())
recv5 = wrapsocket.recv(1024)
recv5 = recv5.decode()
if recv5[:3] != '235':
print('235 reply not received from server')

#Send mailfrom
mailfrom = 'MAIL FROM:<uyom589@gmail.com>\r\n'
wrapsocket.send(mailfrom.encode())
recv6 = wrapsocket.recv(1024)
recv6 = recv6.decode()
print(recv6)
if recv6[:3] != '250':
print('250 reply not received from server.')

#Send rcpt
rcpt = 'RCPT TO:<uyom589@naver.com>\r\n'
wrapsocket.send(rcpt.encode())
recv7 = wrapsocket.recv(1024)
recv7 = recv7.decode()
print(recv7)
if recv7[:3] != '250':
print('250 reply not received from server')

#send data
data = 'DATA\r\n'
wrapsocket.send(data.encode())
recv8 = wrapsocket.recv(1024)
recv8 = recv8.decode()
print(recv8)
if recv8[:3] != '354':
print('354 reply not received from server.')

#send message
wrapsocket.send(msg.encode())

#message end
wrapsocket.send(endmsg.encode())
recv10 = wrapsocket.recv(1024)
recv10 = recv10.decode()

print(recv10)
if recv10[:3] != '250':
print('250 reply not received from sever.')

#send quit
quitmessage = 'QUIT\r\n'
wrapsocket.send(quitmessage.encode())
recv11 = wrapsocket.recv(1024)
recv11 = recv11.decode()
print(recv11)
if recv11[:3] != '221':
print('221 reply not received from server.')

clientSocket.close()






결과 사진입니다.





Posted by richcherry
공부2019. 1. 15. 15:56

3학년 2학기 인간-컴퓨터 상호작용 기말과제 텐서플로우로 만든 xor 네트워크 학습입니다.


해당 코드입니다.






Posted by richcherry
공부2019. 1. 15. 15:15

해당 과제물 주소입니다. https://github.com/choinamki/final_exam


ipc 를 이용하여 과제물을 만드는게 주제입니다.


C를 이용하여 경마 게임을 구현했습니다.



Posted by richcherry
공부2019. 1. 15. 15:07

파이썬을 통해 웹페이지 텍스트 정보를 가져와 봅니다.



요번에 특정 사이트의 게시글 링크를 수집해서 결과적으로 게시글의 내용을 모으기 위해서 시작했습니다.


처음으로 가져오고 싶은 웹페이지의 구조를 알아야 합니다.

보통의 홈페이지는 구조적으로 되어있기 때문에 원하는 주소의 규칙을 발견한 뒤 원하는 부분을 가져오면 됩니다.


예를 들어서 제 블로그 홈페이지는 https://namki-learning.tistory.com/ + 숫자  형식으로 되어있습니다.

이런식으로 되어있을 경우 반복문을 통해서 숫자를 증가시키면서 url 을 오픈하고

오류가 날경우 try 문을 통해서 끝낸다고 하면 제 블로그의 모든 게시글을 수집할 수 있습니다.


지금부터 설명하는 것은 원하는 부분을 어떻게 가져오는지와 원하는 부분이 보이지 않아 직접 손으로 긁은 방법을 소개해드리겠습니다.


저는 웹브라우저로 크롬을 사용하기 때문에 크롬에 맞춰서 설명하겠습니다.


1. 먼저 크롬 우측 상단에 도구를 들어가 도구더보기 -> 개발자 도구 를 클릭합니다.



2. 개발자 도구를 통해서 해당하는 웹페이지의 소스를 볼 수 있습니다. 여기서 우리는 해당 아이콘을 클릭한 뒤 가져오고 싶은 요소를 클릭합니다.



3. 클릭을 하면 우리가 가져오고 싶은 부분을 알 수 있습니다. 해당 지점을 카피합니다. 

-스크린샷을 잘못 찍었습니다. copy selector 을 통해 해당하는 부분을 복사할 수 있습니다.


#content > div > div.column-9.first-column.column-suffix-1 > div > div.petition-panels > div > div > div.content > div > div > ol > li:nth-child(1) > div > div.content > h3 > a


윗 글과 같은 식으로 복사되게 됩니다.




4. 소스코드를 통해 해당하는 웹페이지를 가져온 뒤 우리가 원하는 부분을 찾아서 가져오면 됩니다.



처음에는 단순하게 웹페이지를 가져올려고 했으나 403 오류가 발생했습니다. 찾아보니 비정상적으로 접근한 사용자를 보안 문제로 차단한다고 합니다. 따라서 이것을 피하기 위해서는 웹페이지 서버에 요청할 때 헤더 정보를 같이 보내줘야 합니다. 윗 코드는 헤더정보를 보내준 뒤 얻은 html 파일을 utf-8 형식으로 출력합니다. 



5. 저렇게 가져온 텍스트를 

BeautifulSoup("#우리가 가져온 텍스트", 'html.parser') 

을 통해 html 형식으로 예쁘게 만들어준 뒤

 soup.select('복사한 값') 

를 통해 우리가 복사한 위치를 값으로 넣어주고 원하는 텍스트를 가져오면 됩니다.


6. 가끔 우리가 원하는 부분이 본인이 가져온 텍스트에 없는 경우가 있습니다. 저도 요번에 이런 경우를 만나서 인력

을 통해 데이터를 수집했습니다.


-3번까지 같은 순서로 본인이 원하는 부분을 복사합니다.


7. 서브라임 텍스트(sublime text) 를 통해 원하는 부분의 글을 복사합니다.


저는 텍스트 편집기로 서브라임을 주로 사용합니다.


해당 프로그램을 통해 원하는 부분의 html 텍스트를 붙여넣은 뒤 ctrl + f 를 통해 해당하는 부분을 찾았으며,

find all 을 통해 해당 부분 전부에 커서를 올린 뒤 ctrl + L 을 통해 해당 라인을 블록지정하고서 추출했습니다. 


빈 라인은 ctrl + f 를 한 뒤 ^\n 을 검색해서 지웠습니다.




-빈 라인은 ctrl + f 를 한 뒤 ^\n 을 검색해서 지웠습니다.




- .* 단추를 클릭한 뒤 ^\n 을 검색하면 빈 라인을 찾을 수 있습니다.


제가 원하는 것은 링크 텍스트였기 때문에 링크가 시작하기 전 텍스트들은 검색을 통해 지웠습니다.



8. 그렇게 만든 텍스트를 보고서 두번 째 "을 만나기 전까지의 텍스트가 제가 원하는 링크 텍스트라는것을 확인한 뒤 파이썬 코드를 통해서 원하는 텍스트를 추출했습니다.



7번까지 처리한 텍스트를 한글이 깨지지 않도록 utf-8 형식으로 가져왔습니다.

엔터키 구분으로 리스트에 순서대로 넣어주기 위해서 readlines() 를 사용했습니다.

그렇게 한 줄씩 가져와서 첫번재 따옴표는 피하기 위해서 0번째가 아니라 1번째 인덱스부터 가져오며 글자 하나하나를 temp 에다 붙여서 문자열로 만들어 주고, 

큰 따옴표를 만나게 되면 반복문을 탈출하여 해당 문자열 temp 를 저장하고 초기화시켜주는 코드입니다.



완성되어 텍스트 형식으로 저장된 제가 원하는 홈페이지의 게시글 링크입니다.


저렇게 모든 게시글의 링크를 구한 뒤 모든 링크를 리스트로 넣어서 + 연산자를 통해서 하나의 리스트로 만들어주었습니다.

그리고 set() 함수를 이용하여 중복을 제거했습니다.


이렇게 해서 해당 홈페이지의 전체 게시글의 링크를 수집할 수 있었습니다.




Posted by richcherry