Compare commits

..

12 Commits

Author SHA1 Message Date
Thamognya Kodi 5e2054fc43
revert back to manual git 2023-01-18 14:36:42 +07:00
Thamognya Kodi 5cde349db0
updates to makefile and chatgpt 2023-01-18 14:35:30 +07:00
Thamognya b6a0b92afc
Merge pull request #48 from thamognya/dependabot/pip/pytz-2022.7.1
⬆️ Bump pytz from 2022.7 to 2022.7.1
2023-01-18 14:08:59 +07:00
Thamognya 0eb750cdef
Merge pull request #49 from thamognya/dependabot/pip/openai-0.26.1
⬆️ Bump openai from 0.26.0 to 0.26.1
2023-01-18 14:08:42 +07:00
Thamognya d5a1284e89
Merge pull request #50 from thamognya/dependabot/pip/pyahocorasick-2.0.0
⬆️ Bump pyahocorasick from 1.4.4 to 2.0.0
2023-01-18 14:08:27 +07:00
Thamognya 910afca432
Merge pull request #51 from thamognya/dependabot/pip/pytest-7.2.1
⬆️ Bump pytest from 7.2.0 to 7.2.1
2023-01-18 14:08:10 +07:00
Thamognya 6426715f5c
Merge pull request #52 from thamognya/dependabot/pip/rich-13.1.0
⬆️ Bump rich from 10.16.2 to 13.1.0
2023-01-18 14:07:38 +07:00
dependabot[bot] f23a5f15a5
⬆️ Bump rich from 10.16.2 to 13.1.0
Bumps [rich](https://github.com/Textualize/rich) from 10.16.2 to 13.1.0.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v10.16.2...v13.1.0)

---
updated-dependencies:
- dependency-name: rich
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 11:57:06 +00:00
dependabot[bot] 042539d32e
⬆️ Bump pytest from 7.2.0 to 7.2.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.0 to 7.2.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.2.0...7.2.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: indirect
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 11:54:16 +00:00
dependabot[bot] 41ba757a20
⬆️ Bump pyahocorasick from 1.4.4 to 2.0.0
Bumps [pyahocorasick](https://github.com/WojciechMula/pyahocorasick) from 1.4.4 to 2.0.0.
- [Release notes](https://github.com/WojciechMula/pyahocorasick/releases)
- [Changelog](https://github.com/WojciechMula/pyahocorasick/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/WojciechMula/pyahocorasick/compare/1.4.4...2.0.0)

---
updated-dependencies:
- dependency-name: pyahocorasick
  dependency-type: indirect
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 11:50:49 +00:00
dependabot[bot] cd0fe6584d
⬆️ Bump openai from 0.26.0 to 0.26.1
Bumps [openai](https://github.com/openai/openai-python) from 0.26.0 to 0.26.1.
- [Release notes](https://github.com/openai/openai-python/releases)
- [Commits](https://github.com/openai/openai-python/compare/v0.26.0...v0.26.1)

---
updated-dependencies:
- dependency-name: openai
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 11:48:38 +00:00
dependabot[bot] 02a4c5ad69
⬆️ Bump pytz from 2022.7 to 2022.7.1
Bumps [pytz](https://github.com/stub42/pytz) from 2022.7 to 2022.7.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7...release_2022.7.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: indirect
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 11:43:07 +00:00
5 changed files with 275 additions and 376 deletions

View File

@ -74,8 +74,15 @@ lint: test check-codestyle mypy check-safety
.PHONY: update-dev-deps .PHONY: update-dev-deps
update-dev-deps: update-dev-deps:
poetry add -D bandit@latest darglint@latest "isort[colors]@latest" mypy@latest pre-commit@latest pydocstyle@latest pylint@latest pytest@latest pyupgrade@latest safety@latest coverage@latest coverage-badge@latest pytest-html@latest pytest-cov@latest poetry add --group dev bandit@latest darglint@latest "isort[colors]@latest" mypy@latest pre-commit@latest pydocstyle@latest pylint@latest pytest@latest pyupgrade@latest safety@latest coverage@latest coverage-badge@latest pytest-html@latest pytest-cov@latest
poetry add -D --allow-prereleases black@latest poetry add --group dev --allow-prereleases black@latest
.PHONY: update-deps
update-deps: poetry update --lock && pip install -r requirements.txt
.PHONY: update
update: update-dev-deps update-deps
#* Container / Docker #* Container / Docker
# Example: make container-build VERSION=latest # Example: make container-build VERSION=latest

View File

@ -1,20 +1,15 @@
# type: ignore # type: ignore
# For some reason package not working so just deal with it and dont ask questions # For some reason package not working so just deal with it and dont ask questions
# Copied and updated from https://github.com/acheong08/ChatGPT/blob/main/src/revChatGPT/ChatGPT.py # Copied and updated from https://github.com/acheong08/ChatGPT/blob/main/src/revChatGPT/ChatGPT.py
# credits to https://github.com/acheong08/ChatGPT
import json import uuid, re, json, tls_client, logging
import logging
import re
import uuid
from time import sleep
import tls_client
import undetected_chromedriver as uc import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep
from twocaptcha import TwoCaptcha from twocaptcha import TwoCaptcha
# Disable all logging # Disable all logging
logging.basicConfig(level=logging.ERROR) logging.basicConfig(level=logging.ERROR)
@ -22,16 +17,17 @@ BASE_URL = "https://chat.openai.com/"
class Chrome(uc.Chrome): class Chrome(uc.Chrome):
def __del__(self): def __del__(self):
self.quit() self.quit()
class Chatbot: class Chatbot:
def __init__( def __init__(self, config, conversation_id=None, parent_id=None, no_refresh=False) -> None:
self, config, conversation_id=None, parent_id=None, no_refresh=False
) -> None:
self.config = config self.config = config
self.session = tls_client.Session(client_identifier="chrome_108") self.session = tls_client.Session(
client_identifier="chrome_108"
)
if "proxy" in config: if "proxy" in config:
if type(config["proxy"]) != str: if type(config["proxy"]) != str:
raise Exception("Proxy must be a string!") raise Exception("Proxy must be a string!")
@ -54,9 +50,9 @@ class Chatbot:
self.isMicrosoftLogin = False self.isMicrosoftLogin = False
self.twocaptcha_key = None self.twocaptcha_key = None
# stdout colors # stdout colors
self.GREEN = "\033[92m" self.GREEN = '\033[92m'
self.WARNING = "\033[93m" self.WARNING = '\033[93m'
self.ENDCOLOR = "\033[0m" self.ENDCOLOR = '\033[0m'
if "email" in config and "password" in config: if "email" in config and "password" in config:
if type(config["email"]) != str: if type(config["email"]) != str:
raise Exception("Email must be a string!") raise Exception("Email must be a string!")
@ -82,8 +78,7 @@ class Chatbot:
raise Exception("Session token must be a string!") raise Exception("Session token must be a string!")
self.session_token = config["session_token"] self.session_token = config["session_token"]
self.session.cookies.set( self.session.cookies.set(
"__Secure-next-auth.session-token", config["session_token"] "__Secure-next-auth.session-token", config["session_token"])
)
self.get_cf_cookies() self.get_cf_cookies()
else: else:
raise Exception("Invalid config!") raise Exception("Invalid config!")
@ -96,21 +91,15 @@ class Chatbot:
try: try:
self.refresh_session() self.refresh_session()
refresh = False refresh = False
except Exception: except Exception as exc:
if retries == 0: if retries == 0:
raise Exception("Failed to refresh session!") raise exc
retries -= 1 retries -= 1
def ask( def ask(self, prompt, conversation_id=None, parent_id=None, gen_title=False, session_token=None):
self,
prompt,
conversation_id=None,
parent_id=None,
gen_title=False,
session_token=None,
):
if session_token: if session_token:
self.session.cookies.set("__Secure-next-auth.session-token", session_token) self.session.cookies.set(
"__Secure-next-auth.session-token", session_token)
self.session_token = session_token self.session_token = session_token
self.config["session_token"] = session_token self.config["session_token"] = session_token
self.retry_refresh() self.retry_refresh()
@ -118,11 +107,8 @@ class Chatbot:
if conversation_id == None: if conversation_id == None:
conversation_id = self.conversation_id conversation_id = self.conversation_id
if parent_id == None: if parent_id == None:
parent_id = ( parent_id = self.parent_id if conversation_id == self.conversation_id else self.conversation_mapping[
self.parent_id conversation_id]
if conversation_id == self.conversation_id
else self.conversation_mapping[conversation_id]
)
data = { data = {
"action": "next", "action": "next",
"messages": [ "messages": [
@ -137,12 +123,13 @@ class Chatbot:
"model": "text-davinci-002-render", "model": "text-davinci-002-render",
} }
new_conv = data["conversation_id"] is None new_conv = data["conversation_id"] is None
self.conversation_id_prev_queue.append(data["conversation_id"]) # for rollback self.conversation_id_prev_queue.append(
data["conversation_id"]) # for rollback
self.parent_id_prev_queue.append(data["parent_message_id"]) self.parent_id_prev_queue.append(data["parent_message_id"])
response = self.session.post( response = self.session.post(
url=BASE_URL + "backend-api/conversation", url=BASE_URL + "backend-api/conversation",
data=json.dumps(data), data=json.dumps(data),
timeout_seconds=180, timeout_seconds=180
) )
if response.status_code != 200: if response.status_code != 200:
print(response.text) print(response.text)
@ -168,12 +155,12 @@ class Chatbot:
} }
if gen_title and new_conv: if gen_title and new_conv:
try: try:
title = self.gen_title(self.conversation_id, self.parent_id)[ title = self.gen_title(
"title" self.conversation_id, self.parent_id)["title"]
]
except Exception as exc: except Exception as exc:
split = prompt.split(" ") split = prompt.split(" ")
title = " ".join(split[:3]) + ("..." if len(split) > 3 else "") title = " ".join(split[:3]) + \
("..." if len(split) > 3 else "")
res["title"] = title res["title"] = title
return res return res
else: else:
@ -185,7 +172,8 @@ class Chatbot:
raise Exception("Response code error: ", response.status_code) raise Exception("Response code error: ", response.status_code)
def get_conversations(self, offset=0, limit=20): def get_conversations(self, offset=0, limit=20):
url = BASE_URL + f"backend-api/conversations?offset={offset}&limit={limit}" url = BASE_URL + \
f"backend-api/conversations?offset={offset}&limit={limit}"
response = self.session.get(url) response = self.session.get(url)
self.check_response(response) self.check_response(response)
data = json.loads(response.text) data = json.loads(response.text)
@ -200,19 +188,15 @@ class Chatbot:
def gen_title(self, id, message_id): def gen_title(self, id, message_id):
url = BASE_URL + f"backend-api/conversation/gen_title/{id}" url = BASE_URL + f"backend-api/conversation/gen_title/{id}"
response = self.session.post( response = self.session.post(url, data=json.dumps(
url, {"message_id": message_id, "model": "text-davinci-002-render"}))
data=json.dumps(
{"message_id": message_id, "model": "text-davinci-002-render"}
),
)
self.check_response(response) self.check_response(response)
data = json.loads(response.text) data = json.loads(response.text)
return data return data
def change_title(self, id, title): def change_title(self, id, title):
url = BASE_URL + f"backend-api/conversation/{id}" url = BASE_URL + f"backend-api/conversation/{id}"
response = self.session.patch(url, data=f'{{"title": {title}}}') response = self.session.patch(url, data=f'{{"title": "{title}"}}')
self.check_response(response) self.check_response(response)
def delete_conversation(self, id): def delete_conversation(self, id):
@ -228,7 +212,8 @@ class Chatbot:
def refresh_session(self, session_token=None): def refresh_session(self, session_token=None):
if session_token: if session_token:
self.session.cookies.set("__Secure-next-auth.session-token", session_token) self.session.cookies.set(
"__Secure-next-auth.session-token", session_token)
self.session_token = session_token self.session_token = session_token
self.config["session_token"] = session_token self.config["session_token"] = session_token
url = BASE_URL + "api/auth/session" url = BASE_URL + "api/auth/session"
@ -239,21 +224,15 @@ class Chatbot:
try: try:
if "error" in response.json(): if "error" in response.json():
raise Exception( raise Exception(
f"Failed to refresh session! Error: {response.json()['error']}" f"Failed to refresh session! Error: {response.json()['error']}")
) elif response.status_code != 200 or response.json() == {} or "accessToken" not in response.json():
elif ( raise Exception(f'Response code: {response.status_code} \n Response: {response.text}')
response.status_code != 200
or response.json() == {}
or "accessToken" not in response.json()
):
raise Exception("Failed to refresh session!")
else: else:
self.session.headers.update( self.session.headers.update({
{"Authorization": "Bearer " + response.json()["accessToken"]} "Authorization": "Bearer " + response.json()["accessToken"]
) })
self.session_token = self.session.cookies._find( self.session_token = self.session.cookies._find(
"__Secure-next-auth.session-token", "__Secure-next-auth.session-token", )
)
except Exception as exc: except Exception as exc:
print("Failed to refresh session!") print("Failed to refresh session!")
if self.isMicrosoftLogin: if self.isMicrosoftLogin:
@ -289,86 +268,65 @@ class Chatbot:
options = self.__get_ChromeOptions() options = self.__get_ChromeOptions()
print("Spawning browser...") print("Spawning browser...")
driver = uc.Chrome( driver = uc.Chrome(
enable_cdp_events=True, enable_cdp_events=True, options=options,
options=options,
driver_executable_path=self.config.get("driver_exec_path"), driver_executable_path=self.config.get("driver_exec_path"),
browser_executable_path=self.config.get("browser_exec_path"), browser_executable_path=self.config.get("browser_exec_path")
) )
print("Browser spawned.") print("Browser spawned.")
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.responseReceivedExtraInfo", "Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
lambda msg: self.detect_cookies(msg),
)
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.requestWillBeSentExtraInfo", "Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
lambda msg: self.detect_user_agent(msg),
)
driver.get(BASE_URL) driver.get(BASE_URL)
while not self.agent_found or not self.cf_cookie_found: while not self.agent_found or not self.cf_cookie_found:
sleep(5) sleep(5)
self.refresh_headers( self.refresh_headers(cf_clearance=self.cf_clearance,
cf_clearance=self.cf_clearance, user_agent=self.user_agent user_agent=self.user_agent)
)
# Wait for the login button to appear # Wait for the login button to appear
WebDriverWait(driver, 120).until( WebDriverWait(driver, 120).until(EC.element_to_be_clickable(
EC.element_to_be_clickable( (By.XPATH, "//button[contains(text(), 'Log in')]")))
(By.XPATH, "//button[contains(text(), 'Log in')]")
)
)
# Click the login button # Click the login button
driver.find_element( driver.find_element(
by=By.XPATH, value="//button[contains(text(), 'Log in')]" by=By.XPATH, value="//button[contains(text(), 'Log in')]").click()
).click()
# Wait for the Login with Microsoft button to be clickable # Wait for the Login with Microsoft button to be clickable
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable( (By.XPATH, "//button[@data-provider='windowslive']")))
(By.XPATH, "//button[@data-provider='windowslive']")
)
)
# Click the Login with Microsoft button # Click the Login with Microsoft button
driver.find_element( driver.find_element(
by=By.XPATH, value="//button[@data-provider='windowslive']" by=By.XPATH, value="//button[@data-provider='windowslive']").click()
).click()
# Wait for the email input field to appear # Wait for the email input field to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located((By.XPATH, "//input[@type='email']")) (By.XPATH, "//input[@type='email']")))
)
# Enter the email # Enter the email
driver.find_element(by=By.XPATH, value="//input[@type='email']").send_keys( driver.find_element(
self.config["email"] by=By.XPATH, value="//input[@type='email']").send_keys(self.config["email"])
)
# Wait for the Next button to be clickable # Wait for the Next button to be clickable
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']")) (By.XPATH, "//input[@type='submit']")))
)
# Click the Next button # Click the Next button
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click() driver.find_element(
by=By.XPATH, value="//input[@type='submit']").click()
# Wait for the password input field to appear # Wait for the password input field to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located( (By.XPATH, "//input[@type='password']")))
(By.XPATH, "//input[@type='password']")
)
)
# Enter the password # Enter the password
driver.find_element( driver.find_element(
by=By.XPATH, value="//input[@type='password']" by=By.XPATH, value="//input[@type='password']").send_keys(self.config["password"])
).send_keys(self.config["password"])
# Wait for the Sign in button to be clickable # Wait for the Sign in button to be clickable
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']")) (By.XPATH, "//input[@type='submit']")))
)
# Click the Sign in button # Click the Sign in button
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click() driver.find_element(
by=By.XPATH, value="//input[@type='submit']").click()
# Wait for the Allow button to appear # Wait for the Allow button to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']")) (By.XPATH, "//input[@type='submit']")))
)
# click Yes button # click Yes button
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click() driver.find_element(
by=By.XPATH, value="//input[@type='submit']").click()
# wait for input box to appear (to make sure we're signed in) # wait for input box to appear (to make sure we're signed in)
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located((By.XPATH, "//textarea")) (By.XPATH, "//textarea")))
)
while not self.session_cookie_found: while not self.session_cookie_found:
sleep(5) sleep(5)
print(self.GREEN + "Login successful." + self.ENDCOLOR) print(self.GREEN + "Login successful." + self.ENDCOLOR)
@ -385,26 +343,20 @@ class Chatbot:
""" """
twocaptcha_key = self.twocaptcha_key twocaptcha_key = self.twocaptcha_key
twocaptcha_solver_config = { twocaptcha_solver_config = {
"apiKey": twocaptcha_key, 'apiKey': twocaptcha_key,
"defaultTimeout": 120, 'defaultTimeout': 120,
"recaptchaTimeout": 600, 'recaptchaTimeout': 600,
"pollingInterval": 10, 'pollingInterval': 10,
} }
twocaptcha_solver = TwoCaptcha(**twocaptcha_solver_config) twocaptcha_solver = TwoCaptcha(**twocaptcha_solver_config)
print("Waiting for captcha to be solved...") print('Waiting for captcha to be solved...')
solved_captcha = twocaptcha_solver.recaptcha( solved_captcha = twocaptcha_solver.recaptcha(
sitekey="6Lc-wnQjAAAAADa5SPd68d0O3xmj0030uaVzpnXP", sitekey='6Lc-wnQjAAAAADa5SPd68d0O3xmj0030uaVzpnXP', url="https://auth0.openai.com/u/login/identifier")
url="https://auth0.openai.com/u/login/identifier",
)
if "code" in solved_captcha: if "code" in solved_captcha:
print(self.GREEN + "Captcha solved successfully!" + self.ENDCOLOR) print(self.GREEN + "Captcha solved successfully!" + self.ENDCOLOR)
if self.verbose: if self.verbose:
print( print(self.GREEN + "Captcha token: " +
self.GREEN self.ENDCOLOR + solved_captcha["code"])
+ "Captcha token: "
+ self.ENDCOLOR
+ solved_captcha["code"]
)
return solved_captcha return solved_captcha
def email_login(self, solved_captcha) -> None: def email_login(self, solved_captcha) -> None:
@ -423,105 +375,74 @@ class Chatbot:
options = self.__get_ChromeOptions() options = self.__get_ChromeOptions()
print("Spawning browser...") print("Spawning browser...")
driver = uc.Chrome( driver = uc.Chrome(
enable_cdp_events=True, enable_cdp_events=True, options=options,
options=options,
driver_executable_path=self.config.get("driver_exec_path"), driver_executable_path=self.config.get("driver_exec_path"),
browser_executable_path=self.config.get("browser_exec_path"), browser_executable_path=self.config.get("browser_exec_path")
) )
print("Browser spawned.") print("Browser spawned.")
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.responseReceivedExtraInfo", "Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
lambda msg: self.detect_cookies(msg),
)
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.requestWillBeSentExtraInfo", "Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
lambda msg: self.detect_user_agent(msg),
)
driver.get(BASE_URL) driver.get(BASE_URL)
while not self.agent_found or not self.cf_cookie_found: while not self.agent_found or not self.cf_cookie_found:
sleep(5) sleep(5)
self.refresh_headers( self.refresh_headers(cf_clearance=self.cf_clearance,
cf_clearance=self.cf_clearance, user_agent=self.user_agent user_agent=self.user_agent)
)
# Wait for the login button to appear # Wait for the login button to appear
WebDriverWait(driver, 120).until( WebDriverWait(driver, 120).until(EC.element_to_be_clickable(
EC.element_to_be_clickable( (By.XPATH, "//button[contains(text(), 'Log in')]")))
(By.XPATH, "//button[contains(text(), 'Log in')]")
)
)
# Click the login button # Click the login button
driver.find_element( driver.find_element(
by=By.XPATH, value="//button[contains(text(), 'Log in')]" by=By.XPATH, value="//button[contains(text(), 'Log in')]").click()
).click()
# Wait for the email input field to appear # Wait for the email input field to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located((By.ID, "username")) (By.ID, "username")))
)
# Enter the email # Enter the email
driver.find_element(by=By.ID, value="username").send_keys( driver.find_element(by=By.ID, value="username").send_keys(
self.config["email"] self.config["email"])
)
# Wait for Recaptcha to appear # Wait for Recaptcha to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.presence_of_element_located(
EC.presence_of_element_located( (By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")))
(By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")
)
)
# Find Recaptcha # Find Recaptcha
google_captcha_response_input = driver.find_element( google_captcha_response_input = driver.find_element(
By.CSS_SELECTOR, "*[name*='g-recaptcha-response']" By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")
) captcha_input = driver.find_element(By.NAME, 'captcha')
captcha_input = driver.find_element(By.NAME, "captcha")
# Make input visible # Make input visible
driver.execute_script( driver.execute_script("arguments[0].setAttribute('style','type: text; visibility:visible;');",
"arguments[0].setAttribute('style','type: text; visibility:visible;');", google_captcha_response_input)
google_captcha_response_input, driver.execute_script("arguments[0].setAttribute('style','type: text; visibility:visible;');",
) captcha_input)
driver.execute_script( driver.execute_script("""
"arguments[0].setAttribute('style','type: text; visibility:visible;');",
captcha_input,
)
driver.execute_script(
"""
document.getElementById("g-recaptcha-response").innerHTML = arguments[0] document.getElementById("g-recaptcha-response").innerHTML = arguments[0]
""", """, solved_captcha.get('code'))
solved_captcha.get("code"), driver.execute_script("""
)
driver.execute_script(
"""
document.querySelector("input[name='captcha']").value = arguments[0] document.querySelector("input[name='captcha']").value = arguments[0]
""", """, solved_captcha.get('code'))
solved_captcha.get("code"),
)
# Hide the captcha input # Hide the captcha input
driver.execute_script( driver.execute_script("arguments[0].setAttribute('style', 'display:none;');",
"arguments[0].setAttribute('style', 'display:none;');", google_captcha_response_input)
google_captcha_response_input,
)
# Wait for the Continue button to be clickable # Wait for the Continue button to be clickable
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")) (By.XPATH, "//button[@type='submit']")))
)
# Click the Continue button # Click the Continue button
driver.find_element(by=By.XPATH, value="//button[@type='submit']").click() driver.find_element(
by=By.XPATH, value="//button[@type='submit']").click()
# Wait for the password input field to appear # Wait for the password input field to appear
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located((By.ID, "password")) (By.ID, "password")))
)
# Enter the password # Enter the password
driver.find_element(by=By.ID, value="password").send_keys( driver.find_element(by=By.ID, value="password").send_keys(
self.config["password"] self.config["password"])
)
# Wait for the Sign in button to be clickable # Wait for the Sign in button to be clickable
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")) (By.XPATH, "//button[@type='submit']")))
)
# Click the Sign in button # Click the Sign in button
driver.find_element(by=By.XPATH, value="//button[@type='submit']").click() driver.find_element(
by=By.XPATH, value="//button[@type='submit']").click()
# wait for input box to appear (to make sure we're signed in) # wait for input box to appear (to make sure we're signed in)
WebDriverWait(driver, 60).until( WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
EC.visibility_of_element_located((By.XPATH, "//textarea")) (By.XPATH, "//textarea")))
)
while not self.session_cookie_found: while not self.session_cookie_found:
sleep(5) sleep(5)
print(self.GREEN + "Login successful." + self.ENDCOLOR) print(self.GREEN + "Login successful." + self.ENDCOLOR)
@ -532,14 +453,13 @@ class Chatbot:
def __get_ChromeOptions(self): def __get_ChromeOptions(self):
options = uc.ChromeOptions() options = uc.ChromeOptions()
options.add_argument("--start_maximized") options.add_argument('--start_maximized')
options.add_argument("--disable-extensions") options.add_argument("--disable-extensions")
options.add_argument("--disable-application-cache") options.add_argument('--disable-application-cache')
options.add_argument("--disable-gpu") options.add_argument('--disable-gpu')
options.add_argument("--no-sandbox") options.add_argument("--no-sandbox")
options.add_argument("--disable-setuid-sandbox") options.add_argument("--disable-setuid-sandbox")
options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-dev-shm-usage")
# options.add_argument('--headless')
if self.config.get("proxy", "") != "": if self.config.get("proxy", "") != "":
options.add_argument("--proxy-server=" + self.config["proxy"]) options.add_argument("--proxy-server=" + self.config["proxy"])
return options return options
@ -558,20 +478,15 @@ class Chatbot:
options = self.__get_ChromeOptions() options = self.__get_ChromeOptions()
print("Spawning browser...") print("Spawning browser...")
driver = uc.Chrome( driver = uc.Chrome(
enable_cdp_events=True, enable_cdp_events=True, options=options,
options=options,
driver_executable_path=self.config.get("driver_exec_path"), driver_executable_path=self.config.get("driver_exec_path"),
browser_executable_path=self.config.get("browser_exec_path"), browser_executable_path=self.config.get("browser_exec_path")
) )
print("Browser spawned.") print("Browser spawned.")
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.responseReceivedExtraInfo", "Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
lambda msg: self.detect_cookies(msg),
)
driver.add_cdp_listener( driver.add_cdp_listener(
"Network.requestWillBeSentExtraInfo", "Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
lambda msg: self.detect_user_agent(msg),
)
driver.get("https://chat.openai.com/chat") driver.get("https://chat.openai.com/chat")
while not self.agent_found or not self.cf_cookie_found: while not self.agent_found or not self.cf_cookie_found:
sleep(5) sleep(5)
@ -579,22 +494,18 @@ class Chatbot:
# Close the browser # Close the browser
driver.quit() driver.quit()
del driver del driver
self.refresh_headers( self.refresh_headers(cf_clearance=self.cf_clearance,
cf_clearance=self.cf_clearance, user_agent=self.user_agent user_agent=self.user_agent)
)
def detect_cookies(self, message): def detect_cookies(self, message):
if "params" in message: if 'params' in message:
if "headers" in message["params"]: if 'headers' in message['params']:
if "set-cookie" in message["params"]["headers"]: if 'set-cookie' in message['params']['headers']:
# Use regex to get the cookie for cf_clearance=*; # Use regex to get the cookie for cf_clearance=*;
cf_clearance_cookie = re.search( cf_clearance_cookie = re.search(
"cf_clearance=.*?;", message["params"]["headers"]["set-cookie"] "cf_clearance=.*?;", message['params']['headers']['set-cookie'])
)
session_cookie = re.search( session_cookie = re.search(
"__Secure-next-auth.session-token=.*?;", "__Secure-next-auth.session-token=.*?;", message['params']['headers']['set-cookie'])
message["params"]["headers"]["set-cookie"],
)
if cf_clearance_cookie and not self.cf_cookie_found: if cf_clearance_cookie and not self.cf_cookie_found:
print("Found Cloudflare Cookie!") print("Found Cloudflare Cookie!")
# remove the semicolon and 'cf_clearance=' from the string # remove the semicolon and 'cf_clearance=' from the string
@ -602,55 +513,46 @@ class Chatbot:
self.cf_clearance = raw_cf_cookie.split("=")[1][:-1] self.cf_clearance = raw_cf_cookie.split("=")[1][:-1]
if self.verbose: if self.verbose:
print( print(
self.GREEN self.GREEN+"Cloudflare Cookie: "+self.ENDCOLOR + self.cf_clearance)
+ "Cloudflare Cookie: "
+ self.ENDCOLOR
+ self.cf_clearance
)
self.cf_cookie_found = True self.cf_cookie_found = True
if session_cookie and not self.session_cookie_found: if session_cookie and not self.session_cookie_found:
print("Found Session Token!") print("Found Session Token!")
# remove the semicolon and '__Secure-next-auth.session-token=' from the string # remove the semicolon and '__Secure-next-auth.session-token=' from the string
raw_session_cookie = session_cookie.group(0) raw_session_cookie = session_cookie.group(0)
self.session_token = raw_session_cookie.split("=")[1][:-1] self.session_token = raw_session_cookie.split("=")[
1][:-1]
self.session.cookies.set( self.session.cookies.set(
"__Secure-next-auth.session-token", self.session_token "__Secure-next-auth.session-token", self.session_token)
)
if self.verbose: if self.verbose:
print( print(
self.GREEN self.GREEN+"Session Token: "+self.ENDCOLOR + self.session_token)
+ "Session Token: "
+ self.ENDCOLOR
+ self.session_token
)
self.session_cookie_found = True self.session_cookie_found = True
def detect_user_agent(self, message): def detect_user_agent(self, message):
if "params" in message: if 'params' in message:
if "headers" in message["params"]: if 'headers' in message['params']:
if "user-agent" in message["params"]["headers"]: if 'user-agent' in message['params']['headers']:
# Use regex to get the cookie for cf_clearance=*; # Use regex to get the cookie for cf_clearance=*;
user_agent = message["params"]["headers"]["user-agent"] user_agent = message['params']['headers']['user-agent']
self.user_agent = user_agent self.user_agent = user_agent
self.agent_found = True self.agent_found = True
self.refresh_headers(cf_clearance=self.cf_clearance, user_agent=self.user_agent) self.refresh_headers(cf_clearance=self.cf_clearance,
user_agent=self.user_agent)
def refresh_headers(self, cf_clearance, user_agent): def refresh_headers(self, cf_clearance, user_agent):
del self.session.cookies["cf_clearance"] del self.session.cookies["cf_clearance"]
self.session.headers.clear() self.session.headers.clear()
self.session.cookies.set("cf_clearance", cf_clearance) self.session.cookies.set("cf_clearance", cf_clearance)
self.session.headers.update( self.session.headers.update({
{ "Accept": "text/event-stream",
"Accept": "text/event-stream", "Authorization": "Bearer ",
"Authorization": "Bearer ", "Content-Type": "application/json",
"Content-Type": "application/json", "User-Agent": user_agent,
"User-Agent": user_agent, "X-Openai-Assistant-App-Id": "",
"X-Openai-Assistant-App-Id": "", "Connection": "close",
"Connection": "close", "Accept-Language": "en-US,en;q=0.9",
"Accept-Language": "en-US,en;q=0.9", "Referer": "https://chat.openai.com/chat",
"Referer": "https://chat.openai.com/chat", })
}
)
def rollback_conversation(self, num=1) -> None: def rollback_conversation(self, num=1) -> None:
""" """

216
poetry.lock generated
View File

@ -298,6 +298,7 @@ mypy-extensions = ">=0.4.3"
pathspec = ">=0.9.0" pathspec = ">=0.9.0"
platformdirs = ">=2" platformdirs = ">=2"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
[package.extras] [package.extras]
colorama = ["colorama (>=0.4.3)"] colorama = ["colorama (>=0.4.3)"]
@ -548,63 +549,63 @@ textsearch = ">=0.0.21"
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.0.4" version = "7.0.5"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "coverage-7.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:daf91db39324e9939a9db919ee4fb42a1a23634a056616dae891a030e89f87ba"}, {file = "coverage-7.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a7f23bbaeb2a87f90f607730b45564076d870f1fb07b9318d0c21f36871932b"},
{file = "coverage-7.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55121fe140d7e42cb970999b93cf1c2b24484ce028b32bbd00238bb25c13e34a"}, {file = "coverage-7.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c18d47f314b950dbf24a41787ced1474e01ca816011925976d90a88b27c22b89"},
{file = "coverage-7.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c027fbb83a8c78a6e06a0302ea1799fdb70e5cda9845a5e000545b8e2b47ea39"}, {file = "coverage-7.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef14d75d86f104f03dea66c13188487151760ef25dd6b2dbd541885185f05f40"},
{file = "coverage-7.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf82db5b7f16b51ec32fe0bd2da0805b177c807aa8bfb478c7e6f893418c284"}, {file = "coverage-7.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66e50680e888840c0995f2ad766e726ce71ca682e3c5f4eee82272c7671d38a2"},
{file = "coverage-7.0.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ba5cc54baf3c322c4388de2a43cc95f7809366f0600e743e5aae8ea9d1038b2"}, {file = "coverage-7.0.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9fed35ca8c6e946e877893bbac022e8563b94404a605af1d1e6accc7eb73289"},
{file = "coverage-7.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:260854160083f8275a9d9d49a05ab0ffc7a1f08f2ccccbfaec94a18aae9f407c"}, {file = "coverage-7.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d8d04e755934195bdc1db45ba9e040b8d20d046d04d6d77e71b3b34a8cc002d0"},
{file = "coverage-7.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ea45f0dba5a993e93b158f1a9dcfff2770e3bcabf2b80dbe7aa15dce0bcb3bf3"}, {file = "coverage-7.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e109f1c9a3ece676597831874126555997c48f62bddbcace6ed17be3e372de8"},
{file = "coverage-7.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6abc91f6f8b3cc0ae1034e2c03f38769fba1952ab70d0b26953aa01691265c39"}, {file = "coverage-7.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0a1890fca2962c4f1ad16551d660b46ea77291fba2cc21c024cd527b9d9c8809"},
{file = "coverage-7.0.4-cp310-cp310-win32.whl", hash = "sha256:053cdc47cae08257051d7e934a0de4d095b60eb8a3024fa9f1b2322fa1547137"}, {file = "coverage-7.0.5-cp310-cp310-win32.whl", hash = "sha256:be9fcf32c010da0ba40bf4ee01889d6c737658f4ddff160bd7eb9cac8f094b21"},
{file = "coverage-7.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:1e9e94f2612ee549a4b3ee79cbc61bceed77e69cf38cfa05858bae939a886d16"}, {file = "coverage-7.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:cbfcba14a3225b055a28b3199c3d81cd0ab37d2353ffd7f6fd64844cebab31ad"},
{file = "coverage-7.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5caa9dd91dcc5f054350dc57a02e053d79633907b9ccffff999568d13dcd19f8"}, {file = "coverage-7.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:30b5fec1d34cc932c1bc04017b538ce16bf84e239378b8f75220478645d11fca"},
{file = "coverage-7.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:efc200fa75d9634525b40babc7a16342bd21c101db1a58ef84dc14f4bf6ac0fd"}, {file = "coverage-7.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1caed2367b32cc80a2b7f58a9f46658218a19c6cfe5bc234021966dc3daa01f0"},
{file = "coverage-7.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1791e5f74c5b52f76e83fe9f4bb9571cf76d40ee0c51952ee1e4ee935b7e98b9"}, {file = "coverage-7.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d254666d29540a72d17cc0175746cfb03d5123db33e67d1020e42dae611dc196"},
{file = "coverage-7.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d9201cfa5a98652b9cef36ab202f17fe3ea83f497b4ba2a8ed39399dfb8fcd4"}, {file = "coverage-7.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19245c249aa711d954623d94f23cc94c0fd65865661f20b7781210cb97c471c0"},
{file = "coverage-7.0.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22d8ef6865cb6834cab2b72fff20747a55c714b57b675f7e11c9624fe4f7cb45"}, {file = "coverage-7.0.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b05ed4b35bf6ee790832f68932baf1f00caa32283d66cc4d455c9e9d115aafc"},
{file = "coverage-7.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b84076e3de192fba0f95e279ac017b64c7c6ecd4f09f36f13420f5bed898a9c7"}, {file = "coverage-7.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:29de916ba1099ba2aab76aca101580006adfac5646de9b7c010a0f13867cba45"},
{file = "coverage-7.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:dcfbf8ffc046f20d75fd775a92c378f6fc7b9bded6c6f2ab88b6b9cb5805a184"}, {file = "coverage-7.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e057e74e53db78122a3979f908973e171909a58ac20df05c33998d52e6d35757"},
{file = "coverage-7.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4665a714af31f160403c2e448fb2fef330719d2e04e836b08d60d612707c1041"}, {file = "coverage-7.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:411d4ff9d041be08fdfc02adf62e89c735b9468f6d8f6427f8a14b6bb0a85095"},
{file = "coverage-7.0.4-cp311-cp311-win32.whl", hash = "sha256:2e59aef3fba5758059208c9eff10ae7ded3629e797972746ec33b56844f69411"}, {file = "coverage-7.0.5-cp311-cp311-win32.whl", hash = "sha256:52ab14b9e09ce052237dfe12d6892dd39b0401690856bcfe75d5baba4bfe2831"},
{file = "coverage-7.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:2b854f7985b48122b6fe346631e86d67b63293f8255cb59a93d79e3d9f1574e3"}, {file = "coverage-7.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:1f66862d3a41674ebd8d1a7b6f5387fe5ce353f8719040a986551a545d7d83ea"},
{file = "coverage-7.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e44b60b0b49aa85d548d392a2dca2c6a581cd4084e72e9e16bd58bd86ec20816"}, {file = "coverage-7.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b69522b168a6b64edf0c33ba53eac491c0a8f5cc94fa4337f9c6f4c8f2f5296c"},
{file = "coverage-7.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2904d7a0388911c61e7e3beefe48c29dfccaba938fc1158f63190101a21e04c2"}, {file = "coverage-7.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436e103950d05b7d7f55e39beeb4d5be298ca3e119e0589c0227e6d0b01ee8c7"},
{file = "coverage-7.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc74b64bfa89e2f862ea45dd6ac1def371d7cc883b76680d20bdd61a6f3daa20"}, {file = "coverage-7.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c56bec53d6e3154eaff6ea941226e7bd7cc0d99f9b3756c2520fc7a94e6d96"},
{file = "coverage-7.0.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06046f54e719da21c79f98ecc0962581d1aee0b3798dc6b12b1217da8bf93f4"}, {file = "coverage-7.0.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a38362528a9115a4e276e65eeabf67dcfaf57698e17ae388599568a78dcb029"},
{file = "coverage-7.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bc9c77004970a364a1e5454cf7cb884e4277592b959c287689b2a0fd027ef552"}, {file = "coverage-7.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f67472c09a0c7486e27f3275f617c964d25e35727af952869dd496b9b5b7f6a3"},
{file = "coverage-7.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0815a09b32384e8ff00a5939ec9cd10efce8742347e019c2daca1a32f5ac2aae"}, {file = "coverage-7.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:220e3fa77d14c8a507b2d951e463b57a1f7810a6443a26f9b7591ef39047b1b2"},
{file = "coverage-7.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a78a80d131c067d67d8a6f9bd3d3f7ea7eac82c1c7259f97d7ab73f723da9d55"}, {file = "coverage-7.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ecb0f73954892f98611e183f50acdc9e21a4653f294dfbe079da73c6378a6f47"},
{file = "coverage-7.0.4-cp37-cp37m-win32.whl", hash = "sha256:2b5936b624fbe711ed02dfd86edd678822e5ee68da02b6d231e5c01090b64590"}, {file = "coverage-7.0.5-cp37-cp37m-win32.whl", hash = "sha256:d8f3e2e0a1d6777e58e834fd5a04657f66affa615dae61dd67c35d1568c38882"},
{file = "coverage-7.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a63922765ee49d5b4c32afb2cd5516812c8665f3b78e64a0dd005bdfabf991b1"}, {file = "coverage-7.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9e662e6fc4f513b79da5d10a23edd2b87685815b337b1a30cd11307a6679148d"},
{file = "coverage-7.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d68f2f7bddb3acdd3b36ef7f334b9d14f30b93e094f808fbbd8d288b8f9e2f9b"}, {file = "coverage-7.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:790e4433962c9f454e213b21b0fd4b42310ade9c077e8edcb5113db0818450cb"},
{file = "coverage-7.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dafdba3b2b9010abab08cb8c0dc6549bfca6e1630fe14d47b01dca00d39e694"}, {file = "coverage-7.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49640bda9bda35b057b0e65b7c43ba706fa2335c9a9896652aebe0fa399e80e6"},
{file = "coverage-7.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0322354757b47640535daabd2d56384ff3cad2896248fc84d328c5fad4922d5c"}, {file = "coverage-7.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d66187792bfe56f8c18ba986a0e4ae44856b1c645336bd2c776e3386da91e1dd"},
{file = "coverage-7.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e8267466662aff93d66fa72b9591d02122dfc8a729b0a43dd70e0fb07ed9b37"}, {file = "coverage-7.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:276f4cd0001cd83b00817c8db76730938b1ee40f4993b6a905f40a7278103b3a"},
{file = "coverage-7.0.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f684d88eb4924ed0630cf488fd5606e334c6835594bb5fe36b50a509b10383ed"}, {file = "coverage-7.0.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95304068686545aa368b35dfda1cdfbbdbe2f6fe43de4a2e9baa8ebd71be46e2"},
{file = "coverage-7.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:70c294bb15ba576fb96b580db35895bf03749d683df044212b74e938a7f6821f"}, {file = "coverage-7.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:17e01dd8666c445025c29684d4aabf5a90dc6ef1ab25328aa52bedaa95b65ad7"},
{file = "coverage-7.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:34c0457e1ba450ae8b22dc8ea2fd36ada1010af61291e4c96963cd9d9633366f"}, {file = "coverage-7.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea76dbcad0b7b0deb265d8c36e0801abcddf6cc1395940a24e3595288b405ca0"},
{file = "coverage-7.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b75aff2c35ceaa299691e772f7bf7c8aeab25f46acea2be3dd04cccb914a9860"}, {file = "coverage-7.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:50a6adc2be8edd7ee67d1abc3cd20678987c7b9d79cd265de55941e3d0d56499"},
{file = "coverage-7.0.4-cp38-cp38-win32.whl", hash = "sha256:6c5554d55668381e131577f20e8f620d4882b04ad558f7e7f3f1f55b3124c379"}, {file = "coverage-7.0.5-cp38-cp38-win32.whl", hash = "sha256:e4ce984133b888cc3a46867c8b4372c7dee9cee300335e2925e197bcd45b9e16"},
{file = "coverage-7.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c82f34fafaf5bc05d222fcf84423d6e156432ca35ca78672d4affd0c09c6ef6c"}, {file = "coverage-7.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:4a950f83fd3f9bca23b77442f3a2b2ea4ac900944d8af9993743774c4fdc57af"},
{file = "coverage-7.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8dfb5fed540f77e814bf4ec79619c241af6b4578fa1093c5e3389bbb7beab3f"}, {file = "coverage-7.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c2155943896ac78b9b0fd910fb381186d0c345911f5333ee46ac44c8f0e43ab"},
{file = "coverage-7.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee32a080bab779b71c4d09a3eb5254bfca43ee88828a683dab27dfe8f582516e"}, {file = "coverage-7.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:54f7e9705e14b2c9f6abdeb127c390f679f6dbe64ba732788d3015f7f76ef637"},
{file = "coverage-7.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dfbee0bf0d633be3a2ab068f5a5731a70adf147d0ba17d9f9932b46c7c5782b"}, {file = "coverage-7.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee30375b409d9a7ea0f30c50645d436b6f5dfee254edffd27e45a980ad2c7f4"},
{file = "coverage-7.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32dc010713455ac0fe2fddb0e48aa43875cc7eb7b09768df10bad8ce45f9c430"}, {file = "coverage-7.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b78729038abea6a5df0d2708dce21e82073463b2d79d10884d7d591e0f385ded"},
{file = "coverage-7.0.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cb88a3019ad042eaa69fc7639ef077793fedbf313e89207aa82fefe92c97ebd"}, {file = "coverage-7.0.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13250b1f0bd023e0c9f11838bdeb60214dd5b6aaf8e8d2f110c7e232a1bff83b"},
{file = "coverage-7.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:73bc6114aab7753ca784f87bcd3b7613bc797aa255b5bca45e5654070ae9acfb"}, {file = "coverage-7.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c407b1950b2d2ffa091f4e225ca19a66a9bd81222f27c56bd12658fc5ca1209"},
{file = "coverage-7.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92f135d370fcd7a6fb9659fa2eb716dd2ca364719cbb1756f74d90a221bca1a7"}, {file = "coverage-7.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c76a3075e96b9c9ff00df8b5f7f560f5634dffd1658bafb79eb2682867e94f78"},
{file = "coverage-7.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f3d485e6ec6e09857bf2115ece572d666b7c498377d4c70e66bb06c63ed177c2"}, {file = "coverage-7.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f26648e1b3b03b6022b48a9b910d0ae209e2d51f50441db5dce5b530fad6d9b1"},
{file = "coverage-7.0.4-cp39-cp39-win32.whl", hash = "sha256:c58921fcd9914b56444292e7546fe183d079db99528142c809549ddeaeacd8e9"}, {file = "coverage-7.0.5-cp39-cp39-win32.whl", hash = "sha256:ba3027deb7abf02859aca49c865ece538aee56dcb4871b4cced23ba4d5088904"},
{file = "coverage-7.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:f092d9f2ddaa30235d33335fbdb61eb8f3657af519ef5f9dd6bdae65272def11"}, {file = "coverage-7.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:949844af60ee96a376aac1ded2a27e134b8c8d35cc006a52903fc06c24a3296f"},
{file = "coverage-7.0.4-pp37.pp38.pp39-none-any.whl", hash = "sha256:cb8cfa3bf3a9f18211279458917fef5edeb5e1fdebe2ea8b11969ec2ebe48884"}, {file = "coverage-7.0.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:b9727ac4f5cf2cbf87880a63870b5b9730a8ae3a4a360241a0fdaa2f71240ff0"},
{file = "coverage-7.0.4.tar.gz", hash = "sha256:f6c4ad409a0caf7e2e12e203348b1a9b19c514e7d078520973147bf2d3dcbc6f"}, {file = "coverage-7.0.5.tar.gz", hash = "sha256:051afcbd6d2ac39298d62d340f94dbb6a1f31de06dfaf6fcef7b759dd3860c45"},
] ]
[package.dependencies] [package.dependencies]
@ -1331,6 +1332,9 @@ files = [
{file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"},
] ]
[package.dependencies]
importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
[package.extras] [package.extras]
testing = ["coverage", "pyyaml"] testing = ["coverage", "pyyaml"]
@ -1424,6 +1428,7 @@ files = [
click = ">=7.0" click = ">=7.0"
colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""}
ghp-import = ">=1.0" ghp-import = ">=1.0"
importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""}
jinja2 = ">=2.11.1" jinja2 = ">=2.11.1"
markdown = ">=3.2.1,<3.4" markdown = ">=3.2.1,<3.4"
mergedeep = ">=1.3.4" mergedeep = ">=1.3.4"
@ -1794,13 +1799,13 @@ wheel = "*"
[[package]] [[package]]
name = "openai" name = "openai"
version = "0.26.0" version = "0.26.1"
description = "Python client library for the OpenAI API" description = "Python client library for the OpenAI API"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7.1" python-versions = ">=3.7.1"
files = [ files = [
{file = "openai-0.26.0.tar.gz", hash = "sha256:e5e8ef9a232be844ae9b2b443389ef4189ce56af70bfe4bee77fbaba4bbd504b"}, {file = "openai-0.26.1.tar.gz", hash = "sha256:85cbe75e0646ab38a0e4b4184237c69b3870721e3c1232341289966bccd98522"},
] ]
[package.dependencies] [package.dependencies]
@ -1883,6 +1888,7 @@ files = [
[package.dependencies] [package.dependencies]
numpy = [ numpy = [
{version = ">=1.20.3", markers = "python_version < \"3.10\""},
{version = ">=1.21.0", markers = "python_version >= \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""},
{version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""},
] ]
@ -2150,50 +2156,42 @@ files = [
[[package]] [[package]]
name = "pyahocorasick" name = "pyahocorasick"
version = "1.4.4" version = "2.0.0"
description = "pyahocorasick is a fast and memory efficient library for exact or approximate multi-pattern string search. With the \"ahocorasick.Automaton\" class, you can find multiple key string occurrences at once in some input text. You can use it as a plain dict-like Trie or convert a Trie to an automaton for efficient Aho-Corasick search. And pickle to disk for easy reuse of large automatons. Implemented in C and tested on Python 3.6+. Works on Linux, macOS and Windows. BSD-3-Cause license." description = "pyahocorasick is a fast and memory efficient library for exact or approximate multi-pattern string search. With the ``ahocorasick.Automaton`` class, you can find multiple key string occurrences at once in some input text. You can use it as a plain dict-like Trie or convert a Trie to an automaton for efficient Aho-Corasick search. And pickle to disk for easy reuse of large automatons. Implemented in C and tested on Python 3.6+. Works on Linux, macOS and Windows. BSD-3-Cause license."
category = "main" category = "main"
optional = false optional = false
python-versions = "*" python-versions = ">=3.6"
files = [ files = [
{file = "pyahocorasick-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d46bbb579205a73adee0a8ec73667e6fb5b4b92f9d837f8a9eedb69c2f5a252"}, {file = "pyahocorasick-2.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e20e58e37ed21ce1007c3753ce462f878b7dc68ae5ff693832fdc390d6537aff"},
{file = "pyahocorasick-1.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dfa16ea7ad3297f925964d6fb5553cb6c365b224c6dd749cf0e6cdf91fc2212"}, {file = "pyahocorasick-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04f209fb96b824474185e42a8cc099fd0580d504049359b5296632bbe404dd7d"},
{file = "pyahocorasick-1.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:737d331377936fb229529e830d9a654623d7714e8823bfa49433ae7158f0d01c"}, {file = "pyahocorasick-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd731fbe632edd32c1e4fdf16dd85ceba9bf3bf9793ff70c573d20156e812a29"},
{file = "pyahocorasick-1.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8fa7618f1fef1c25f4f375a4c2c7c24ba3aa300eff48c732c0035f2f9750b29b"}, {file = "pyahocorasick-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f4b43156b200df99b197d856778f94b489a559a65b7948ebdea67f91e09b20f"},
{file = "pyahocorasick-1.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e3cdeda23a1b2530b787440b0d22ba8f10a3e424b1c53d00ed963d68941fcbb7"}, {file = "pyahocorasick-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4086ba7bb0ab5060661543f9503faac1e4648468c20aa05a986d5af4ed1a423b"},
{file = "pyahocorasick-1.4.4-cp310-cp310-win32.whl", hash = "sha256:0bc164eeebac0bfee721aef74843a566247fe85ea05bd30a51ede91a9786156c"}, {file = "pyahocorasick-2.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a322cd6c0554caca957cbdf60c3a52b7e57c8e9fb2ac65e6a0f27e86b7e628b"},
{file = "pyahocorasick-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:35d45492ebd1248f15f8e7500114a8156de63d45c9e6a675ab53b717bfb94bd2"}, {file = "pyahocorasick-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4058b0c35175bedd0d097369d7ef752d03d1e5731d1fda439a7644d90fd4089a"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7cf4d08e10ab7ad136654b237a0b8f1df982df2c5a6f77ef90316731797855db"}, {file = "pyahocorasick-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:644a2bc91aaef019242a9530bbd832e31a2388deb2d54587d238cbace13898c4"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f842c8f37d360f34a06c31f19d1b42e6404b48b49a8dffbed2ec6089ce78cca7"}, {file = "pyahocorasick-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f455e517ddef82fc6891d0ffb82f60070ccc13c425d431b82082e5bdd226ac1f"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf96ecf2ae36e9aad4693e48457a7b97dc3b4cd793275c85924850aafa5b5c38"}, {file = "pyahocorasick-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3b7059515bb2f6baed72ce20b30ff877a1f5b15acb4590e2af5db9fb2bb8314"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:50d88355ac8ef495a582615d639bb80712505d2d8cdadfb93b9123063a3ae23a"}, {file = "pyahocorasick-2.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8f3d68ad21aa63dae116d76c98f160454c199501c592e1cf45d013074ecf79f8"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:04d73bec7d1289378f5948f7f1d68b94c1b4d2a29d7e26ac9085ad403cc4e739"}, {file = "pyahocorasick-2.0.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a44ab4e11a2c3f292506f2b3d5afefa19d01a3172d6209f4eb2827802a7c3630"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-win32.whl", hash = "sha256:e2fe9dc5114c0778234a96ba11807681ccf38fe92bdf2d70d69e701533c51cab"}, {file = "pyahocorasick-2.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:675d0f47b1369748ce8c3b746dba0496022523547aa80f330b45d7e7cf446f5f"},
{file = "pyahocorasick-1.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:e6eee473787ca1dc49b4f94a62b5456251f6976141da60ea0e006507eb0f11b8"}, {file = "pyahocorasick-2.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67c53f8709611754013541fa781e2dc2aa4653a3d472c8e4789ffa94d9482db3"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:12aabdadc3354da6d846186629c80e52fe9b021bdc01e5d5718ca197441e121f"}, {file = "pyahocorasick-2.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fa1ef232f8e816b7fe637e2f60ebc74c231e50b0315c88c841e8fd16ceb31592"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46bc7b8ec0e0cee499c5066684397ac93ed8c2ca4529d396ceda775ce05a445"}, {file = "pyahocorasick-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c706c28423816611cc683ad4082d59619a6bb2dbdff3a61d62d7f8b9d353529a"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67bac0152c08d8cf40b738e011c36d8fab99f0610f5e709eb4929dd8be2a781d"}, {file = "pyahocorasick-2.0.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:67f2f85d78290c7de0c770e6c28d8868859950088781440485cffbfeed4c1f8d"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3b20cc27c03c84f7a5d305012f302d0e7b3faa43ab02da665bb11b60135a1dd3"}, {file = "pyahocorasick-2.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e0631784addce1aabe2bd4696b7b557b71b937b24ffe28a56877baf6c35c86b"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e3d7f2c7a0442540f373d0bf13d19d5d213136e217d050010da705afd09c3a00"}, {file = "pyahocorasick-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:11adffb8ce4015e36f766afc77bf0c121af052f437049e2f87e10f1bcac43d25"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:1ab503f0bff5537ef3da37681cfd52a3f964553f69eef561bd157b70b4aedf84"}, {file = "pyahocorasick-2.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9645f4b8f42b27adad6839f77baf3d48d2db50709a72fc35ce74017038aa5545"},
{file = "pyahocorasick-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ab84c9425eb245c1baa2f91218c977561e01b700773ee232389222458a32316e"}, {file = "pyahocorasick-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd7adbd4a2088a74e8e78995a8b654c0ead0eb4a47e871c231c502e8c2deaa65"},
{file = "pyahocorasick-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df422bf5c50115c58cdb972e9086d99bdd34367c56ba8827a939c8cc973f17d8"}, {file = "pyahocorasick-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:11feb62defff120415a54fab7ae47e27453014614b5fcd732ce93c247c9ab770"},
{file = "pyahocorasick-1.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cf21893b6ba3b47637f007c1e355c45726b98cd9cf473ea6dc706c47332646"}, {file = "pyahocorasick-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5081c010c64117965b6bb40e19674bf08f71dea2ddde51795591e427ac261325"},
{file = "pyahocorasick-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bee494e54939b737e4e44a04cbdbcfdf9b62c8bd762c05d435f4a7883dae8a94"}, {file = "pyahocorasick-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb1414ec05e134aca5fd037132de87ea28878573516f44772e90be407882b908"},
{file = "pyahocorasick-1.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e61994166562e8460115aa5a57fb0aafa852a173f4207a1a1381ba4322adf174"}, {file = "pyahocorasick-2.0.0.tar.gz", hash = "sha256:2985cac6d99c0e9165617fe154b4db0b50c4c2819791c2ad5f0aac0c6a6e58c5"},
{file = "pyahocorasick-1.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fea989f2802eae1aacf26b817e4d532fe9f42434b49ddbff38b412bdeb763ac"},
{file = "pyahocorasick-1.4.4-cp38-cp38-win32.whl", hash = "sha256:31108e1cdf055acb9d0ba5e302926bf4e904db61dfbaa08c4d40284802950414"},
{file = "pyahocorasick-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:4f37a464dbf4f091560a02e135f917259fde6c0a43f6cdf5558480a102bc1843"},
{file = "pyahocorasick-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c13190af4dd382c915ca37f173a407736be4dc1912d834bbc6555a79a2e6c9e2"},
{file = "pyahocorasick-1.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1b7ba6d9c717bb6d7310ab8185f739ff416b8c9323d8adf7b5bbbf48e2e775"},
{file = "pyahocorasick-1.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38172bfa186da136cadc7438946d0d6d4fc1d64f62cad4d1a3038c20b37d5182"},
{file = "pyahocorasick-1.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:94894f5794b9e62a4c7b47a4fd3dc85bae952fe2b220396a627fae74b3eb7ad0"},
{file = "pyahocorasick-1.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:89085980232cc9cd2da2466a8a6232b0e1ff196ef275b2ed4e866941b35bf775"},
{file = "pyahocorasick-1.4.4-cp39-cp39-win32.whl", hash = "sha256:ef24ec2b11a09e0aba1f2a9c47f3c07444771a8b8def672713f79901509ed6b7"},
{file = "pyahocorasick-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:062c5ac842e3fe51f231ada754acb1e5ad986cd28a2181c9a22b21268e22f8c7"},
{file = "pyahocorasick-1.4.4.tar.gz", hash = "sha256:32545cad135660ceef556f1d987aee3206e00096735405d7a8de84eb0a15bb27"},
] ]
[package.extras]
testing = ["pytest", "setuptools", "twine", "wheel"]
[[package]] [[package]]
name = "pyarrow" name = "pyarrow"
version = "10.0.1" version = "10.0.1"
@ -2299,14 +2297,14 @@ email = ["email-validator (>=1.0.3)"]
[[package]] [[package]]
name = "pydocstyle" name = "pydocstyle"
version = "6.2.3" version = "6.3.0"
description = "Python docstring style checker" description = "Python docstring style checker"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "pydocstyle-6.2.3-py3-none-any.whl", hash = "sha256:a04ed1e6fe0be0970eddbb1681a7ab59b11eb92729fdb4b9b24f0eb11a25629e"}, {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"},
{file = "pydocstyle-6.2.3.tar.gz", hash = "sha256:d867acad25e48471f2ad8a40ef9813125e954ad675202245ca836cb6e28b2297"}, {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"},
] ]
[package.dependencies] [package.dependencies]
@ -2354,6 +2352,7 @@ mccabe = ">=0.6,<0.8"
platformdirs = ">=2.2.0" platformdirs = ">=2.2.0"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
tomlkit = ">=0.10.1" tomlkit = ">=0.10.1"
typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
[package.extras] [package.extras]
spelling = ["pyenchant (>=3.2,<4.0)"] spelling = ["pyenchant (>=3.2,<4.0)"]
@ -2389,14 +2388,14 @@ files = [
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "7.2.0" version = "7.2.1"
description = "pytest: simple powerful testing with Python" description = "pytest: simple powerful testing with Python"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"},
{file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"},
] ]
[package.dependencies] [package.dependencies]
@ -2494,14 +2493,14 @@ cli = ["click (>=5.0)"]
[[package]] [[package]]
name = "pytz" name = "pytz"
version = "2022.7" version = "2022.7.1"
description = "World timezone definitions, modern and historical" description = "World timezone definitions, modern and historical"
category = "main" category = "main"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = [
{file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"},
{file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"},
] ]
[[package]] [[package]]
@ -2745,18 +2744,17 @@ api = ["flask"]
[[package]] [[package]]
name = "rich" name = "rich"
version = "10.16.2" version = "13.1.0"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6.2,<4.0.0" python-versions = ">=3.7.0"
files = [ files = [
{file = "rich-10.16.2-py3-none-any.whl", hash = "sha256:c59d73bd804c90f747c8d7b1d023b88f2a9ac2454224a4aeaf959b21eeb42d03"}, {file = "rich-13.1.0-py3-none-any.whl", hash = "sha256:f846bff22a43e8508aebf3f0f2410ce1c6f4cde429098bd58d91fde038c57299"},
{file = "rich-10.16.2.tar.gz", hash = "sha256:720974689960e06c2efdb54327f8bf0cdbdf4eae4ad73b6c94213cad405c371b"}, {file = "rich-13.1.0.tar.gz", hash = "sha256:81c73a30b144bbcdedc13f4ea0b6ffd7fdc3b0d3cc259a9402309c8e4aee1964"},
] ]
[package.dependencies] [package.dependencies]
colorama = ">=0.4.0,<0.5.0"
commonmark = ">=0.9.0,<0.10.0" commonmark = ">=0.9.0,<0.10.0"
pygments = ">=2.6.0,<3.0.0" pygments = ">=2.6.0,<3.0.0"
@ -4244,5 +4242,5 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.10" python-versions = "^3.9"
content-hash = "1df84c766da2dc5f82a0b58b6e7749131d09312bf750fff149bcb519f393af9e" content-hash = "5aeb0b1e22a4d0f5a7fe7c72dd0ef63f7bf7b7395a11f46503cf6340d0d34d7a"

View File

@ -31,9 +31,9 @@ classifiers = [
"internet-ml" = "internet_ml.__main__:app" "internet-ml" = "internet_ml.__main__:app"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.10" python = "^3.9"
typer = {extras = ["all"], version = "^0.4.0"} typer = {extras = ["all"], version = "^0.4.0"}
rich = "^10.14.0" rich = ">=10.14,<14.0"
tokenizers = "^0.13.2" tokenizers = "^0.13.2"
pandas = "^1.5.2" pandas = "^1.5.2"
numpy = "^1.24.0" numpy = "^1.24.0"

View File

@ -1,8 +0,0 @@
#!/bin/sh
git add .
git commit -m 'update: look at todo'
git add .
git commit -m 'update: look at todo'
git push origin master
git push github master