You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
12306/myUrllib/MySocketUtils.py

202 lines
8.3 KiB

# coding=utf-8
import json
import socket
import re
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.connect(('183.232.189.31', 80))
# get_str = 'GET {0} HTTP/1.1\r\nConnection: close\r\n' \
# 'Host: %s\r\n' \
# 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36' \
# '\r\nAccept: */*\r\n' \
# '\r\n'
# post_str = "POST {0} HTTP/1.1\r\n" \
# "Host: kyfw.12306.cn\r\n" \
# "Connection: close\r\n"\
# "Origin: https://kyfw.12306.cn\r\n" \
# "X-Requested-With: XMLHttpRequest\r\n" \
# "Referer: https://kyfw.12306.cn/otn/leftTicket/init\r\n" \
# "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n" \
# "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" \
# "Accept: application/json, text/javascript, */*; q=0.01\r\n" \
# "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5\r\n" \
# "Content-Length: 9\r\n"\
# "Cookie: _passport_session=a459aba69761497eb31de76c27795e999613; _passport_ct=9116b2cb0bf443e1a01d22ac8c1ae449t5007; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerpool_passport=200081930.50215.0000; BIGipServerotn=484704778.64545.0000\r\n\n"\
# "appid=otn\r\n"
# # s.sendall(get_str.format("https://kyfw.12306.cn/otn/login/init"))
# s.sendall(post_str.format("https://kyfw.12306.cn/passport/web/auth/uamtk"))
from config.urlConf import urls
def default_get_data():
"""
get请求默认组装字符串
需要拼接的字符串
-- url 发送请求的全连接
:return:
"""
return 'GET {0} HTTP/1.1\r\nConnection: close\r\n' \
'Host: kyfw.12306.cn\r\n' \
"Referer: {1}\r\n" \
'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36' \
'\r\nAccept: */*\r\n' \
"Cookie: {2}\r\n\n"\
'\r\n'
# return 'GET {0} HTTP/1.1\r\nConnection: close\r\n' \
# 'Host: kyfw.12306.cn\r\n' \
# 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36' \
# '\r\nAccept: */*\r\n' \
# '\r\n'
def default_post_data():
"""
post请求默认组装字符串
需要拼接的字符串
-- url 发送请求的全连接
-- Referer 请求页面来源
-- Content-Length: body 长度
-- Cookie 页面请求的身份认证
-- appid 接口请求报文
:return:
"""
return "POST https://kyfw.12306.cn{0} HTTP/1.1\r\n" \
"Host: kyfw.12306.cn\r\n" \
"Connection: close\r\n"\
"Origin: https://kyfw.12306.cn\r\n" \
"X-Requested-With: XMLHttpRequest\r\n" \
"Referer: {3}\r\n" \
"Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n" \
"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" \
"Accept: application/json, text/javascript, */*; q=0.01\r\n" \
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5\r\n" \
"Content-Length: {2}\r\n"\
"Cookie: {4}\r\n\n"\
"{1}\r\n"\
# "\r\n"
class socketUtils:
def __init__(self, host, port=80):
self.host = host
self.port = port
self.s = self.connect_socket(self.host, self.port)
def connect_socket(self, host, port):
"""
连接socket
:param host:
:param port:
:return:
"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host if isinstance(host, str) else str(host),
port if isinstance(port, int) else int(port)))
return s
def close_s(self):
self.s.close()
# def send(self, urls, Cookie=None, data=None):
# """
# 发送请求
# :param urls:
# :param data:
# :param cookie:
# :return:
# """
# url = urls.get("req_url", "")
# Referer = urls.get("Referer", "")
# if urls.get("req_type", "get") == "post":
# Content_Length = len(data)
# Cookie = "tk=pnidlCoFy2B7wxO_X_pESbrkZFSq3OtVA_xzXwuba2a0; JSESSIONID=C6144324BFCE36AC5082E543E934E8B3; current_captcha_type=Z; _jc_save_fromDate=2018-08-03; _jc_save_fromStation=%u6DF1%u5733%2CSZQ; _jc_save_toDate=2018-08-03; _jc_save_toStation=%u957F%u6C99%2CCSQ; _jc_save_wfdc_flag=dc; ten_key=b5L6aMWfnzBm8CgQe8pcAKQsmVBS2PYH; BIGipServerpool_passport=166527498.50215.0000; BIGipServerotn=165937674.50210.0000; route=c5c62a339e7744272a54643b3be5bf64; RAIL_DEVICEID=fC-yepiUqNjsBiRvtLBXW4JqQmabCfB9QxI3FifJZK9YDRsImhJLSz4sAQ4HiGF7uQAFdFyISg6jA7KAhtpEldJV9ZMNsn6Dzm_psA5CBDwSNfiORf42w-LIRvkeGvdKFtegZwWGlkA2fVuEWKu-1xAYdCXRnsMD; RAIL_EXPIRATION=1533420302032; _jc_save_detail=true"
# if data:
# send_value = default_post_data().format(url,
# data,
# Content_Length,
# Referer,
# Cookie
# )
# print("send_value: " + send_value)
# self.s.sendall(send_value)
# else:
# self.s.sendall(default_get_data().format(url,
# Referer,
# Cookie))
# total_data = ""
# while 1:
# data = self.s.recv(1024)
# total_data += data
# if not data:
# break
# self.close_s()
# print(total_data)
# return self.recv_data(total_data)
def recv_data(self, r_data):
cookie = self.get_cookie(r_data)
status_code = self.get_status_code(r_data)
r_body = self.get_rep_body(r_data)
return {
"cookie": cookie,
"status_code": status_code,
"r_body": r_body
}
@staticmethod
def get_cookie(recv_data):
"""
提取cookie
:param recv_data:
:return:
"""
if not isinstance(recv_data, str):
recv_data = str(recv_data)
cookies_re = re.compile(r"Set-Cookie: (\S+);")
cookies = re.findall(cookies_re, recv_data)
return "; ".join(cookies)
@staticmethod
def get_status_code(recv_data):
"""
获取状态码
:return:
"""
if not isinstance(recv_data, str):
recv_data = str(recv_data)
http_code_re = re.compile(r"HTTP/1.1 (\S+) ")
status_code = re.search(http_code_re, recv_data).group(1)
return status_code
@staticmethod
def get_rep_body(recv_data):
"""
获取返回值
:param recv_data:
:return:
"""
if not isinstance(recv_data, str):
recv_data = str(recv_data)
if recv_data.find("{") != -1 and recv_data.find("}") != -1:
data = json.loads(recv_data.split("\n")[-1])
return data
else:
print(recv_data)
if __name__ == "__main__":
so = socketUtils('183.232.189.31', 80)
train_date = "2018-08-03"
from_station = "SZQ"
to_station = "CSQ"
urls["select_url"]["req_url"] = "https://kyfw.12306.cn" + urls["select_url"]["req_url"].format(train_date, from_station, to_station)
result = so.send(urls=urls["select_url"])
print(result)
so = socketUtils('183.232.189.31', 80)
data = "secretStr=Vgo534nDZiCH8NCvyEPcGepzJoRCjvYr34gKFv5CW1K1XtM6mtKHoiFPjUYvaVKoe06SMhUUpT%2FK%0AxIEIsBD4zHgJPpVyKiTPx80y6OCWhNgcKjib2LLMXMJfgTgh0RKPISjkDjVFmO9p905O%2FegDeKjp%0A1fhIeqCuYraHjNhI0PjQY39BAY4AHLzW0iGgDq8b%2FtpyOY8Td2XfIWNZJCWzgyPkNXOk0HUguB2G%0AKh2T8nlko6zb5ra%2B%2BA%3D%3D&train_date=2018-08-03&back_train_date=2018-08-03&tour_flag=dc&purpose_codes=ADULT&query_from_station_name=深圳&query_to_station_name=长沙&undefined"
result1 = so.send(urls=urls["submit_station_url"], data=data)
print(result1)
# so = socketUtils('183.232.189.31', 80)
# result = so.send(url="https://kyfw.12306.cn/passport/web/login", s_data="")
# print(result)