【PYTHON】模拟请求接口
【PYTHON】模拟请求接口
- 1. 如果是请求https,请加上verify=False
- 2. header中的中横线问题,需要修改为数字键盘上的-,否则会报错
- 3. 请求代码
- 4. verify设置本地证书
1. 如果是请求https,请加上verify=False
2. header中的中横线问题,需要修改为数字键盘上的-,否则会报错
UnicodeEncodeError:'ascii'codec can't encode character '\u2011'inposition7: ordinal notinrange(128)可以使用如下函数找出异常字符
defscan_all_headers(headers:dict):"""扫描headers字典,找出key和value中所有非ASCII字符"""forkey,valinheaders.items():# 扫描 key(重点!本次报错就在key)forpos,charinenumerate(key):iford(char)>127:print(f"\n>>> 异常在【Header Key】")print(f"key完整字符串:{repr(key)}")print(f"位置pos={pos}字符={repr(char)}ord={ord(char)}")# 扫描 values_val=str(val)forpos,charinenumerate(s_val):iford(char)>127:print(f"\n>>> 异常在【Header Value】key={key}")print(f"value片段:{repr(s_val[:80])}")print(f"位置pos={pos}字符={repr(char)}ord={ord(char)}")3. 请求代码
defget_call_sno():driver=connect_chrome()driver.get("https://xxxxx/")time.sleep(4)# 获取selenium浏览器全部cookiecookies=driver.get_cookies()# 方式A:转成requests可以直接用的cookies字典req_cookies={}forckincookies:req_cookies[ck["name"]]=ck["value"]# 方式B:拼接Cookie请求头字符串(有些接口只认header里的Cookie)cookie_header="; ".join(f"{c['name']}={c['value']}"forcincookies)# ==========2. requests发起POST请求 ==========now=datetime.now()requestdate=now.strftime("%Y%m%d")ts_ms=int(time.time()*1000)url_post=f"xxxxx&_t={ts_ms}"print(url_post)headers_raw={"accept":'application/json, text/javascript, */*; q=0.01',"accept-encoding":'gzip, deflate, br, zstd',"accept-language":'zh-CN,zh;q=0.9',"Cookie":cookie_header,"Content-Type":"text/plain; charset=UTF-8","host":"xxxxx","origin":"https://xxxxx/","referer":"text/plain; charset=UTF-8","sec-ch-ua":'"Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"'}scan_all_headers(headers_raw)# exit(0)headers=clean_header_dict(headers_raw)data='{xxxxxxx}'# 这样做的目的是为了避免:SyntaxError: f-string: expressions nested too deeplypost_data_str=data.replace("20260817",requestdate)resp=requests.post(url_post,data=post_data_str,cookies=req_cookies,# 二选一,传cookies字典headers=headers_raw,timeout=15,verify=False)print("状态码",resp.status_code)data=json.loads(resp.text)# print("返回内容", resp.text)sno=data.get("xx")[0].get("xx")[0][0].get("xx")returnf"{sno}"4. verify设置本地证书
从浏览器中导出证书,选择详细信息-选择最底层证书-导出-选择证书链-修改crt格式为pem格式,然后使用如下代码使用证书请求
resp=requests.post(url_post,data=redata,# cookies=req_cookies, # 二选一,传cookies字典headers=headers_raw,timeout=15,verify=r"D:\pythonauto\chromeDriver\xxx.pem")