import { SocketOptions } from "@zippybee/nng"; import { wcf } from "./proto/wcf"; import { type ToPlainType } from "./utils"; import { FileSavableInterface } from "./file-ref"; import { Message } from "./message"; export type UserInfo = ToPlainType; export type Contact = ToPlainType; export type DbTable = ToPlainType; export interface WcferryOptions { port?: number; /** if host is empty, the program will try to load wcferry.exe and *.dll */ host?: string; socketOptions?: SocketOptions; /** the cache dir to hold temp files, defaults to `os.tmpdir()/wcferry` */ cacheDir?: string; recvPyq?: boolean; service?: boolean; wcf_path?: string; debug?: boolean; wechat_dir?: string; } export declare class Wcferry { readonly NotFriend: { fmessage: string; medianote: string; floatbottle: string; filehelper: string; newsapp: string; }; private isMsgReceiving; private msgDispose?; private socket; private readonly msgEventSub; private wechatInitSdk?; private wechatDestroySdk?; private options; private is_stop; constructor(options?: WcferryOptions); private trapOnExit; get connected(): boolean; get msgReceiving(): boolean; private createUrl; /** * 设置是否接受朋友圈消息 */ set recvPyq(pyq: boolean); get recvPyq(): boolean; private get msgListenerCount(); private isRunSdk; private startService; private stopWcf; getLocalIPAddress(): string; start(): void; stop(): void; private sendRequest; /** 是否已经登录 */ isLogin(): boolean; getLoginQrCode(): string; /**获取登录账号wxid */ getSelfWxid(): string; /** 获取登录账号个人信息 */ getUserInfo(): UserInfo; /** 获取完整通讯录 */ getContacts(): Contact[]; /** 通过 wxid 查询微信号昵称等信息 */ getContact(wxid: string): Contact | undefined; /** 获取所有数据库 */ getDbNames(): string[]; /** 获取数据库中所有表 */ getDbTables(db: string): DbTable[]; /** * 执行 SQL 查询,如果数据量大注意分页 * @param db * @param sql */ dbSqlQuery(db: string, sql: string): Record[]; /** * 获取消息类型 * {"47": "石头剪刀布 | 表情图片", "62": "小视频", "43": "视频", "1": "文字", "10002": "撤回消息", "40": "POSSIBLEFRIEND_MSG", "10000": "红包、系统消息", "37": "好友确认", "48": "位置", "42": "名片", "49": "共享实时位置、文件、转账、链接", "3": "图片", "34": "语音", "9999": "SYSNOTICE", "52": "VOIPNOTIFY", "53": "VOIPINVITE", "51": "微信初始化", "50": "VOIPMSG"} */ getMsgTypes(): { code?: number; label?: string; }[]; /** * 刷新朋友圈 * @param id 开始 id,0 为最新页 (string based uint64) * @returns 1 为成功,其他失败 */ refreshPyq(id: string): number; /** 获取群聊列表 */ getChatRooms(): Contact[]; /** * 获取好友列表 * @returns */ getFriends(): Required<{ wxid?: string; code?: string; remark?: string; name?: string; country?: string; province?: string; city?: string; gender?: number; }>[]; /** * 获取群成员 * @param roomid 群的 id * @param times 重试次数 * @returns 群成员列表: {wxid1: 昵称1, wxid2: 昵称2, ...} */ getChatRoomMembers(roomid: string, times?: number): Promise>; /** * 获取群成员昵称 * @param wxid * @param roomid * @returns 群名片 */ getAliasInChatRoom(wxid: string, roomid: string): string | undefined; /** * be careful to SQL injection * @param wxids wxids */ getNickName(...wxids: string[]): Array; /** * 邀请群成员 * @param roomid * @param wxids * @returns int32 1 为成功,其他失败 */ inviteChatroomMembers(roomid: string, wxids: string[]): number; /** * 添加群成员 * @param roomid * @param wxids * @returns int32 1 为成功,其他失败 */ addChatRoomMembers(roomid: string, wxids: string[]): number; /** * 删除群成员 * @param roomid * @param wxids * @returns int32 1 为成功,其他失败 */ delChatRoomMembers(roomid: string, wxids: string[]): number; /** * 撤回消息 * @param msgid (uint64 in string format): 消息 id * @returns int: 1 为成功,其他失败 */ revokeMsg(msgid: string): number; /** * 转发消息。可以转发文本、图片、表情、甚至各种 XML;语音也行,不过效果嘛,自己验证吧。 * @param msgid (uint64 in string format): 消息 id * @param receiver string 消息接收人,wxid 或者 roomid * @returns int: 1 为成功,其他失败 */ forwardMsg(msgid: string, receiver: string): number; /** * 发送文本消息 * @param msg 要发送的消息,换行使用 `\n` (单杠);如果 @ 人的话,需要带上跟 `aters` 里数量相同的 @ * @param receiver 消息接收人,wxid 或者 roomid * @param aters 要 @ 的 wxid,多个用逗号分隔;`@所有人` 只需要 `notify@all` * @returns 0 为成功,其他失败 */ sendTxt(msg: string, receiver: string, aters?: string): number; /** * @param image location of the resource, can be: * - a local path (`C:\\Users` or `/home/user`), * - a link starts with `http(s)://`, * - a buffer (base64 string can be convert to buffer by `Buffer.from(, 'base64')`) * - an object { type: 'Buffer', data: number[] } which can convert to Buffer * - a FileSavableInterface instance * @param receiver 消息接收人,wxid 或者 roomid * @returns 0 为成功,其他失败 */ sendImage(image: string | Buffer | { type: "Buffer"; data: number[]; } | FileSavableInterface, receiver: string): Promise; /** * @param file location of the resource, can be: * - a local path (`C:\\Users` or `/home/user`), * - a link starts with `http(s)://`, * - a buffer (base64 string can be convert to buffer by `Buffer.from(, 'base64')`) * - an object { type: 'Buffer', data: number[] } which can convert to Buffer * - a FileSavableInterface instance * @param receiver 消息接收人,wxid 或者 roomid * @returns 0 为成功,其他失败 */ sendFile(file: string | Buffer | { type: "Buffer"; data: number[]; } | FileSavableInterface, receiver: string): Promise; /** * @deprecated Not supported * 发送XML * @param xml.content xml 内容 * @param xml.path 封面图片路径 * @param receiver xml 类型,如:0x21 为小程序 * @returns 0 为成功,其他失败 */ sendXML(xml: { xml: string; path: string; type: number; }, receiver: string): number; /** * @deprecated Not supported * 发送表情 * @param path 本地表情路径,如:`C:/Projs/WeChatRobot/emo.gif` * @param receiver 消息接收人,wxid 或者 roomid * @returns 0 为成功,其他失败 */ sendEmotion(path: string, receiver: string): number; /** * 发送富文本消息 * 卡片样式: * |-------------------------------------| * |title, 最长两行 * |(长标题, 标题短的话这行没有) * |digest, 最多三行,会占位 |--------| * |digest, 最多三行,会占位 |thumburl| * |digest, 最多三行,会占位 |--------| * |(account logo) name * |-------------------------------------| * @param desc.name 左下显示的名字 * @param desc.account 填公众号 id 可以显示对应的头像(gh_ 开头的) * @param desc.title 标题,最多两行 * @param desc.digest 摘要,三行 * @param desc.url 点击后跳转的链接 * @param desc.thumburl 缩略图的链接 * @param receiver 接收人, wxid 或者 roomid * @returns 0 为成功,其他失败 */ sendRichText(desc: Omit, "receiver">, receiver: string): number; /** * 拍一拍群友 * @param roomid 群 id * @param wxid 要拍的群友的 wxid * @returns 1 为成功,其他失败 */ sendPat(roomid: string, wxid: string): number; /** * 获取语音消息并转成 MP3 * @param msgid 语音消息 id * @param dir MP3 保存目录(目录不存在会出错) * @param times 超时时间(秒) * @returns 成功返回存储路径;空字符串为失败,原因见日志。 */ getAudioMsg(msgid: string, dir: string, times?: number): Promise; /** * 获取 OCR 结果。鸡肋,需要图片能自动下载;通过下载接口下载的图片无法识别。 * @param extra 待识别的图片路径,消息里的 extra * @param times OCR 结果 * @returns */ getOCRResult(extra: string, times?: number): Promise; /** * 下载附件(图片、视频、文件)。这方法别直接调用,下载图片使用 `download_image` * @param msgid 消息中 id * @param thumb 消息中的 thumb * @param extra 消息中的 extra * @returns 0 为成功, 其他失败。 */ downloadAttach(msgid: string, thumb?: string, extra?: string): number; private getMsgAttachments; /** * 解密图片。这方法别直接调用,下载图片使用 `download_image`。 * @param src 加密的图片路径 * @param dir 保存图片的目录 * @returns */ decryptImage(src: string, dir: string): string; /** * 下载图片 * @param msgid 消息中 id * @param dir 存放图片的目录(目录不存在会出错) * @param extra 消息中的 extra, 如果为空,自动通过msgid获取 * @param times 超时时间(秒) * @returns 成功返回存储路径;空字符串为失败,原因见日志。 */ downloadImage(msgid: string, dir: string, extra?: string, thumb?: string, times?: number): Promise; /** * 通过好友申请 * @param v3 加密用户名 (好友申请消息里 v3 开头的字符串) * @param v4 Ticket (好友申请消息里 v4 开头的字符串) * @param scene 申请方式 (好友申请消息里的 scene); 为了兼容旧接口,默认为扫码添加 (30) * @returns 1 为成功,其他失败 */ acceptNewFriend(v3: string, v4: string, scene?: number): number; /** * 接收转账 * @param wxid 转账消息里的发送人 wxid * @param transferid 转账消息里的 transferid * @param transactionid 转账消息里的 transactionid * @returns 1 为成功,其他失败 */ receiveTransfer(wxid: string, transferid: string, transactionid: string): number; /** * @internal 允许接收消息,自动根据on(...)注册的listener调用 * @param pyq * @returns */ private enableMsgReceiving; /** * @internal 停止接收消息,自动根据on(...)注册/注销的listener 调用 * @param force * @returns */ private disableMsgReceiving; private receiveMessage; private messageCallback; private struct_xml_data; /** * 发送xml数据 * @param content xml文件path 或xml字符串 * @returns 1 为成功,其他失败 */ send_xml_message(content: string, wx_id: string): number | void; /** * 注册消息回调监听函数(listener), 通过call返回的函数注销 * 当注册的监听函数数量大于0是自动调用enableMsgReceiving,否则自动调用disableMsgReceiving * 设置wcferry.recvPyq = true/false 来开启关闭接受朋友圈消息 * @param callback 监听函数 * @returns 注销监听函数 */ listening(callback: (msg: Message) => (void | Promise)): () => any; }