# 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/resources/login.html"))
# 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_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36\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)