Python分享之requests(2)

5)定制头和cookie信息

header = {'user-agent': 'my-app/0.0.1''}

cookie = {'key':'value'}

r = requests.get/post('your url',headers=header,cookies=cookie)

data = {'some': 'data'}

headers = {'content-type': 'application/json',

          'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}

r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)

print(r.text)

6)响应状态码

使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……

获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

r = requests.get('http://www.itwhy.org')

print(r.text, '\n{}\n'.format('*'*79), r.encoding)

r.encoding = 'GBK'

print(r.text, '\n{}\n'.format('*'*79), r.encoding)

示例代码:

import requests

r = requests.get('https://github.com/Ranxf')      # 最基本的不带参数的get请求

print(r.status_code)                              # 获取返回状态

r1 = requests.get(url='http://dict.baidu.com/s', params={'wd': 'python'})      # 带参数的get请求

print(r1.url)

print(r1.text)        # 打印解码后的返回数据

运行结果

/usr/bin/python3.5 /home/rxf/python3_1000/1000/python3_server/python3_requests/demo1.py

200

http://dict.baidu.com/s?wd=python

…………

Process finished with exit code 0

r.status_code                      #如果不是200,可以使用 r.raise_for_status() 抛出异常

7)响应

r.headers #返回字典类型,头信息

r.requests.headers                        #返回发送到服务器的头信息

r.cookies                                  #返回cookie

r.history                                  #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向

8)超时

r = requests.get('url',timeout=1) #设置秒数超时,仅对于连接有效

9)会话对象,能够跨请求保持某些参数

s = requests.Session()

s.auth = ('auth','passwd')

s.headers = {'key':'value'}

r = s.get('url')

r1 = s.get('url1')

10)代理

proxies = {'http':'ip1','https':'ip2' }

requests.get('url',proxies=proxies)

汇总:

# HTTP请求类型

# get类型

r = requests.get('https://github.com/timeline.json')

# post类型

r = requests.post("http://m.ctrip.com/post")

# put类型

r = requests.put("http://m.ctrip.com/put")

# delete类型

r = requests.delete("http://m.ctrip.com/delete")

# head类型

r = requests.head("http://m.ctrip.com/head")

# options类型

r = requests.options("http://m.ctrip.com/get")

# 获取响应内容

print(r.content) #以字节的方式去显示,中文显示为字符

print(r.text) #以文本的方式去显示

#URL传递参数

payload = {'keyword': '香港', 'salecityid': '2'}

r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)

print(r.url) #示例为http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=香港

#获取/修改网页编码

r = requests.get('https://github.com/timeline.json')

print (r.encoding)

#json处理

r = requests.get('https://github.com/timeline.json')

print(r.json()) # 需要先import json   

# 定制请求头

url = 'http://m.ctrip.com'

headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}

r = requests.post(url, headers=headers)

print (r.request.headers)

#复杂post请求

url = 'http://m.ctrip.com'

payload = {'some': 'data'}

r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下

# post多部分编码文件

url = 'http://m.ctrip.com'

files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)

# 响应状态码

r = requests.get('http://m.ctrip.com')

print(r.status_code)


# 响应头

r = requests.get('http://m.ctrip.com')

print (r.headers)

print (r.headers['Content-Type'])

print (r.headers.get('content-type')) #访问响应头部分内容的两种方式


# Cookies

url = 'http://example.com/some/cookie/setting/url'

r = requests.get(url)

r.cookies['example_cookie_name']    #读取cookies


url = 'http://m.ctrip.com/cookies'

cookies = dict(cookies_are='working')

r = requests.get(url, cookies=cookies) #发送cookies

#设置超时时间

r = requests.get('http://m.ctrip.com', timeout=0.001)

#设置访问代理

proxies = {

          "http": "http://10.10.1.10:3128",

          "https": "http://10.10.1.100:4444",

          }

r = requests.get('http://m.ctrip.com', proxies=proxies)

#如果代理需要用户名和密码,则需要这样:

proxies = {

    "http": "http://user:pass@10.10.1.10:3128/",

}

# HTTP请求类型

# get类型

r = requests.get('https://github.com/timeline.json')

# post类型

r = requests.post("http://m.ctrip.com/post")

# put类型

r = requests.put("http://m.ctrip.com/put")

# delete类型

r = requests.delete("http://m.ctrip.com/delete")

# head类型

r = requests.head("http://m.ctrip.com/head")

# options类型

r = requests.options("http://m.ctrip.com/get")

# 获取响应内容

print(r.content) #以字节的方式去显示,中文显示为字符

print(r.text) #以文本的方式去显示

#URL传递参数

payload = {'keyword': '香港', 'salecityid': '2'}

r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)

print(r.url) #示例为http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=香港

#获取/修改网页编码

r = requests.get('https://github.com/timeline.json')

print (r.encoding)

#json处理

r = requests.get('https://github.com/timeline.json')

print(r.json()) # 需要先import json   

# 定制请求头

url = 'http://m.ctrip.com'

headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}

r = requests.post(url, headers=headers)

print (r.request.headers)

#复杂post请求

url = 'http://m.ctrip.com'

payload = {'some': 'data'}

r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下

# post多部分编码文件

url = 'http://m.ctrip.com'

files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)

# 响应状态码

r = requests.get('http://m.ctrip.com')

print(r.status_code)


# 响应头

r = requests.get('http://m.ctrip.com')

print (r.headers)

print (r.headers['Content-Type'])

print (r.headers.get('content-type')) #访问响应头部分内容的两种方式


# Cookies

url = 'http://example.com/some/cookie/setting/url'

r = requests.get(url)

r.cookies['example_cookie_name']    #读取cookies


url = 'http://m.ctrip.com/cookies'

cookies = dict(cookies_are='working')

r = requests.get(url, cookies=cookies) #发送cookies

#设置超时时间

r = requests.get('http://m.ctrip.com', timeout=0.001)

#设置访问代理

proxies = {

          "http": "http://10.10.1.10:3128",

          "https": "http://10.10.1.100:4444",

          }

r = requests.get('http://m.ctrip.com', proxies=proxies)

#如果代理需要用户名和密码,则需要这样:

proxies = {

    "http": "http://user:pass@10.10.1.10:3128/",

}

3、示例代码

GET请求

# 1、无参数实例


import requests

ret = requests.get('https://github.com/timeline.json')


print(ret.url)

print(ret.text)




# 2、有参数实例


import requests


payload = {'key1': 'value1', 'key2': 'value2'}

ret = requests.get("http://httpbin.org/get", params=payload)


print(ret.url)

print(ret.text)

POST请求

# 1、基本POST实例


import requests


payload = {'key1': 'value1', 'key2': 'value2'}

ret = requests.post("http://httpbin.org/post", data=payload)


print(ret.text)



# 2、发送请求头和数据实例


import requests

import json


url = 'https://api.github.com/some/endpoint'

payload = {'some': 'data'}

headers = {'content-type': 'application/json'}


ret = requests.post(url, data=json.dumps(payload), headers=headers)


print(ret.text)

print(ret.cookies)

请求参数

def request(method, url, **kwargs):

    """Constructs and sends a :class:`Request <Request>`.

    :param method: method for the new :class:`Request` object.

    :param url: URL for the new :class:`Request` object.

    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.

    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.

    :param json: (optional) json data to send in the body of the :class:`Request`.

    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.

    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.

    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.

        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``

        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string

        defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers

        to add for the file.

    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.

    :param timeout: (optional) How long to wait for the server to send data

        before giving up, as a float, or a :ref:`(connect timeout, read

        timeout) <timeouts>` tuple.

    :type timeout: float or tuple

    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.

    :type allow_redirects: bool

    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.

    :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``.

    :param stream: (optional) if ``False``, the response content will be immediately downloaded.

    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.

    :return: :class:`Response <Response>` object

    :rtype: requests.Response

    Usage::

      >>> import requests

      >>> req = requests.request('GET', 'http://httpbin.org/get')

      <Response [200]>

    """

def param_method_url():

    # requests.request(method='get', url='http://127.0.0.1:8000/test/')

    # requests.request(method='post', url='http://127.0.0.1:8000/test/')

    pass

def param_param():

    # - 可以是字典

    # - 可以是字符串

    # - 可以是字节(ascii编码以内)

    # requests.request(method='get',

    # url='http://127.0.0.1:8000/test/',

    # params={'k1': 'v1', 'k2': '水电费'})

    # requests.request(method='get',

    # url='http://127.0.0.1:8000/test/',

    # params="k1=v1&k2=水电费&k3=v3&k3=vv3")

    # requests.request(method='get',

    # url='http://127.0.0.1:8000/test/',

    # params=bytes("k1=v1&k2=k2&k3=v3&k3=vv3", encoding='utf8'))

    # 错误

    # requests.request(method='get',

    # url='http://127.0.0.1:8000/test/',

    # params=bytes("k1=v1&k2=水电费&k3=v3&k3=vv3", encoding='utf8'))

    pass

def param_data():

    # 可以是字典

    # 可以是字符串

    # 可以是字节

    # 可以是文件对象

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # data={'k1': 'v1', 'k2': '水电费'})

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # data="k1=v1; k2=v2; k3=v3; k3=v4"

    # )

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # data="k1=v1;k2=v2;k3=v3;k3=v4",

    # headers={'Content-Type': 'application/x-www-form-urlencoded'}

    # )

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # data=open('data_file.py', mode='r', encoding='utf-8'), # 文件内容是:k1=v1;k2=v2;k3=v3;k3=v4

    # headers={'Content-Type': 'application/x-www-form-urlencoded'}

    # )

    pass

def param_json():

    # 将json中对应的数据进行序列化成一个字符串,json.dumps(...)

    # 然后发送到服务器端的body中,并且Content-Type是 {'Content-Type': 'application/json'}

    requests.request(method='POST',

                    url='http://127.0.0.1:8000/test/',

                    json={'k1': 'v1', 'k2': '水电费'})

def param_headers():

    # 发送请求头到服务器端

    requests.request(method='POST',

                    url='http://127.0.0.1:8000/test/',

                    json={'k1': 'v1', 'k2': '水电费'},

                    headers={'Content-Type': 'application/x-www-form-urlencoded'}

                    )

def param_cookies():

    # 发送Cookie到服务器端

    requests.request(method='POST',

                    url='http://127.0.0.1:8000/test/',

                    data={'k1': 'v1', 'k2': 'v2'},

                    cookies={'cook1': 'value1'},

                    )

    # 也可以使用CookieJar(字典形式就是在此基础上封装)

    from http.cookiejar import CookieJar

    from http.cookiejar import Cookie

    obj = CookieJar()

    obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None,

                          discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False,

                          port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False)

                  )

    requests.request(method='POST',

                    url='http://127.0.0.1:8000/test/',

                    data={'k1': 'v1', 'k2': 'v2'},

                    cookies=obj)

def param_files():

    # 发送文件

    # file_dict = {

    # 'f1': open('readme', 'rb')

    # }

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # files=file_dict)

    # 发送文件,定制文件名

    # file_dict = {

    # 'f1': ('test.txt', open('readme', 'rb'))

    # }

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # files=file_dict)

    # 发送文件,定制文件名

    # file_dict = {

    # 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf")

    # }

    # requests.request(method='POST',

    # url='http://127.0.0.1:8000/test/',

    # files=file_dict)

    # 发送文件,定制文件名

    # file_dict = {

    #    'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'})

    # }

    # requests.request(method='POST',

    #                  url='http://127.0.0.1:8000/test/',

    #                  files=file_dict)

    pass

def param_auth():

    from requests.auth import HTTPBasicAuth, HTTPDigestAuth

    ret = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('wupeiqi', 'sdfasdfasdf'))

    print(ret.text)

    # ret = requests.get('http://192.168.1.1',

    # auth=HTTPBasicAuth('admin', 'admin'))

    # ret.encoding = 'gbk'

    # print(ret.text)

    # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass'))

    # print(ret)

    #

def param_timeout():

    # ret = requests.get('http://google.com/', timeout=1)

    # print(ret)

    # ret = requests.get('http://google.com/', timeout=(5, 1))

    # print(ret)

    pass

def param_allow_redirects():

    ret = requests.get('http://127.0.0.1:8000/test/', allow_redirects=False)

    print(ret.text)

def param_proxies():

    # proxies = {

    # "http": "61.172.249.96:80",

    # "https": "http://61.185.219.126:3128",

    # }

    # proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}

    # ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies)

    # print(ret.headers)

    # from requests.auth import HTTPProxyAuth

    #

    # proxyDict = {

    # 'http': '77.75.105.165',

    # 'https': '77.75.105.165'

    # }

    # auth = HTTPProxyAuth('username', 'mypassword')

    #

    # r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth)

    # print(r.text)

    pass

def param_stream():

    ret = requests.get('http://127.0.0.1:8000/test/', stream=True)

    print(ret.content)

    ret.close()

    # from contextlib import closing

    # with closing(requests.get('http://httpbin.org/get', stream=True)) as r:

    # # 在此处理响应。

    # for i in r.iter_content():

    # print(i)

def requests_session():

    import requests

    session = requests.Session()

    ### 1、首先登陆任何页面,获取cookie

    i1 = session.get(url="http://dig.chouti.com/help/service")

    ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权

    i2 = session.post(

        url="http://dig.chouti.com/login",

        data={

            'phone': "8615131255089",

            'password': "xxxxxx",

            'oneMonth': ""

        }

    )

    i3 = session.post(

        url="http://dig.chouti.com/link/vote?linksId=8589623",

    )

    print(i3.text)

json请求:

#! /usr/bin/python3

import requests

import json

class url_request():

    def __init__(self):

        ''' init '''

if __name__ == '__main__':

    heard = {'Content-Type': 'application/json'}

    payload = {'CountryName': '中国',

              'ProvinceName': '四川省',

              'L1CityName': 'chengdu',

              'L2CityName': 'yibing',

              'TownName': '',

              'Longitude': '107.33393',

              'Latitude': '33.157131',

              'Language': 'CN'}

    r = requests.post("http://www.xxxxxx.com/CityLocation/json/LBSLocateCity", heards=heard, data=payload)

    data = r.json()

    if r.status_code!=200:

        print('LBSLocateCity API Error' + str(r.status_code))

    print(data['CityEntities'][0]['CityID'])  # 打印返回json中的某个key的value

    print(data['ResponseStatus']['Ack'])

    print(json.dump(data, indent=4, sort_keys=True, ensure_ascii=False))  # 树形打印json,ensure_ascii必须设为False否则中文会显示为unicode

Xml请求:

#! /usr/bin/python3

import requests

class url_request():

    def __init__(self):

        """init"""

if __name__ == '__main__':

    heards = {'Content-type': 'text/xml'}

    XML = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Request xmlns="http://tempuri.org/"><jme><JobClassFullName>WeChatJSTicket.JobWS.Job.JobRefreshTicket,WeChatJSTicket.JobWS</JobClassFullName><Action>RUN</Action><Param>1</Param><HostIP>127.0.0.1</HostIP><JobInfo>1</JobInfo><NeedParallel>false</NeedParallel></jme></Request></soap:Body></soap:Envelope>'

    url = 'http://jobws.push.mobile.xxxxxxxx.com/RefreshWeiXInTokenJob/RefreshService.asmx'

    r = requests.post(url=url, heards=heards, data=XML)

    data = r.text

    print(data)

状态异常处理

import requests

URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API

try:

    r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)

    r.raise_for_status()  # 如果响应状态码不是 200,就主动抛出异常

except requests.RequestException as e:

    print(e)

else:

    result = r.json()

    print(type(result), result, sep='\n')

上传文件

使用request模块,也可以上传文件,文件的类型会自动进行处理:

import requests

url = 'http://127.0.0.1:8080/upload'

files = {'file': open('/home/rxf/test.jpg', 'rb')}

#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}    #显式的设置文件名

r = requests.post(url, files=files)

print(r.text)

request更加方便的是,可以把字符串当作文件进行上传:

import requests

url = 'http://127.0.0.1:8080/upload'

files = {'file': open('/home/rxf/test.jpg', 'rb')}

#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}    #显式的设置文件名

r = requests.post(url, files=files)

print(r.text)

request更加方便的是,可以把字符串当作文件进行上传:

import requests

url = 'http://127.0.0.1:8080/upload'

files = {'file': ('test.txt', b'Hello Requests.')}    #必需显式的设置文件名

r = requests.post(url, files=files)

print(r.text)


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容