Amiminoru

HTTP 200 error fix

Aug 22nd, 2023
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.31 KB | None | 0 0
  1. import asyncio
  2. import json
  3. import os
  4. import ssl
  5. import sys
  6. from time import time
  7. from typing import Generator
  8. from typing import List
  9. from typing import Union
  10.  
  11. from websockets.client import connect, WebSocketClientProtocol
  12. import certifi
  13. import httpx
  14. from BingImageCreator import ImageGenAsync
  15.  
  16. from .constants import DELIMITER
  17. from .constants import HEADERS
  18. from .constants import HEADERS_INIT_CONVER
  19. from .conversation import Conversation
  20. from .conversation_style import CONVERSATION_STYLE_TYPE
  21. from .request import ChatHubRequest
  22. from .utilities import append_identifier
  23. from .utilities import get_ran_hex
  24. from .utilities import guess_locale
  25.  
  26. ssl_context = ssl.create_default_context()
  27. ssl_context.load_verify_locations(certifi.where())
  28.  
  29.  
  30. class ChatHub:
  31.     def __init__(
  32.         self,
  33.         conversation: Conversation,
  34.         proxy: str = None,
  35.         cookies: Union[List[dict], None] = None,
  36.     ) -> None:
  37.         self.request: ChatHubRequest
  38.         self.loop: bool
  39.         self.task: asyncio.Task
  40.         self.request = ChatHubRequest(
  41.             conversation_signature=conversation.struct["conversationSignature"],
  42.             client_id=conversation.struct["clientId"],
  43.             conversation_id=conversation.struct["conversationId"],
  44.         )
  45.         self.cookies = cookies
  46.         self.proxy: str = proxy
  47.         proxy = (
  48.             proxy
  49.             or os.environ.get("all_proxy")
  50.             or os.environ.get("ALL_PROXY")
  51.             or os.environ.get("https_proxy")
  52.             or os.environ.get("HTTPS_PROXY")
  53.             or None
  54.         )
  55.         if proxy is not None and proxy.startswith("socks5h://"):
  56.             proxy = "socks5://" + proxy[len("socks5h://") :]
  57.         self.session = httpx.AsyncClient(
  58.             proxies=proxy,
  59.             timeout=900,
  60.             headers=HEADERS_INIT_CONVER,
  61.         )
  62.  
  63.     async def get_conversation(
  64.         self,
  65.         conversation_id: str = None,
  66.         conversation_signature: str = None,
  67.         client_id: str = None,
  68.     ) -> dict:
  69.         conversation_id = conversation_id or self.request.conversation_id
  70.         conversation_signature = (
  71.             conversation_signature or self.request.conversation_signature
  72.         )
  73.         client_id = client_id or self.request.client_id
  74.         url = f"https://sydney.bing.com/sydney/GetConversation?conversationId={conversation_id}&source=cib&participantId={client_id}&conversationSignature={conversation_signature}&traceId={get_ran_hex()}"
  75.         response = await self.session.get(url)
  76.         return response.json()
  77.  
  78.     async def get_activity(self) -> dict:
  79.         url = "https://www.bing.com/turing/conversation/chats"
  80.         headers = HEADERS_INIT_CONVER.copy()
  81.         if self.cookies is not None:
  82.             for cookie in self.cookies:
  83.                 if cookie["name"] == "_U":
  84.                     headers["Cookie"] = f"SUID=A; _U={cookie['value']};"
  85.                     break
  86.         response = await self.session.get(url, headers=headers)
  87.         return response.json()
  88.  
  89.     async def ask_stream(
  90.         self,
  91.         prompt: str,
  92.         wss_link: str = None,
  93.         conversation_style: CONVERSATION_STYLE_TYPE = None,
  94.         raw: bool = False,
  95.         webpage_context: Union[str, None] = None,
  96.         search_result: bool = False,
  97.         locale: str = guess_locale(),
  98.     ) -> Generator[bool, Union[dict, str], None]:
  99.         """ """
  100.  
  101.         req_header = HEADERS
  102.         if self.cookies is not None:
  103.             ws_cookies = []
  104.             for cookie in self.cookies:
  105.                 ws_cookies.append(f"{cookie['name']}={cookie['value']}")
  106.             req_header.update({
  107.                 'Cookie': ';'.join(ws_cookies),
  108.             })
  109.  
  110.         # Check if websocket is closed
  111.         async with connect(
  112.             wss_link or "wss://sydney.bing.com/sydney/ChatHub",
  113.             extra_headers=req_header,
  114.             max_size=None,
  115.             ssl=ssl_context,
  116.             ping_interval=None,
  117.         ) as wss:
  118.             await self._initial_handshake(wss)
  119.             # Construct a ChatHub request
  120.             self.request.update(
  121.                 prompt=prompt,
  122.                 conversation_style=conversation_style,
  123.                 webpage_context=webpage_context,
  124.                 search_result=search_result,
  125.                 locale=locale,
  126.             )
  127.             # Send request
  128.             await wss.send(append_identifier(self.request.struct))
  129.             draw = False
  130.             resp_txt = ""
  131.             result_text = ""
  132.             resp_txt_no_link = ""
  133.             retry_count = 5
  134.             while not wss.closed:
  135.                 msg = await wss.recv()
  136.                 if not msg:
  137.                     retry_count -= 1
  138.                     if retry_count == 0:
  139.                         raise Exception("No response from server")
  140.                     continue
  141.                 if isinstance(msg, str):
  142.                     objects = msg.split(DELIMITER)
  143.                 else:
  144.                     continue
  145.                 for obj in objects:
  146.                     if int(time()) % 6 == 0:
  147.                         await wss.send(append_identifier({"type": 6}))
  148.                     if obj is None or not obj:
  149.                         continue
  150.                     response = json.loads(obj)
  151.                     # print(response)
  152.                     if response.get("type") == 1 and response["arguments"][0].get(
  153.                         "messages",
  154.                     ):
  155.                         if not draw:
  156.                             if (
  157.                                 response["arguments"][0]["messages"][0].get(
  158.                                     "messageType",
  159.                                 )
  160.                                 == "GenerateContentQuery"
  161.                             ):
  162.                                 async with ImageGenAsync(
  163.                                     all_cookies=self.cookies,
  164.                                 ) as image_generator:
  165.                                     images = await image_generator.get_images(
  166.                                         response["arguments"][0]["messages"][0]["text"],
  167.                                     )
  168.                                 for i, image in enumerate(images):
  169.                                     resp_txt = f"{resp_txt}\n![image{i}]({image})"
  170.                                 draw = True
  171.                             if (
  172.                                 (
  173.                                     response["arguments"][0]["messages"][0][
  174.                                         "contentOrigin"
  175.                                     ]
  176.                                     != "Apology"
  177.                                 )
  178.                                 and not draw
  179.                                 and not raw
  180.                             ):
  181.                                 resp_txt = result_text + response["arguments"][0][
  182.                                     "messages"
  183.                                 ][0]["adaptiveCards"][0]["body"][0].get("text", "")
  184.                                 resp_txt_no_link = result_text + response["arguments"][
  185.                                     0
  186.                                 ]["messages"][0].get("text", "")
  187.                                 if response["arguments"][0]["messages"][0].get(
  188.                                     "messageType",
  189.                                 ):
  190.                                     resp_txt = (
  191.                                         resp_txt
  192.                                         + response["arguments"][0]["messages"][0][
  193.                                             "adaptiveCards"
  194.                                         ][0]["body"][0]["inlines"][0].get("text")
  195.                                         + "\n"
  196.                                     )
  197.                                     result_text = (
  198.                                         result_text
  199.                                         + response["arguments"][0]["messages"][0][
  200.                                             "adaptiveCards"
  201.                                         ][0]["body"][0]["inlines"][0].get("text")
  202.                                         + "\n"
  203.                                     )
  204.                             if not raw:
  205.                                 yield False, resp_txt
  206.  
  207.                     elif response.get("type") == 2:
  208.                         if response["item"]["result"].get("error"):
  209.                             await self.close()
  210.                             raise Exception(
  211.                                 f"{response['item']['result']['value']}: {response['item']['result']['message']}",
  212.                             )
  213.                         if draw:
  214.                             cache = response["item"]["messages"][1]["adaptiveCards"][0][
  215.                                 "body"
  216.                             ][0]["text"]
  217.                             response["item"]["messages"][1]["adaptiveCards"][0]["body"][
  218.                                 0
  219.                             ]["text"] = (cache + resp_txt)
  220.                         if (
  221.                             response["item"]["messages"][-1]["contentOrigin"]
  222.                             == "Apology"
  223.                             and resp_txt
  224.                         ):
  225.                             response["item"]["messages"][-1]["text"] = resp_txt_no_link
  226.                             response["item"]["messages"][-1]["adaptiveCards"][0][
  227.                                 "body"
  228.                             ][0]["text"] = resp_txt
  229.                             print(
  230.                                 "Preserved the message from being deleted",
  231.                                 file=sys.stderr,
  232.                             )
  233.                         await wss.close()
  234.                         yield True, response
  235.                         return
  236.                     if response.get("type") != 2:
  237.                         if response.get("type") == 6:
  238.                             await wss.send(append_identifier({"type": 6}))
  239.                         elif response.get("type") == 7:
  240.                             await wss.send(append_identifier({"type": 7}))
  241.                         elif raw:
  242.                             yield False, response
  243.  
  244.     async def _initial_handshake(self, wss: WebSocketClientProtocol) -> None:
  245.         await wss.send(append_identifier({"protocol": "json", "version": 1}))
  246.         await wss.recv()
  247.         await wss.send(append_identifier({"type": 6}))
  248.  
  249.     async def delete_conversation(
  250.         self,
  251.         conversation_id: str = None,
  252.         conversation_signature: str = None,
  253.         client_id: str = None,
  254.     ) -> None:
  255.         conversation_id = conversation_id or self.request.conversation_id
  256.         conversation_signature = (
  257.             conversation_signature or self.request.conversation_signature
  258.         )
  259.         client_id = client_id or self.request.client_id
  260.         url = "https://sydney.bing.com/sydney/DeleteSingleConversation"
  261.         await self.session.post(
  262.             url,
  263.             json={
  264.                 "conversationId": conversation_id,
  265.                 "conversationSignature": conversation_signature,
  266.                 "participant": {"id": client_id},
  267.                 "source": "cib",
  268.                 "optionsSets": ["autosave"],
  269.             },
  270.         )
  271.  
  272.     async def close(self) -> None:
  273.         await self.session.aclose()
Advertisement
Add Comment
Please, Sign In to add comment