由於chatgpt關閉了中國區域的服務,我們在使用openai的api時需要點自由(f)訪問(q)的技能。本人能力不足,在使用了本地1080代理之後,發現庫openai v0.27.2無法使用,追蹤源碼後發現內部使用的requests庫。requests在使用時會讀取系統的代理信息,替換請求的地址,最後導致訪問不到hostname。
在使用postman測試的過程中發現,在本地開啓小飛機之後,postman根據協議正常訪問即可獲取對應結果。如下圖,Authorization需要添加密鑰。
postman測試成功,就說明一個問題,這是python封裝的request庫及本地環境的問題。假設我們訪問chatgpt 可以自由訪問,也就不必設置小飛機,代碼裏既不需要系統代理也不需要指定代理,甚至可以直接使用官方庫openai。但目前沒發現代碼裏停用系統代理,但使用指定代理的方案。
注意resp的內容,正常情況下我們通過json或者content來讀取返回的響應。目前的api返回結果不完全如文檔中的描述,可能是其他因素的影響,暫無精力繼續追查。
1 from urllib.request import ProxyHandler, build_opener, Request 2 3 secret_key = 'sk-****' 4 5 6 proxy = { 7 'http': 'http://127.0.0.1:1080', 8 'https': 'https://127.0.0.1:1080', 9 'ftp': 'ftp://127.0.0.1:1080', 10 } 11 proxy_handler = ProxyHandler(proxy) 12 opener = build_opener(proxy_handler) 13 headers = { 14 'Content-Type': 'application/json', 15 'Authorization': 'Bearer ' + secret_key, 16 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0', 17 } 18 message_log = [ 19 {"content": "你好,我是一個聊天機器人。", "role": "system"}, 20 {"content": "你好,你叫什麼名字?", "role": "user"} 21 ] 22 23 def chat(): 24 data = { 25 'model': 'gpt-3.5-turbo', 26 'messages': message_log, 27 } 28 resp = opener.open(Request(url='https://api.openai.com/v1/chat/completions', 29 headers=headers, 30 data=bytes(json.dumps(data), encoding='utf-8') 31 )) 32 if resp: 33 s = resp.fp.readlines() 34 if len(s) >= 2: 35 print(json.loads(str(s[1], encoding='utf-8'))) 36 else: 37 print(json.loads(str(s[0], encoding='utf-8')))