파이썬으로 IP 확인하는거 만들거임

Lee_Minhyeung·2022년 10월 21일
0

40python

목록 보기
1/1
post-thumbnail

장문철씨가 만든 '만들면서 배우는 파이썬과 40개의 작품들'이라는 책이 있더라.
파이썬으로 소켓 통신하는 방법을 찾다가 알아낸 책인데, 학부 1학년따리인 내가 읽으면 이빠이 좋을거 같아서 도서관에 갔다. 책이 없어서 도서관에 주문했고, 오늘부터 읽으려고 한다.

이 책은 총 7개의 챕터로 이루어져있다. 그 중 챕터 1과 2는 환경설정과 파이썬 기본 문법에 관한 내용이므로 읽지 않았다.

챕터3에는 '숫자 맞추기 게임 만들기'와 '컴퓨터의 외부 및 내부 IP 확인하기', '텍스트를 음성으로 변환하기', 'QR코드 생성기', '컴퓨터의 정보 확인', '압축파일 암호 푸는 프로그램', '환율 변환기', '쓰레드를 사용한 프로그램'이 나온다.

이 중 '숫자 맞추기 게임 만들기'는 노잼이므로 패스하도록 하고 재밌어 보이는 '컴퓨터의 외부 및 내부 IP 확인하기'를 이번에 해보도록 하겠다.

책에 나와있는 코드를 적을건데, 라이센스가 어떻게 되어있는지 모르겠다. 그리고 코드 설명이 부족해서 내가 좀 추가할 예정이다.

아이엠 ... 지금부터 시작!!

나는 소켓

  • network socket : 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점.

그렇다고 한다.

코드를 살펴보자.

import socket

in_addr = socket.gethostbyname(socket.gethostname())

print(in_addr)
gethostbyname - 컴퓨터의 이름이나 도메인이름을 사용하여 ip를 가져옴
gethostname - 로컬호스트의 이름을 리턴함
in_addr은 gethostname으로 로컬호스트의 이름을 리턴해와서 
gethostbyname에 넣어줌. 그러면 ip 뱉음

알간? 오르간 깔깔\

위의 코드의 결과가 맞는지 알아보기 위해 cmd를 키고
inconfig
를 입력해서 내 pc의 IPv4 주소를 알아보자

일단 나는 똑같이 나온다.

만약 다르게 나온다면 그건 가상 환경 등을 사용하여 여러 개의 환경이 있을 경우 다른 환경의 IP가 출력될 수 있다.

이걸로 나중에 해킹해라

책에 재밌는게 있어서 가져와봤다.
socket으로 외부 사이트에 접속하고 접속된 정보를 바탕으로 ip를 확인하는 방법이다.

import socket

in_addr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
in_addr.connect(("www.google.co.kr",443))

print(in_addr.getsockname()[0])

대충 위에서 말한거랑 코드랑 보면 알겠지만, 구그리한테 접속하면 뭐 정보가 나와서 그걸로 내 ip를 알아내는 방법이다.

새로운 것들이 나왔다.

  • AF_INET - IP4v 방식으로 소통한다고 말함
  • AF_INET6 - IP6v 방식으로 소통한다고 말함

두개가 뭐가 다른지 모르겠는데 굳이 알 필요도 없을거 같다. 그냥 둘이 소통하는 방식이 다르다는 것만 알고 넘어가자.

  • SOCK_STREAM - 스트림소켓 타입 쓸거라고 말함
  • SOCK_DGRAM - 데이터그램 소켓 쓸거라고 말함

두개가 뭐가 다른지 모르겠는데 굳이 알 필요도 없을거 같다. 그냥 둘이 소통하는 방식이 다르다는 것만 알고 넘어가자.(1)

찾아보니까 AF_INET이랑 SOCK_STREAM 조합이 socket_socket()의 인자 중에서 family와 type에 대한 기본 인자값이라고 한다. 즉, AF_INET이랑 SOCK_STREAM 쓸거면 socket_socket()만 써도 된다는거임.

코드를 보면

in_addr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-> in_addr = socket.socket()

으로 바꿔도 된다는거다.

어쨋튼, in_addr이라는 소켓을 생성했다.

그리고 이 소켓으로 구글에 접속해보자.
connect() 함수를 쓴데더라.

in_addr.connect(("www.google.co.kr", 443"))

뒤에 붙은 443은 포트 번호라고한다.
그냥 내 데이터를 구그리의 ㅈㄴ 많은 우편함중에 443번 우편함에 꽂아달라는 거다.

print(in_addr.getsockname()[0])

getsockname()함수는 소켓 자신의 주소를 반환한다고 한다.

나는 소켓 자신의 주소를 반환하는데 왜 굳이 외부 사이트에 접속을 해야되는지 이해가 되지 않았다.

지금 추측하는것은, 소켓을 생성한것은, in_addr 소켓의 형식을 만들어 준 것이지, 내용물은 만들어주지 않았다고 생각된다.
그래서 외부 사이트에 접속함으로써 비로소 내 컴퓨터의 ip를 소켓에 담아 구그리한테 간것이고, 이것을 통해 in_addr 소켓이 어떤 ip를 담고 있는지 알고 있는것이라고 나는 생각한다. 틀렸다면 댓글로 알려주라.

맞다. 뒤에 붙은 [0]은 getsockname()을 하면 (ip, port) 이런식으로 나와서 ip만 뽑고 싶으면 [0]을 붙여줘야한다. 포트를 뽑고 싶으면 [1]을 하고

지금까지는 내부 ip를 알아봤다.

근데 내 컴퓨터 ip를 알면 뭐하겠나. 다른 컴퓨터의 ip를 알아보자

import socket

host = 'www.youtube.com'
youtubeip = socket.gethostbyname(host)

print(youtubeip)

유튜브의 ip를 알아보자.
위에서 gethostbyname의 인자로 도메인을 넣을 수 있다고 했다.
그래서 유튜브 주소를 넣으면
유튜브 ip를 뱉어준다.

ip주소는 고정아이피가 아닌 경우 바뀔수 있는데
일단 나는 142.250.206.238라는 주소가 나왔다.

책에서는 내 컴퓨터의 외부 ip를 알아내는 방법이 나왔는데 방법은 다음과 같다.

import requests
import re

req = requests.get("http://ipconfig.kr")
out_addr = re.search(r"IP Address : (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", req.text)[1]

print(out_addr)

requests는 패키지를 따로 설치해야한다.

requests.get(url)

을 통해서 해당 url 주소의 http 요청을 보내면 html 코드를 보내준다.

re 패키지는 파이썬에서 정규표현 처리를 하기 위한 표준 라이브러리이다. 정규표현 패턴을 이용한 문자열의 추출이나, 치환, 분활 등이 가능하다고 한다.

re.search(r'search content', requests.get(url))[1]

re.search는 선두에 한해서 매치하는지를 체크하고 추출한다.

re.search(패턴, 찾을거, 옵션)으로 이루어져 있다.

찾을거 앞에 r이 붙어있는데, 이건 파이썬 정규식에서 Raw string이라고 부르는거다. 컴파일 해야 하는 정규식이 순수한 문자임을 알려주는 문법이라고한다. 즉 r을 붙이고 문자열 안에서 백슬래쉬를 쓰면 얘를 문자로 인식하는, 백슬래쉬를 2개 쓴거 같은 효과를 보여준다.

하 ㅅㅂ 지친다. 이제부터 그냥 대~충 설명하겠다.
코드에서 보면은, 문자열을 requests한거에서 찾겠다는거다.

즉, requests한 html 코드에서 문자열을 찾겠다는거고 그게 ip란다.

아 ㅅㅂ 졸려.

오늘은 일단 책에 나와있는 ip 따는 방법에 대해 알아보았다.

다음에는 TTS를 만들어보도록 하겠다.

profile
https:/ssib/al/pyre

0개의 댓글