Python

[Python] subprocess, curl 활용하여 티켓 풀리면 알려주기

수노 SUNHO 2017. 10. 12. 15:37

배타고 여행을 가려하는데 티켓이 언제풀릴지 몰라서 자리가 풀리면 이메일로 알려주는 코드를 짰다.

만들생각 없었는데 같이 가는 사람들이 해달라그래서 했다.


결론은 못썼다.

전화로 선박 회사에 물어보니 날짜와 시간을 알려주었 + 잘못짜서 이메일이 제대로 오지도 않았다.


그래도 이거 짜면서 새로 알게된 것이 있다. 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
)