|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + _ "embed" |
| 5 | + "fmt" |
| 6 | + "github.com/go-rod/rod" |
| 7 | + "github.com/go-rod/stealth" |
| 8 | + "github.com/google/uuid" |
| 9 | + "github.com/tidwall/gjson" |
| 10 | + "strconv" |
| 11 | + "strings" |
| 12 | + "time" |
| 13 | +) |
| 14 | + |
| 15 | +var page_claude *rod.Page |
| 16 | +var relogin_claude = true |
| 17 | +var channel_claude chan string |
| 18 | + |
| 19 | +func Claude2() { |
| 20 | + channel_claude = make(chan string) |
| 21 | + defer func() { |
| 22 | + if err := recover(); err != nil { |
| 23 | + relogin_claude = true |
| 24 | + } |
| 25 | + }() |
| 26 | + //page_claude = browser.MustPage("https://claude.ai") |
| 27 | + page_claude = stealth.MustPage(browser) |
| 28 | + page_claude.MustNavigate("https://claude.ai/api/organizations").MustWaitLoad() |
| 29 | + org_json := page_claude.MustElementX("//pre").MustText() |
| 30 | + org_uuid := gjson.Get(string(org_json), "0.uuid").String() |
| 31 | + time.Sleep(6 * time.Second) |
| 32 | + |
| 33 | + new_uuid := uuid.New().String() |
| 34 | + new_uuid_url := "https://claude.ai/api/organizations/" + org_uuid + "/chat_conversations" |
| 35 | + create_new_converastion_json := `{"uuid":"` + new_uuid + `","name":""}` |
| 36 | + create_new_converastion_js := ` |
| 37 | + (new_uuid_url, sdata) => { |
| 38 | + var xhr = new XMLHttpRequest(); |
| 39 | + xhr.open("POST", new_uuid_url); |
| 40 | + xhr.setRequestHeader('Content-Type', 'application/json'); |
| 41 | + xhr.setRequestHeader('Referer', 'https://claude.ai/chats'); |
| 42 | + xhr.setRequestHeader('Origin', 'https://claude.ai'); |
| 43 | + xhr.setRequestHeader('TE', 'trailers'); |
| 44 | + xhr.setRequestHeader('DNT', '1'); |
| 45 | + xhr.setRequestHeader('Connection', 'keep-alive'); |
| 46 | + xhr.setRequestHeader('Accept', 'text/event-stream, text/event-stream'); |
| 47 | + xhr.onreadystatechange = function() { |
| 48 | + if (xhr.readyState == XMLHttpRequest.DONE) { |
| 49 | + var res_text = xhr.responseText; |
| 50 | + console.log(res_text); |
| 51 | + } |
| 52 | + } |
| 53 | + console.log(sdata); |
| 54 | + xhr.send(sdata); |
| 55 | + } |
| 56 | + ` |
| 57 | + page_claude.MustEval(create_new_converastion_js, new_uuid_url, create_new_converastion_json).Str() |
| 58 | + // posted new conversation uuid |
| 59 | + time.Sleep(3 * time.Second) // delay to simulate human being |
| 60 | + |
| 61 | + var record_chat_messages string |
| 62 | + var response_chat_messages string |
| 63 | + for i := 1; i <= 20; i++ { |
| 64 | + create_json := page_claude.MustNavigate("https://claude.ai/api/organizations/" + org_uuid + "/chat_conversations/" + new_uuid).MustElementX("//pre").MustText() |
| 65 | + |
| 66 | + message_uuid := gjson.Get(string(create_json), "uuid").String() |
| 67 | + if message_uuid == new_uuid { |
| 68 | + //fmt.Println("create_conversation success...") |
| 69 | + relogin_claude = false |
| 70 | + record_chat_messages = gjson.Get(string(create_json), "chat_messages").String() |
| 71 | + break |
| 72 | + } |
| 73 | + time.Sleep(2 * time.Second) |
| 74 | + } |
| 75 | + |
| 76 | + if relogin_claude == true { |
| 77 | + sprint("✘ Claude") |
| 78 | + //page_claude.MustPDF("./tmp/Claude✘.pdf") |
| 79 | + } |
| 80 | + if relogin_claude == false { |
| 81 | + sprint("✔ Claude") |
| 82 | + for { |
| 83 | + select { |
| 84 | + case question := <-channel_claude: |
| 85 | + question = strings.Replace(question, "\r", "\n", -1) |
| 86 | + question = strings.Replace(question, "\"", "\\\"", -1) |
| 87 | + question = strings.Replace(question, "\n", "\\n", -1) |
| 88 | + question = strings.TrimSuffix(question, "\n") |
| 89 | + // re-activate |
| 90 | + page_claude.MustNavigate("https://claude.ai/api/account/statsig/" + org_uuid).MustWaitLoad() |
| 91 | + record_json := page_claude.MustNavigate("https://claude.ai/api/organizations/" + org_uuid + "/chat_conversations/" + new_uuid).MustElementX("//pre").MustText() |
| 92 | + record_chat_messages = gjson.Get(string(record_json), "chat_messages").String() |
| 93 | + record_count := gjson.Get(string(response_chat_messages), "#").Int() |
| 94 | + page_claude.MustNavigate("https://claude.ai/api/organizations/" + org_uuid).MustWaitLoad() |
| 95 | + time.Sleep(3 * time.Second) // delay to simulate human being |
| 96 | + //question = strings.Replace(question, `"`, `\"`, -1) // escape " in input text when code into json |
| 97 | + |
| 98 | + //d := `{"completion":{"prompt":"` + question + `","timezone":"Asia/Shanghai","model":"claude-2"},"organization_uuid":"` + org_uuid + `","conversation_uuid":"` + new_uuid + `","text":"` + question + `","attachments":[]}` |
| 99 | + d := `{"prompt":"` + question + `","timezone":"Asia/Bangkok","model":"claude-2.1","attachments":[],"files":[]}` |
| 100 | + //fmt.Println(d) |
| 101 | + //js := ` |
| 102 | + // (sdata, new_uuid) => { |
| 103 | + // var xhr = new XMLHttpRequest(); |
| 104 | + // xhr.open("POST", "https://claude.ai/api/append_message"); |
| 105 | + // xhr.setRequestHeader('Content-Type', 'application/json'); |
| 106 | + // xhr.setRequestHeader('Referer', 'https://claude.ai/chat/new_uuid'); |
| 107 | + // xhr.setRequestHeader('Origin', 'https://claude.ai'); |
| 108 | + // xhr.setRequestHeader('TE', 'trailers'); |
| 109 | + // xhr.setRequestHeader('Connection', 'keep-alive'); |
| 110 | + // xhr.setRequestHeader('Accept', 'text/event-stream, text/event-stream'); |
| 111 | + // xhr.onreadystatechange = function() { |
| 112 | + // if (xhr.readyState == XMLHttpRequest.DONE) { |
| 113 | + // var res_text = xhr.responseText; |
| 114 | + // console.log(res_text); |
| 115 | + // } |
| 116 | + // } |
| 117 | + // console.log(sdata); |
| 118 | + // xhr.send(sdata); |
| 119 | + // } |
| 120 | + // ` |
| 121 | + js := ` |
| 122 | + (sdata, org_uuid, new_uuid) => { |
| 123 | + var xhr = new XMLHttpRequest(); |
| 124 | + xhr.open("POST", "https://claude.ai/api/organizations/org_uuid/chat_conversations/new_uuid/completion"); |
| 125 | + xhr.setRequestHeader('Content-Type', 'application/json'); |
| 126 | + xhr.setRequestHeader('Referer', 'https://claude.ai/chat/new_uuid'); |
| 127 | + xhr.setRequestHeader('Origin', 'https://claude.ai'); |
| 128 | + xhr.setRequestHeader('TE', 'trailers'); |
| 129 | + xhr.setRequestHeader('Connection', 'keep-alive'); |
| 130 | + xhr.setRequestHeader('Accept', 'text/event-stream, text/event-stream'); |
| 131 | + xhr.onreadystatechange = function() { |
| 132 | + if (xhr.readyState == XMLHttpRequest.DONE) { |
| 133 | + var res_text = xhr.responseText; |
| 134 | + console.log(res_text); |
| 135 | + } |
| 136 | + } |
| 137 | + console.log(sdata); |
| 138 | + xhr.send(sdata); |
| 139 | + } |
| 140 | + ` |
| 141 | + page_claude.MustEval(js, d, org_uuid, new_uuid).Str() |
| 142 | + fmt.Println("Claude generating...", role) |
| 143 | + if role == ".all" { |
| 144 | + channel_claude <- "click_claude" |
| 145 | + } |
| 146 | + time.Sleep(3 * time.Second) // delay to simulate human being |
| 147 | + |
| 148 | + // wait answer |
| 149 | + var claude_response = false |
| 150 | + var response_json string |
| 151 | + for i := 1; i <= 20; i++ { |
| 152 | + if page_claude.MustNavigate("https://claude.ai/api/organizations/" + org_uuid + "/chat_conversations/" + new_uuid).MustHasX("//pre") { |
| 153 | + response_json = page_claude.MustNavigate("https://claude.ai/api/organizations/" + org_uuid + "/chat_conversations/" + new_uuid).MustElementX("//pre").MustText() |
| 154 | + response_chat_messages = gjson.Get(string(response_json), "chat_messages").String() |
| 155 | + count := gjson.Get(string(response_chat_messages), "#").Int() |
| 156 | + |
| 157 | + if response_chat_messages != record_chat_messages && count == record_count+2 { |
| 158 | + claude_response = true |
| 159 | + record_chat_messages = response_chat_messages |
| 160 | + break |
| 161 | + } |
| 162 | + } |
| 163 | + time.Sleep(3 * time.Second) |
| 164 | + } |
| 165 | + if claude_response == true { |
| 166 | + count := gjson.Get(string(response_chat_messages), "#").Int() |
| 167 | + answer := gjson.Get(string(response_json), "chat_messages.#(index=="+strconv.FormatInt(count-1, 10)+").text").String() |
| 168 | + channel_claude <- answer |
| 169 | + } else { |
| 170 | + channel_claude <- "✘✘ Claude, Please check the internet connection and verify login status." |
| 171 | + relogin_claude = true |
| 172 | + //page_claude.MustPDF("./tmp/Claude✘.pdf") |
| 173 | + } |
| 174 | + } |
| 175 | + } |
| 176 | + } |
| 177 | + |
| 178 | +} |
0 commit comments