Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,45 +1,64 @@
|
|
|
|
|
| 1 |
import requests
|
| 2 |
import json
|
| 3 |
|
| 4 |
-
|
| 5 |
-
headers = {
|
| 6 |
-
"cookie" : "uuid_guest=12653d55-2f42-4fbd-98bb-33edf8714123; uuid_guest_backup=12653d55-2f42-4fbd-98bb-33edf8714123; AF_DEFAULT_MEASUREMENT_STATUS=true; _ga=GA1.1.1620651973.1726065059; afUserId=26bc0a6c-f7b2-42bb-a950-16348632bbff-p; FPID=FPID2.2.rnWEp46VSGiozCeyM8uHn6Con89GxAFIKMqggZYT0wc%3D.1726065059; FPAU=1.2.1152748874.1726065189; DSR=eyJhbGciOiJSUzI1NiIsImtpZCI6IlNLMmpJbnU3SWpjMkp1eFJad1psWHBZRUpQQkFvIiwidHlwIjoiSldUIn0.eyJhbXIiOlsib2F1dGgiXSwiYXV0aDBJZCI6bnVsbCwiZHJuIjoiRFNSIiwiZW1haWwiOiJhbGhvb3JzaG9wcEBnbWFpbC5jb20iLCJleHAiOjE3NTc1MTQ3OTcsImdpdmVuTmFtZSI6IkFsaG9vciIsImlhdCI6MTcyNjA2NTE5NywiaXNzIjoiUDJqSW50dFJNdVhweVlaTWJWY3NjNEM5WjBSVCIsImxhc3ROYW1lIjoiU2hvcHAiLCJuYW1lIjoiQWxob29yIFNob3BwIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0x5U3YxS3BqTEcyc1Mybjhsa3A3MGpJZGJ3VkNFMWpaM0Q5ZDhzdFI2bldvUlVvdz1zOTYtYyIsInN0eXRjaElkIjpudWxsLCJzdWIiOiJVMmx2ZXVFbTU0RmY3cDRBUXB5NU5FTURteXplIiwidGVuYW50SW52aXRhdGlvbiI6bnVsbCwidGVuYW50SW52aXRlciI6bnVsbCwidXNlcklkIjoiVTJsdmV1RW01NEZmN3A0QVFweTVORU1EbXl6ZSIsInZlcmlmaWVkRW1haWwiOnRydWV9.p5kyNNqq1ELBZ8AGhI6SsRccE_XPK04qE1DhBWI06D1MEksoETLlolHtr8yGUYABGMRtmnhGpiohkEsmaroia7ezQYe4z_vYbepnE0IsuhsH4H6BL8mBogPER6VrmeaEvgNzOGiqGNspMZkkNKPP46f5cZQfFYhPgVD2H_hhC2WlRhwzmA_KBOxSXDnHsuFYIv51aqkAyzUguL_IdG7CajMGkMBf4noTE_6IuBS18_tTUsTgcgMqecFbKfySSOSWMgLUIpZUI4_lNWP7shsvkDI7xsuATrGf7Ci08PyEo0UMmI44EduiZGuCRONuDlFrAYpkeGPZugBlr7SNaBYBVA; tdl_youpro=1020fccf1fab5bf2b1df65da9b6afb; safesearch_guest=Moderate; youpro_subscription=false; you_subscription=freemium; safesearch_b2a2fdf678a327a1f0d04c5a6944ed5165725553bb48ef436dd66c7908778261=Moderate; youchat_personalization=true; youchat_smart_learn=true; _gcl_au=1.1.1532377395.1731247864; guest_has_seen_legal_disclaimer=true; ai_model=gpt_4o; __hstc=118907862.6faf8ebdfa945b79546e019fa9f8537e.1731671057064.1731671057064.1731671057064.1; hubspotutk=6faf8ebdfa945b79546e019fa9f8537e; AF_SYNC=1733581100809; _clck=3hwjik%7C2%7Cfri%7C0%7C1715; ld_context=%7B%22kind%22%3A%22user%22%2C%22key%22%3A%2212653d55-2f42-4fbd-98bb-33edf8714123%22%2C%22email%22%3A%22alhoorshopp%40gmail.com%22%2C%22country%22%3A%22FR%22%2C%22userAgent%22%3A%22Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20Win64%3B%20x64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F131.0.0.0%20Safari%2F537.36%22%2C%22secUserAgent%22%3A%22%5C%22Google%20Chrome%5C%22%3Bv%3D%5C%22131%5C%22%2C%20%5C%22Chromium%5C%22%3Bv%3D%5C%22131%5C%22%2C%20%5C%22Not_A%20Brand%5C%22%3Bv%3D%5C%2224%5C%22%22%7D; daily_query_date=Mon%20Dec%2009%202024; _cfuvid=bOXAnSwqQYBdnpfVngYyCdFLJcXPEWdHxixDpa10xR8-1733736273758-0.0.1.1-604800000; FPLC=lwVXF0r2LJ8awkTN9qz%2BocoRR3Io3zeI8ZxucbP4Ndr6xaEmxUK%2FiqgcJCkgAW%2BKn2yzf%2BIN4YdjuB7seBcQYJwkL9OpZCAJPKcC%2FDr%2Bj4jlG8jOYo%2B7cK8WYxlmtw%3D%3D; _gtmeec=eyJlbSI6ImEwNDQwMmZkOTI4NGQ2NGY3NWM3ZTY5YzIxY2NmZGZjNDhhZDIzNzc5MDJiYmNlYjk2MDMwYWFkZTk1NzdlYmYiLCJjdCI6IjJhNWNhYzcwZTlmMTFhM2I0MmY2YmI0YjQzMmE0ZmUxNmE2ZWNlNDQ1ZjgzZTFiMjJmODQ4M2RkZTA3MGY2OGUiLCJzdCI6ImVhZGUxZTEyNjhlMjhlMzVhNGI3MWM2OTQyNjBjMDIyNGRhNGQ2NWZmZGI0MzVlNTA4MTM0NmZlYTQxMzVhODgiLCJ6cCI6IjJkN2RkY2Q0MTljMDM0OWUwN2QxZDU4NjVjMGJhMTRkODVhMjNlZWM3Yjc3NDU5NDVkNzhmOWJjZjMwZjA2YjAiLCJjb3VudHJ5IjoiNjdhZDhmNDFhN2JiMGExOGM0NWYzZWZkOGY2YTMyYmRjZDgzMmJjZjhmM2YyZWI0NDAwNmMwM2Q1MzA3NmUxOCJ9; __cf_bm=gkaFsGHBP_ZKs4DCnaKBI31HQIR.Bfss33yZhZLg9Ng-1733738316-1.0.1.1-1aT49AezmRP8AiVIrE7_p9oCT4J02YSpXiZvZOQNr2Bri35JLKc0l3ZVLK5R4_CtwL_d7ucb4AqspM951T1Ssxu.xifCxdnX_joyuI4RMjI; cf_clearance=r.kpp7TM.kwwEQjivR1FsXBjbV_0PRS0o_g4kvW6ZOA-1733739680-1.2.1.1-UnUQY4kbIL6Ds2UZ_noT5OOgR9iY5JTB9d73XDZZbQnOq0a4LGqKB__FCySChdDtGH1tkM4Yigb6pYsKAZ7cC.pdiN2lfCNGrG1.D4.n2zc6MyReVw_EDDHttKgUjGlRL44f1YJu0sNxwMHA3T_mF4.jmjvGW0KVS_UqJ.xhWDcrxAvSFCl5VrnyAulQ6Sd.ypm23Qm1Q9pPpK7KDrhwMBiTwFQq7sOcBSwzZRRtty3_peJAccgHke3ndC86o5S6BvgWwk5Izs5nDjmDVehj3TSdC0MbvNw3dHGjIrCccCJeVNa85JdhHbptv96Qnzcn8JWHXxTfpa2nTmxOKlZoq3RNOXDGEYspbCX3hiRJAzwlixHw0FaetgmzRkD2X9moOr3I6Ey6zaiWiuKfTuJ_8A; DS=eyJhbGciOiJSUzI1NiIsImtpZCI6IlNLMmpJbnU3SWpjMkp1eFJad1psWHBZRUpQQkFvIiwidHlwIjoiSldUIn0.eyJhbXIiOlsib2F1dGgiXSwiYXV0aDBJZCI6bnVsbCwiZHJuIjoiRFMiLCJlbWFpbCI6ImFsaG9vcnNob3BwQGdtYWlsLmNvbSIsImV4cCI6MTczNDk0OTI4MiwiZ2l2ZW5OYW1lIjoiQWxob29yIiwiaWF0IjoxNzMzNzM5NjgyLCJpc3MiOiJQMmpJbnR0Uk11WHB5WVpNYlZjc2M0QzlaMFJUIiwibGFzdE5hbWUiOiJTaG9wcCIsIm5hbWUiOiJBbGhvb3IgU2hvcHAiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jTHlTdjFLcGpMRzJzUzJuOGxrcDcwaklkYndWQ0UxalozRDlkOHN0UjZuV29SVW93PXM5Ni1jIiwicmV4cCI6IjIwMjUtMTItMDhUMTA6MjE6MjJaIiwic3R5dGNoSWQiOm51bGwsInN1YiI6IlUybHZldUVtNTRGZjdwNEFRcHk1TkVNRG15emUiLCJ0ZW5hbnRJbnZpdGF0aW9uIjpudWxsLCJ0ZW5hbnRJbnZpdGVyIjpudWxsLCJ1c2VySWQiOiJVMmx2ZXVFbTU0RmY3cDRBUXB5NU5FTURteXplIiwidmVyaWZpZWRFbWFpbCI6dHJ1ZX0.PuCvp8yax-s_Fqn_9CUMph03cbwwAp5tP8Ib6V1TIhLpdINlW7-F5F3VdCSQEl5cCsSHuSxnIx52uFNdb0d7QNUnJDUOV95lenk9_M-ne0n8w33IOSDidNbcGSvtRDGNUkLLjokkh7bATmxjiX13hCH3bxYOxFErBWIPr0OVuQCY-IjOmWnw-MIvw3yaho-0SbaAKAkk2NVen0_lJVAU67EQNgcRqyHjAs4u3f4T9YtIIOA3mLR9xSZdh59g39-DyxDq8FQXRO2B4v5sQshmBWms5JdlHD3Vn9jtFfldRPd__Q1YGzytpogpwbyZZKd5dVJLcDeBIXYo5gUG5cn_wg; ab.storage.deviceId.dcee0642-d796-4a7b-9e56-a0108e133b07=g%3Abd7f481f-f2a4-2851-c570-f915decb5bd2%7Ce%3Aundefined%7Cc%3A1726065048731%7Cl%3A1733739676118; ab.storage.userId.dcee0642-d796-4a7b-9e56-a0108e133b07=g%3AU2lveuEm54Ff7p4AQpy5NEMDmyze%7Ce%3Aundefined%7Cc%3A1726065077561%7Cl%3A1733739676119; ab.storage.sessionId.dcee0642-d796-4a7b-9e56-a0108e133b07=g%3A12f556f1-d509-a72a-f1ca-b06cd93ad1fb%7Ce%3A1733741477749%7Cc%3A1733739676118%7Cl%3A1733739677749; _ga_2N7ZM9C56V=GS1.1.1733739642.11.1.1733739688.0.0.339358602; FPGSID=1.1733739699.1733739699.G-WYGVQX1R23.SlsAxbpKVxX3XSYobUX90Q; daily_query_count=1; total_query_count=16",
|
| 7 |
-
"Accept": "text/event-stream",
|
| 8 |
-
"Accept-Encoding": "gzip, deflate, br, zstd",
|
| 9 |
-
"Accept-Language": "en-US,en;q=0.9,ar;q=0.8",
|
| 10 |
-
"Cache-Control": "no-cache",
|
| 11 |
-
"Connection": "keep-alive",
|
| 12 |
-
"Host": "you.com",
|
| 13 |
-
"Referer": "https://you.com/search?q=%D8%A7%D8%AB%D8%BA&fromSearchBar=true&tbm=youchat&chatMode=default&cid=c0_7d4eb946-cc48-4fe0-8a90-0625e6d49ea7",
|
| 14 |
-
"Sec-CH-UA": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
|
| 15 |
-
"Sec-CH-UA-Arch": '"x86"',
|
| 16 |
-
"Sec-CH-UA-Bitness": '"64"',
|
| 17 |
-
"Sec-CH-UA-Full-Version": '"131.0.6778.87"',
|
| 18 |
-
"Sec-CH-UA-Mobile": "?0",
|
| 19 |
-
"Sec-CH-UA-Model": '""',
|
| 20 |
-
"Sec-CH-UA-Platform": '"Windows"',
|
| 21 |
-
"Sec-CH-UA-Platform-Version": '"10.0.0"',
|
| 22 |
-
"Sec-Fetch-Dest": "empty",
|
| 23 |
-
"Sec-Fetch-Mode": "cors",
|
| 24 |
-
"Sec-Fetch-Site": "same-origin",
|
| 25 |
-
"User -Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
|
| 26 |
|
| 27 |
-
}
|
| 28 |
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
-
|
|
|
|
| 32 |
|
| 33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
-
|
| 36 |
-
|
| 37 |
|
| 38 |
-
|
| 39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
-
|
|
|
|
|
|
|
| 42 |
|
|
|
|
|
|
|
|
|
|
| 43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
|
|
|
| 45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from flask import Flask, request, jsonify
|
| 2 |
import requests
|
| 3 |
import json
|
| 4 |
|
| 5 |
+
app = Flask(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
|
|
|
| 7 |
|
| 8 |
+
@app.route('/duckchat', methods=['POST'])
|
| 9 |
+
def duckchat():
|
| 10 |
+
try:
|
| 11 |
+
# Get the input data from the request
|
| 12 |
+
input_data = request.json
|
| 13 |
|
| 14 |
+
if not input_data or 'messages' not in input_data:
|
| 15 |
+
return jsonify({"error": "Invalid input. 'messages' field is required."}), 400
|
| 16 |
|
| 17 |
+
# Get the status endpoint to fetch x-vqd-4
|
| 18 |
+
status_url = "https://duckduckgo.com/duckchat/v1/status"
|
| 19 |
+
status_headers = {
|
| 20 |
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
| 21 |
+
"x-vqd-accept": "1"
|
| 22 |
+
}
|
| 23 |
+
status_response = requests.get(status_url, headers=status_headers)
|
| 24 |
+
x_vqd_4 = status_response.headers.get("x-vqd-4", "")
|
| 25 |
|
| 26 |
+
if not x_vqd_4:
|
| 27 |
+
return jsonify({"error": "Failed to retrieve x-vqd-4 token."}), 500
|
| 28 |
|
| 29 |
+
# Send the chat message
|
| 30 |
+
chat_url = "https://duckduckgo.com/duckchat/v1/chat"
|
| 31 |
+
chat_headers = {
|
| 32 |
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
| 33 |
+
"x-vqd-4": x_vqd_4
|
| 34 |
+
}
|
| 35 |
+
chat_payload = {
|
| 36 |
+
"messages": input_data['messages'],
|
| 37 |
+
"model": input_data.get('model', "gpt-4o-mini")
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
chat_response = requests.post(chat_url, headers=chat_headers, json=chat_payload)
|
| 41 |
|
| 42 |
+
# Check if the response is successful
|
| 43 |
+
if chat_response.status_code != 200:
|
| 44 |
+
return jsonify({"error": "Failed to fetch response from DuckDuckGo Chat API."}), chat_response.status_code
|
| 45 |
|
| 46 |
+
# Process the response
|
| 47 |
+
response_lines = chat_response.text.splitlines()
|
| 48 |
+
final_response = ""
|
| 49 |
|
| 50 |
+
for line in response_lines:
|
| 51 |
+
try:
|
| 52 |
+
data = json.loads(line.replace("data: ", ""))
|
| 53 |
+
if "message" in data:
|
| 54 |
+
final_response += data["message"]
|
| 55 |
+
except json.JSONDecodeError:
|
| 56 |
+
continue
|
| 57 |
|
| 58 |
+
return jsonify({"response": final_response})
|
| 59 |
|
| 60 |
+
except Exception as e:
|
| 61 |
+
return jsonify({"error": str(e)}), 500
|
| 62 |
+
|
| 63 |
+
if __name__ == "__main__":
|
| 64 |
+
app.run(host="0.0.0.0", port=7860)
|