배타고 여행을 가려하는데 티켓이 언제풀릴지 몰라서 자리가 풀리면 이메일로 알려주는 코드를 짰다.
만들생각 없었는데 같이 가는 사람들이 해달라그래서 했다.
결론은 못썼다.
전화로 선박 회사에 물어보니 날짜와 시간을 알려주었 + 잘못짜서 이메일이 제대로 오지도 않았다.
그래도 이거 짜면서 새로 알게된 것이 있다. subprocess, curl 이다.
subprocess는 Linux에 입력한 명령어의 결과를 파이썬으로 읽어들일 수 있도록 해준다.
curl은 웹브라우저를 열어서 실행시켜준다.
내 코드
import subprocess
from subprocess import PIPE
from bs4 import BeautifulSoup as BS
import urllib.parse
f = subprocess.Popen("curl -s -k -X GET https://url.you.want", shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, error = f.communicate()
html = BS(output, 'html.parser')
# 내가 얻고싶은 요소
viewstate = html.find('input', attrs={'id': '__VIEWSTATE'})
eventvalidation = html.find('input', attrs={'id': '__EVENTVALIDATION'})
def send_mail(mail_to, subject, message, mail_from='sunny@ciceron.me'):
# 주어진 messasge를 메일로 날려준다.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
content = MIMEText(message, 'html', _charset='utf-8')
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = '<%s>' % mail_from
msg['To'] = str(mail_to)
msg.attach(content)
a = smtplib.SMTP('smtp.gmail.com:587')
a.ehlo()
a.starttls()
a.login('abc@email.com', 'password')
a.sendmail('abc@email.com', str(mail_to), msg.as_string())
a.quit()
def check_ticket(month, date):
# 검색 조건
data = {
'F_Port': 10110,
'T_Port': 96380,
'f_year': 2017,
'f_month': month,
'f_day': date,
'btnSearch.x': 72,
'btnSearch.y': 1,
'Header1$CheckLoc_Row': 2,
'Header1$CheckLoc_Row2': 4,
'Side_new1$CheckLoc_Row': 4,
'__EVENTVALIDATION': eventvalidation['value'],
'__VIEWSTATE': viewstate['value'],
'__EVENTTARGET': None,
'__EVENTARGUMENT': None
}
query_string = urllib.parse.urlencode(data)
url = 'https://url.you.want'
f = subprocess.Popen("curl -s -k -d '"+query_string+"' -X POST "+url, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, error = f.communicate()
html = BS(output, 'html.parser')
pnlFareDetail = html.find('div', attrs={'id': 'pnlFareDetail'})
text = pnlFareDetail.get_text()
text = text.split()
# 내가 원했던 이메일 보내는 조건
if text[8] != '0' or text[17] != '0':
mail_content = """
{} 월 {} 일 자리났습니다!
""".format(month, date)
send_mail(
'abcde@email.com',
'예매하세요!!!',
mail_content
)
'Python' 카테고리의 다른 글
[Python] Query String을 Dictionary로 바꾸기 (0) | 2017.10.12 |
---|---|
[Python] Dictionary를 key/value 기준으로 정렬하기 (0) | 2017.10.12 |
[Python] 패키지 모음 만들기, freeze (0) | 2017.08.08 |
[Python] Python 기본 설정, virtualenv (0) | 2017.08.08 |
[Python] 크롤링(Crawling) with ulrlib&BeautifulSoup (0) | 2017.08.08 |