From c63b50292ab13efe70881e2e59b475a9414ce598 Mon Sep 17 00:00:00 2001 From: Rogerio Gonzalez Date: Wed, 24 Apr 2024 18:01:48 -0300 Subject: [PATCH 1/2] fixing updates and html crwaler --- go.mod | 26 ++++++++++++++++++-------- main.go | 2 +- server.py | 7 ++++--- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 672c8a1b..3a6ddb52 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,26 @@ module example.com/m -go 1.19 +go 1.21 + +toolchain go1.22.2 + +require ( + github.com/mattn/go-sqlite3 v1.14.22 + github.com/mdp/qrterminal/v3 v3.0.0 + go.mau.fi/whatsmeow v0.0.0-20240327124018-350073db195c + google.golang.org/protobuf v1.33.0 +) require ( filippo.io/edwards25519 v1.0.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect - github.com/mdp/qrterminal v1.0.1 // indirect - github.com/mdp/qrterminal/v3 v3.0.0 // indirect - go.mau.fi/libsignal v0.0.0-20221015105917-d970e7c3c9cf // indirect - go.mau.fi/whatsmeow v0.0.0-20221202110551-e067ee7293b0 // indirect - golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect - google.golang.org/protobuf v1.28.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/rs/zerolog v1.32.0 // indirect + go.mau.fi/libsignal v0.1.0 // indirect + go.mau.fi/util v0.4.1 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/sys v0.18.0 // indirect rsc.io/qr v0.2.0 // indirect ) diff --git a/main.go b/main.go index 560b28e8..1489e765 100644 --- a/main.go +++ b/main.go @@ -58,7 +58,7 @@ func (mycli *MyClient) eventHandler(evt interface{}) { fmt.Println("Response:", response) userJid := types.NewJID(v.Info.Sender.User, types.DefaultUserServer) - mycli.WAClient.SendMessage(context.Background(), userJid, "", response) + mycli.WAClient.SendMessage(context.Background(), userJid, response) } } diff --git a/server.py b/server.py index d93a7d37..1aeb0aa0 100644 --- a/server.py +++ b/server.py @@ -43,13 +43,14 @@ def send_message(message): box.click() box.fill(message) box.press("Enter") - while PAGE.query_selector(".result-streaming") is not None: + time.sleep(1) + while PAGE.query_selector('.self-end.visible') is None: time.sleep(0.1) def get_last_message(): """Get the latest message""" - page_elements = PAGE.query_selector_all(".flex.flex-col.items-center > div") - last_element = page_elements[-2] + page_elements = PAGE.query_selector_all('[data-message-author-role="assistant"]') + last_element = page_elements[len(page_elements) - 1] return last_element.inner_text() @APP.route("/chat", methods=["GET"]) From 752e0005e42cfda4790ed8aaab932cbab0029596 Mon Sep 17 00:00:00 2001 From: Rogerio Gonzalez Date: Fri, 26 Apr 2024 14:22:44 -0300 Subject: [PATCH 2/2] adding multiple chatbot sessions --- go.sum | 53 +++++++++++++++++++++++++--------- main.go | 7 +++-- server.py => server_chatgpt.py | 53 +++++++++++++++++++--------------- 3 files changed, 75 insertions(+), 38 deletions(-) rename server.py => server_chatgpt.py (57%) diff --git a/go.sum b/go.sum index ae3e1665..37f862fc 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,54 @@ filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mdp/qrterminal v1.0.1 h1:07+fzVDlPuBlXS8tB0ktTAyf+Lp1j2+2zK3fBOL5b7c= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mdp/qrterminal v1.0.1/go.mod h1:Z33WhxQe9B6CdW37HaVqcRKzP+kByF3q/qLxOGe12xQ= github.com/mdp/qrterminal/v3 v3.0.0 h1:ywQqLRBXWTktytQNDKFjhAvoGkLVN3J2tAFZ0kMd9xQ= github.com/mdp/qrterminal/v3 v3.0.0/go.mod h1:NJpfAs7OAm77Dy8EkWrtE4aq+cE6McoLXlBqXQEwvE0= -go.mau.fi/libsignal v0.0.0-20221015105917-d970e7c3c9cf h1:mzPxXBgDPHKDHMVV1tIWh7lwCiRpzCsXC0gNRX+K07c= -go.mau.fi/libsignal v0.0.0-20221015105917-d970e7c3c9cf/go.mod h1:XCjaU93vl71YNRPn059jMrK0xRDwVO5gKbxoPxow9mQ= -go.mau.fi/whatsmeow v0.0.0-20221202110551-e067ee7293b0 h1:danzDOlj/KiDi8kNsaHOhwJ7IZdo7V7hXelkZXhJhsc= -go.mau.fi/whatsmeow v0.0.0-20221202110551-e067ee7293b0/go.mod h1:2yweL8nczvtlIxkrvCb0y8xiO13rveX9lJPambwYV/E= -golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= -golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c= +go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I= +go.mau.fi/util v0.4.1 h1:3EC9KxIXo5+h869zDGf5OOZklRd/FjeVnimTwtm3owg= +go.mau.fi/util v0.4.1/go.mod h1:GjkTEBsehYZbSh2LlE6cWEn+6ZIZTGrTMM/5DMNlmFY= +go.mau.fi/whatsmeow v0.0.0-20240327124018-350073db195c h1:a5O4nqmwUWvmC+27RUdefkuy5XzMOEUqR9ji+/BcHZA= +go.mau.fi/whatsmeow v0.0.0-20240327124018-350073db195c/go.mod h1:kNI5foyzqd77d5HaWc1Jico6/rxtZ/UE8nr80hIsbIk= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/main.go b/main.go index 1489e765..3d1a6ef5 100644 --- a/main.go +++ b/main.go @@ -35,14 +35,17 @@ func (mycli *MyClient) eventHandler(evt interface{}) { case *events.Message: newMessage := v.Message msg := newMessage.GetConversation() + userJid := types.NewJID(v.Info.Sender.User, types.DefaultUserServer) + fmt.Println("Message from:", v.Info.Sender.User, "->", msg) if msg == "" { return } + mycli.WAClient.SendChatPresence(userJid, types.ChatPresenceComposing, "") // Make a http request to localhost:5001/chat?q= with the message, and send the response // URL encode the message urlEncoded := url.QueryEscape(msg) - url := "http://localhost:5001/chat?q=" + urlEncoded + url := "http://localhost:5001/chat?user=" + v.Info.Sender.User + "&q=" + urlEncoded // Make the request resp, err := http.Get(url) if err != nil { @@ -57,7 +60,7 @@ func (mycli *MyClient) eventHandler(evt interface{}) { response := &waProto.Message{Conversation: proto.String(string(newMsg))} fmt.Println("Response:", response) - userJid := types.NewJID(v.Info.Sender.User, types.DefaultUserServer) + mycli.WAClient.SendChatPresence(userJid, types.ChatPresencePaused, "") mycli.WAClient.SendMessage(context.Background(), userJid, response) } diff --git a/server.py b/server_chatgpt.py similarity index 57% rename from server.py rename to server_chatgpt.py index 1aeb0aa0..821c8082 100644 --- a/server.py +++ b/server_chatgpt.py @@ -17,11 +17,11 @@ user_data_dir=PROFILE_DIR, headless=False, ) -PAGE = BROWSER.new_page() +USERS = [] +PAGES = [] -def get_input_box(): - """Find the input box by searching for the largest visible one.""" - textareas = PAGE.query_selector_all("textarea") +def get_input_box(user): + textareas = PAGES[USERS.index(user)].query_selector_all("textarea") candidate = None for textarea in textareas: if textarea.is_visible(): @@ -37,40 +37,47 @@ def is_logged_in(): except AttributeError: return False -def send_message(message): - # Send the message - box = get_input_box() +def send_message(user, message): + box = get_input_box(user) box.click() box.fill(message) box.press("Enter") time.sleep(1) - while PAGE.query_selector('.self-end.visible') is None: + while PAGES[USERS.index(user)].query_selector('.self-end.visible') is None: time.sleep(0.1) -def get_last_message(): - """Get the latest message""" - page_elements = PAGE.query_selector_all('[data-message-author-role="assistant"]') +def get_last_message(user): + page_elements = PAGES[USERS.index(user)].query_selector_all('[data-message-author-role="assistant"]') last_element = page_elements[len(page_elements) - 1] return last_element.inner_text() @APP.route("/chat", methods=["GET"]) def chat(): + user = flask.request.args.get("user") + index = USERS.index(user) if user in USERS else -1 + if index == -1: + USERS.append(user) + PAGES.append(BROWSER.new_page()) + PAGES[USERS.index(user)].goto("https://chat.openai.com/") + time.sleep(2) + message = flask.request.args.get("q") print("Sending message: ", message) - send_message(message) - response = get_last_message() + send_message(user, message) + response = get_last_message(user) print("Response: ", response) return response def start_browser(): - PAGE.goto("https://chat.openai.com/") - APP.run(port=PORT, threaded=False) - if not is_logged_in(): - print("Please log in to OpenAI Chat") - print("Press enter when you're done") - input() - else: - print("Logged in") - + PAGE = BROWSER.new_page() + PAGE.goto("https://chat.openai.com/") + APP.run(port=PORT, threaded=False) + if not is_logged_in(): + print("Please log in to OpenAI Chat") + print("Press enter when you're done") + input() + else: + print("Logged in") + if __name__ == "__main__": - start_browser() \ No newline at end of file + start_browser() \ No newline at end of file