Skip to content
This repository has been archived by the owner on Oct 1, 2023. It is now read-only.

Latest commit

 

History

History
196 lines (164 loc) · 6.7 KB

README.md

File metadata and controls

196 lines (164 loc) · 6.7 KB

poe-api-node

A reverse engineered Node.js client for Quora's Poe.

Support: Fetch needed info and write to .env file | send messages to different bot | set up proxies | clear/delete/purge messages | get history messages | get bot info | get next data

I'm still working on this, so it's might not stable. If your meet any problems, please create an issue.

Install

npm install poe-node-api

requirement:

  • node >= 18
  • .env: To store needed params like poe-formkey / cookie / buildId / botId.....

Usage

  1. Get cookie from poe.com: F12 / inspect, Application > Cookies > https://poe.com > p-b

  2. Create .env file in your project root path, and add cookie to .env file

cookie=p-b=xxxxxxxxxxxxxxxxxxxxxxxxxxx
  1. Fetch all needed info
const client = new PoeClient({logLevel: 'debug'});
await client.init()
// If no poe-formkey and buildId in .env file, client will download needed params, next time will not need to fetch these params again until cookie is changed/logout(For now).

How to create a client:

import {PoeClient} from "poe-node-api";

const client = new PoeClient({logLevel: 'debug'});
  • cookie?: string
  • env?: ProcessEnv(Default: process.env). for multi-account use, user can pass envMap to constructor, client will read needed info from that envMap
  • logLevel?: string(Default: 'info'). enable debug console output
  • fetch?: FetchFunction
    • type FetchFunction = typeof fetch
  • retry?: number(Default: 5).
  • retryMsInterval?: number(Default: 2000).
  • proxy?: ProxyInfo

How to init client

await client.init()
  • rewriteToLocalEnvFile: boolean = true. This means that the client will retrieve necessary parameters like buildId / poe-formkey and overwrite them in the local '.env' file.

To prevent conflicts, when using multi-account, you should set rewriteToLocalEnvFile to false

Bot nicknames

botNickName <==> botDisplayName

  • a2 <==> Claude-instant
  • a2_2 <==> Claude+
  • beaver <==> GPT-4
  • capybara <==> Sage
  • nutria <==> Dragonfly
  • chinchilla <==> ChatGPT
  • hutia <==> NeevaAI
  • Your own bot

SendMessage

/**
  * send message to bot
  * @param text user input
  * @param botNickName bot nick name, like capybara(Sage) / a2(Claude-instant) / a2_2(Claude+) etc.
  * @param withChatBreak Add a chat break or not. (Empty context)
  * @param callback When ws on message, will invoke this callback function.
 */
await client.sendMessage(text, botNickName, withChatBreak, (result: string) => {console.log(`${result}`)})

text: string

botNickName: string

withChatBreak: boolean

callback: (result: string) => void

Warning: Too many requests within one minute will result in (free)account being blocked !!!!!

I had sent about 20 messages in one minute, and now it's blocked. Login failed with error message: Something went wrong. Please wait a moment and try again.

So make sure you know what you're doing~

AddChatBreak

const res = await client.addChatBreak(botNickName);
  • botNickName: string

DeleteMessage

const res = await client.deleteMessage(messageIds);
  • messageIds: number[], messageIds to delete

PurgeAllMessage

const res = await client.purgeAllMessage();

Delete all bot messages, equals to click poe.com > Settings > Delete all messages

GetHistory

const history = await client.getHistory(botNickName, count);
  • botNickName: string
  • count?: number, Messages's count to get. (default: 25)

GetBotInfo

const history = await client.getBotByNickName(botNickName, retryCount, retryIntervalMs);
  • botNickName: string
  • retryCount?: number, If fetch bot info failed, will retry.
  • retryIntervalMs?: number, ms time to wait before next fetch. (default: 2000)

GetNextData

const history = await client.getNextData();

Can get poe-formkey / buildId / latest messages(like latest 5 messages) and startCursor(use startCursor to fetch history messages) / availableBots / x-forwarded-for / ......

UpdateAllBotInfo

await client.updateAllBotInfo()

This function will fetch poe-formkey, buildId, latest messages, startCursor and all bots info(chatId / id, this two params will be used to ).

This function will set poe-formkey / cookie / buildId / ${botDisplayName}_chatId and ${botDisplayName}_id to .env file(These parameters are the same as cookies and do not need to be requested every time).

Next time you send a msg to any bot, will not need to fetch bot info again, client will get needed params like buildId from local .env file.

Example

SendMessage

example - sendMessage.ts

Multi-account support

example - sendMessage.ts

SetProxy

example - proxy.ts

History

example - history.ts

FetchAllNeededInfo

example - fetchAllNeededInfo.ts

TODO

  • Add type definition to bots/viewer/nextData
  • Use free SMS/email services to log in?

Notes

  • I'm working on one of my project which can integrate any bot like chatgpt by plugin. But I can't find any poe node api, so I try to write this client. Huge thanks to poe-api(ISC License) and poe(MIT License).
  • .graphql files is merge from two repos above and find a new graphql to purge all message.
  • If you meet any problems, please create an issue.
  • I'm not familiar with ts, feel free give suggestions | create pull request.

Thanks

License

MIT