diff --git a/.gitignore b/.gitignore
index 47da484..4941e24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,4 +32,7 @@
*.app
CMakePresets.json
.vscode
-out
\ No newline at end of file
+out
+nodejs_client_ts/node_modules
+nodejs_client_ts/msgStore.json
+nodejs_client_ts/dist
diff --git a/nodejs_client_ts/README.md b/nodejs_client_ts/README.md
new file mode 100644
index 0000000..70af81e
--- /dev/null
+++ b/nodejs_client_ts/README.md
@@ -0,0 +1,23 @@
+# TypeScript Client
+
+## 快速开始
+
+1. 启动WebSoket服务用语接收消息
+
+```shell
+npm run ws_server
+```
+
+2. 运行测试demo
+
+```
+npm run start
+```
+
+## 说明
+
+./src/index.ts 包含3.9.5.81支持的所有接口封装
+
+./tcp_server.ts 接收消息的服务端代码
+
+./example/ding-dong-bot.ts SDK使用示例
diff --git a/nodejs_client_ts/example/ding-dong-bot.ts b/nodejs_client_ts/example/ding-dong-bot.ts
new file mode 100644
index 0000000..46ed0ff
--- /dev/null
+++ b/nodejs_client_ts/example/ding-dong-bot.ts
@@ -0,0 +1,59 @@
+import * as wxhelper from '../src/index'
+import net from 'net'
+import {
+ writeMsgStore,
+ readMsgStore
+} from '../src/utils/messageStore'
+
+// 启动一个TCP服务,接收hook消息
+const server = net.createServer((socket: any) => {
+ console.log('New client connected')
+ let messageStore = readMsgStore()
+
+ let data = Buffer.from('')
+
+ socket.on('data', (data: any, chunk: any) => {
+ console.log(`Received data: ${data}`)
+ const dataJson = JSON.parse(data)
+ messageStore = writeMsgStore(messageStore, dataJson)
+ // data = Buffer.concat([data, chunk])
+ // console.log(`Received data: ${data}`)
+ })
+
+ socket.on('end', () => {
+ const decodedData = data.toString('utf8')
+ console.log(`Received data: ${decodedData}`)
+ })
+
+ socket.on('close', () => {
+ console.log('Client disconnected')
+ })
+})
+
+const wsPort = 19099
+
+const main = async () => {
+ // server.listen(wsPort, () => {
+ // console.log(`Server listening on port ${wsPort}`)
+ // })
+ const checkLoginRes = await wxhelper.checkLogin()
+ console.log('登录状态:', checkLoginRes.data)
+ if (checkLoginRes.data.msg !== 'success') {
+ console.log('请先登录')
+ return
+ } else {
+ const port = String(wsPort)
+ const ip = '127.0.0.1'
+ const url = ''
+ const timeout = '3000'
+ const enableHttp = '0'
+ const hookSyncMsgRes = await wxhelper.hookSyncMsg(port, ip, url, timeout, enableHttp)
+ console.log('开启hook:', hookSyncMsgRes.data)
+ }
+ const userInfoRes = await wxhelper.userInfo()
+ console.log('当前账号信息:', userInfoRes.data)
+ const sendTextMsgRes = await wxhelper.sendTextMsg('filehelper', new Date().toLocaleString() + ':你好,我是机器人')
+ console.log('发送文本消息:', sendTextMsgRes.data)
+}
+
+void main()
\ No newline at end of file
diff --git a/nodejs_client_ts/package-lock.json b/nodejs_client_ts/package-lock.json
new file mode 100644
index 0000000..eda4d63
--- /dev/null
+++ b/nodejs_client_ts/package-lock.json
@@ -0,0 +1,307 @@
+{
+ "name": "nodejs_client_ts",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "nodejs_client_ts",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "axios": "^1.6.8"
+ },
+ "devDependencies": {
+ "ts-node": "^10.9.2",
+ "typescript": "^5.4.3"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz",
+ "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
+ "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
+ "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
+ "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/nodejs_client_ts/package.json b/nodejs_client_ts/package.json
new file mode 100644
index 0000000..faccc98
--- /dev/null
+++ b/nodejs_client_ts/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "nodejs_client_ts",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "start": "ts-node ./example/ding-dong-bot.ts",
+ "ws-server": "ts-node ./src/tcp_server.ts",
+ "build": "tsc",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "ts-node": "^10.9.2",
+ "typescript": "^5.4.3"
+ },
+ "dependencies": {
+ "axios": "^1.6.8"
+ }
+}
diff --git a/nodejs_client_ts/src/index.ts b/nodejs_client_ts/src/index.ts
new file mode 100644
index 0000000..88d630d
--- /dev/null
+++ b/nodejs_client_ts/src/index.ts
@@ -0,0 +1,583 @@
+import { get, post } from './utils/mod'
+
+// def checkLogin():
+// url = "127.0.0.1:19088/api/checkLogin"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const checkLogin = () => {
+ return post('/api/checkLogin')
+}
+
+// def userInfo():
+// url = "127.0.0.1:19088/api/userInfo"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const userInfo = () => {
+ return post('/api/userInfo')
+}
+
+// def sendTextMsg():
+// url = "127.0.0.1:19088/api/sendTextMsg"
+// payload = json.dumps({
+// "wxid": "filehelper",
+// "msg": "12www"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const sendTextMsg = (wxid: string, msg: string) => {
+ return post('/api/sendTextMsg', { wxid, msg })
+}
+
+// def sendImagesMsg():
+// url = "127.0.0.1:19088/api/sendImagesMsg"
+// print("modify imagePath")
+// raise RuntimeError("modify imagePath then deleted me")
+// payload = json.dumps({
+// "wxid": "filehelper",
+// "imagePath": "C:\\pic.png"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+
+export const sendImagesMsg = (wxid: string, imagePath: string) => {
+ return post('/api/sendImagesMsg', { wxid, imagePath })
+}
+
+// def sendFileMsg():
+// url = "127.0.0.1:19088/api/sendFileMsg"
+// print("modify filePath")
+// raise RuntimeError("modify filePath then deleted me")
+// payload = json.dumps({
+// "wxid": "filehelper",
+// "filePath": "C:\\test.zip"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+
+export const sendFileMsg = (wxid: string, filePath: string) => {
+ return post('/api/sendFileMsg', { wxid, filePath })
+}
+
+// def hookSyncMsg():
+// url = "127.0.0.1:19088/api/hookSyncMsg"
+// print("modify ip port url ")
+// raise RuntimeError("modify ip port url then deleted me")
+// payload = json.dumps({
+// "port": "19099",
+// "ip": "127.0.0.1",
+// "url": "http://localhost:8080",
+// "timeout": "3000",
+// "enableHttp": "0"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const hookSyncMsg = (port: string, ip: string, url: string, timeout: string, enableHttp: string) => {
+ return post('/api/hookSyncMsg', { port, ip, url, timeout, enableHttp })
+}
+
+
+// def unhookSyncMsg():
+// url = host + "/api/unhookSyncMsg"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const unhookSyncMsg = () => {
+ return post('/api/unhookSyncMsg')
+}
+
+
+// def getContactList():
+// url = host + "/api/getContactList"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getContactList = () => {
+ return post('/api/getContactList')
+}
+
+
+// def getDBInfo():
+// url = host + "/api/getDBInfo"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getDBInfo = () => {
+ return post('/api/getDBInfo')
+}
+
+
+// def execSql():
+// url = host + "/api/execSql"
+// print("modify dbHandle ")
+// raise RuntimeError("modify dbHandle then deleted me")
+// payload = json.dumps({
+// "dbHandle": 1713425147584,
+// "sql": "select * from MSG where localId =100;"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const execSql = (dbHandle: number, sql: string) => {
+ return post('/api/execSql', { dbHandle, sql })
+}
+
+
+// def getChatRoomDetailInfo():
+// url = host + "/api/getChatRoomDetailInfo"
+// print("modify chatRoomId ")
+// raise RuntimeError("modify chatRoomId then deleted me")
+// payload = json.dumps({
+// "chatRoomId": "123333@chatroom"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getChatRoomDetailInfo = (chatRoomId: string) => {
+ return post('/api/getChatRoomDetailInfo', { chatRoomId })
+}
+
+// def addMemberToChatRoom():
+// url = host + "/api/addMemberToChatRoom"
+// print("modify chatRoomId memberIds ")
+// raise RuntimeError("modify chatRoomId memberIds then deleted me")
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom",
+// "memberIds": "wxid_123"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const addMemberToChatRoom = (chatRoomId: string, memberIds: string) => {
+ return post('/api/addMemberToChatRoom', { chatRoomId, memberIds })
+}
+
+
+// def delMemberFromChatRoom():
+// url = host + "/api/delMemberFromChatRoom"
+// print("modify chatRoomId memberIds ")
+// raise RuntimeError("modify chatRoomId memberIds then deleted me")
+// payload = json.dumps({
+// "chatRoomId": "21363231004@chatroom",
+// "memberIds": "wxid_123"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const delMemberFromChatRoom = (chatRoomId: string, memberIds: string) => {
+ return post('/api/delMemberFromChatRoom', { chatRoomId, memberIds })
+}
+
+
+// def modifyNickname():
+// url = host + "/api/modifyNickname"
+// print("modify chatRoomId wxid nickName")
+// raise RuntimeError("modify chatRoomId wxid nickName then deleted me")
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom",
+// "wxid": "wxid_123",
+// "nickName": "test"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const modifyNickname = (chatRoomId: string, wxid: string, nickName: string) => {
+ return post('/api/modifyNickname', { chatRoomId, wxid, nickName })
+}
+
+
+// def getMemberFromChatRoom():
+// print("modify chatRoomId ")
+// raise RuntimeError("modify chatRoomId then deleted me")
+// url = host + "/api/getMemberFromChatRoom"
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getMemberFromChatRoom = (chatRoomId: string) => {
+ return post('/api/getMemberFromChatRoom', { chatRoomId })
+}
+
+
+// def topMsg():
+// print("modify msgId ")
+// raise RuntimeError("modify msgId then deleted me")
+// url = host + "/api/topMsg"
+// payload = json.dumps({
+// "msgId": 1222222
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const topMsg = (msgId: number) => {
+ return post('/api/topMsg', { msgId })
+}
+
+
+// def removeTopMsg():
+// print("modify msgId chatRoomId ")
+// raise RuntimeError("modify msgId chatRoomId then deleted me")
+
+// url = host + "/api/removeTopMsg"
+
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom",
+// "msgId": 123
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const removeTopMsg = (chatRoomId: string, msgId: number) => {
+ return post('/api/removeTopMsg', { chatRoomId, msgId })
+}
+
+
+// def InviteMemberToChatRoom():
+// print("modify memberIds chatRoomId ")
+// raise RuntimeError("modify memberIds chatRoomId then deleted me")
+
+// url = host + "/api/InviteMemberToChatRoom"
+
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom",
+// "memberIds": "wxid_123"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const InviteMemberToChatRoom = (chatRoomId: string, memberIds: string) => {
+ return post('/api/InviteMemberToChatRoom', { chatRoomId, memberIds })
+}
+
+
+// def hookLog():
+// url = host + "/api/hookLog"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const hookLog = () => {
+ return post('/api/hookLog')
+}
+
+
+// def unhookLog():
+// url = host + "/api/unhookLog"
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const unhookLog = () => {
+ return post('/api/unhookLog')
+}
+
+
+// def createChatRoom():
+// print("modify memberIds ")
+// raise RuntimeError("modify memberIds then deleted me")
+// url = host + "/api/createChatRoom"
+
+// payload = json.dumps({
+// "memberIds": "wxid_8yn4k908tdqp22,wxid_oyb662qhop4422"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const createChatRoom = (memberIds: string) => {
+ return post('/api/createChatRoom', { memberIds })
+}
+
+// def quitChatRoom():
+// print("modify chatRoomId ")
+// raise RuntimeError("modify chatRoomId then deleted me")
+// url = host + "/api/quitChatRoom"
+
+// payload = json.dumps({
+// "chatRoomId": "123@chatroom"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const quitChatRoom = (chatRoomId: string) => {
+ return post('/api/quitChatRoom', { chatRoomId })
+}
+
+// def forwardMsg():
+// print("modify msgId ")
+// raise RuntimeError("modify msgId then deleted me")
+// url = host + "/api/forwardMsg"
+
+// payload = json.dumps({
+// "wxid": "filehelper",
+// "msgId": "12331"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const forwardMsg = (wxid: string, msgId: string) => {
+ return post('/api/forwardMsg', { wxid, msgId })
+}
+
+// def getSNSFirstPage():
+// url = host + "/api/getSNSFirstPage"
+
+// payload = {}
+// headers = {}
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getSNSFirstPage = () => {
+ return post('/api/getSNSFirstPage')
+}
+
+// def getSNSNextPage():
+// print("modify snsId ")
+// raise RuntimeError("modify snsId then deleted me")
+// url = host + "/api/getSNSNextPage"
+
+// payload = json.dumps({
+// "snsId": ""
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const getSNSNextPage = (snsId: string) => {
+ return post('/api/getSNSNextPage', { snsId })
+}
+
+// def addFavFromMsg():
+// print("modify msgId ")
+// raise RuntimeError("modify msgId then deleted me")
+// url = host + "/api/addFavFromMsg"
+
+// payload = json.dumps({
+// "msgId": "1222222"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const addFavFromMsg = (msgId: string) => {
+ return post('/api/addFavFromMsg', { msgId })
+}
+
+// def addFavFromImage():
+// print("modify wxid imagePath ")
+// raise RuntimeError("modify wxid imagePath then deleted me")
+// url = host + "/api/addFavFromImage"
+
+// payload = json.dumps({
+// "wxid": "",
+// "imagePath": ""
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const addFavFromImage = (wxid: string, imagePath: string) => {
+ return post('/api/addFavFromImage', { wxid, imagePath })
+}
+
+// def getContactProfile():
+// print("modify wxid ")
+// raise RuntimeError("modify wxid then deleted me")
+// url = host + "/api/getContactProfile"
+
+// payload = json.dumps({
+// "wxid": ""
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+// print(response.text)
+export const getContactProfile = (wxid: string) => {
+ return post('/api/getContactProfile', { wxid })
+}
+
+
+// def sendAtText():
+// print("modify wxids chatRoomId")
+// raise RuntimeError("modify wxids chatRoomId then deleted me")
+// url = host + "/api/sendAtText"
+
+// payload = json.dumps({
+// "wxids": "notify@all",
+// "chatRoomId": "123@chatroom",
+// "msg": "你好啊"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const sendAtText = (wxids: string, chatRoomId: string, msg: string) => {
+ return post('/api/sendAtText', { wxids, chatRoomId, msg })
+}
+
+// def forwardPublicMsg():
+// print("modify param ")
+// raise RuntimeError("modify param then deleted me")
+// url = host + "/api/forwardPublicMsg"
+
+// payload = json.dumps({
+// "appName": "",
+// "userName": "",
+// "title": "",
+// "url": "",
+// "thumbUrl": "",
+// "digest": "",
+// "wxid": "filehelper"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const forwardPublicMsg = (appName: string, userName: string, title: string, url: string, thumbUrl: string, digest: string, wxid: string) => {
+ return post('/api/forwardPublicMsg', { appName, userName, title, url, thumbUrl, digest, wxid })
+}
+
+// def forwardPublicMsgByMsgId():
+// print("modify param ")
+// raise RuntimeError("modify param then deleted me")
+// url = host + "/api/forwardPublicMsgByMsgId"
+
+// payload = json.dumps({
+// "msgId": 123,
+// "wxid": "filehelper"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const forwardPublicMsgByMsgId = (msgId: number, wxid: string) => {
+ return post('/api/forwardPublicMsgByMsgId', { msgId, wxid })
+}
+
+// def downloadAttach():
+// print("modify param ")
+// raise RuntimeError("modify param then deleted me")
+// url = host + "/api/downloadAttach"
+
+// payload = json.dumps({
+// "msgId": 123
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const downloadAttach = (msgId: number) => {
+ return post('/api/downloadAttach', { msgId })
+}
+
+
+// def decodeImage():
+// print("modify param ")
+// raise RuntimeError("modify param then deleted me")
+// url = host + "/api/decodeImage"
+
+// payload = json.dumps({
+// "filePath": "C:\\66664816980131.dat",
+// "storeDir": "C:\\test"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const decodeImage = (filePath: string, storeDir: string) => {
+ return post('/api/decodeImage', { filePath, storeDir })
+}
+
+
+// def getVoiceByMsgId():
+// print("modify param ")
+// raise RuntimeError("modify param then deleted me")
+// url = host + "/api/getVoiceByMsgId"
+
+// payload = json.dumps({
+// "msgId": 7880439644200,
+// "storeDir": "c:\\test"
+// })
+// headers = {
+// 'Content-Type': 'application/json'
+// }
+
+// response = requests.request("POST", url, headers=headers, data=payload)
+
+// print(response.text)
+export const getVoiceByMsgId = (msgId: number, storeDir: string) => {
+ return post('/api/getVoiceByMsgId', { msgId, storeDir })
+}
diff --git a/nodejs_client_ts/src/tcp_server.ts b/nodejs_client_ts/src/tcp_server.ts
new file mode 100644
index 0000000..4c20759
--- /dev/null
+++ b/nodejs_client_ts/src/tcp_server.ts
@@ -0,0 +1,33 @@
+import net from 'net'
+import {
+ readMsgStore,
+ writeMsgStore,
+} from './utils/messageStore'
+export const server = net.createServer((socket:any) => {
+ console.log('New client connected')
+ let messageStore = readMsgStore()
+ let data = Buffer.from('')
+
+ socket.on('data', (data:any, chunk:any) => {
+ console.log(`Received data: ${data}`)
+ const dataJson = JSON.parse(data)
+ messageStore = writeMsgStore(messageStore, dataJson)
+ // data = Buffer.concat([data, chunk])
+ // console.log(`Received data: ${data}`)
+ })
+
+ socket.on('end', () => {
+ const decodedData = data.toString('utf8')
+ console.log(`Received data: ${decodedData}`)
+ })
+
+ socket.on('close', () => {
+ console.log('Client disconnected')
+ })
+})
+
+const port = 19099
+
+server.listen(port, () => {
+ console.log(`Server listening on port ${port}`)
+})
diff --git a/nodejs_client_ts/src/utils/messageStore.ts b/nodejs_client_ts/src/utils/messageStore.ts
new file mode 100644
index 0000000..f8956c6
--- /dev/null
+++ b/nodejs_client_ts/src/utils/messageStore.ts
@@ -0,0 +1,50 @@
+import fs from 'fs'
+
+export const writeMsgStore = (messageStore: { [key: string]: any }, msg: { type: number, content?:any }) => {
+ // 检测根目录下是否有msgStore.json文件,如果没有,则创建一个,内容为{}
+ if (!fs.existsSync('msgStore.json')) {
+ console.log('msgStore.json not exist')
+ fs.writeFileSync('msgStore.json', '{}')
+ }
+ let type = String(msg.type)
+ console.info('ws message hook:', type)
+ // log.info(JSON.stringify(j, undefined, 2))
+
+ if (msg.content) {
+ try {
+ const content = msg.content
+ // 从content中判断是否存在类似6的格式,并从其中取出type的值
+ const m = content.match(/(\d+)<\/type>/)
+ if (m != null) {
+ type = type + '_' + m[1]
+ }
+ } catch (e) {
+ console.error('ws message hook error:', e)
+ }
+ }
+
+ if (type === '10000') {
+ const list10000 = messageStore['10000'] || []
+ list10000.push(msg)
+ messageStore[type] = list10000
+ } else {
+ messageStore[type] = msg
+ }
+
+ // 将that.messageTypeTest保存到文件'/msgStore.json'
+ fs.writeFileSync('msgStore.json', JSON.stringify(messageStore, undefined, 2))
+ return messageStore
+}
+
+export const readMsgStore = () => {
+ // 读取'/msgStore.json'文件
+ // 检测根目录下是否有msgStore.json文件,如果没有,则创建一个,内容为{}
+ if (!fs.existsSync('msgStore.json')) {
+ console.log('msgStore.json not exist')
+ fs.writeFileSync('msgStore.json', '{}')
+ return {}
+ }
+ const data = fs.readFileSync('msgStore.json', 'utf8')
+ const json = JSON.parse(data)
+ return json
+}
diff --git a/nodejs_client_ts/src/utils/mod.ts b/nodejs_client_ts/src/utils/mod.ts
new file mode 100644
index 0000000..0f67a90
--- /dev/null
+++ b/nodejs_client_ts/src/utils/mod.ts
@@ -0,0 +1,63 @@
+// 封装get和post请求
+import axios from 'axios'
+
+// 创建 axios 实例
+const request = axios.create({
+ // API 请求的默认前缀
+ baseURL: 'http://127.0.0.1:19088',
+
+ // 请求超时时间
+ timeout: 120000,
+})
+
+/**
+* 异常拦截处理器
+*
+* @param {*} error
+*/
+const errorHandler = (error: { response?: { status: number, config: any } }) => {
+ // 判断是否是响应错误信息
+ if (error.response) {
+ if (error.response.status === 401) {
+ return request(error.response.config)
+ }
+ }
+ return Promise.reject(error)
+}
+
+/**
+ * GET 请求
+ *
+ * @param {String} url
+ * @param {Object} data
+ * @param {Object} options
+ * @returns {Promise}
+ */
+export const get = (url: string, data = {}, options = {}) => {
+
+ // request.interceptors.response.use((response) => response.data, errorHandler)
+ return request({
+ url,
+ params: data,
+ method: 'get',
+ ...options,
+ })
+}
+
+/**
+ * POST 请求
+ *
+ * @param {String} url
+ * @param {Object} data
+ * @param {Object} options
+ * @returns {Promise}
+ */
+export const post = (url: string, data = {}, options = {}) => {
+ // request.interceptors.response.use((response) => response.data, errorHandler)
+ return request({
+ url,
+ method: 'post',
+ data,
+ ...options,
+ })
+}
\ No newline at end of file
diff --git a/nodejs_client_ts/tsconfig.json b/nodejs_client_ts/tsconfig.json
new file mode 100644
index 0000000..fe84645
--- /dev/null
+++ b/nodejs_client_ts/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "commonjs",
+ "strict": true,
+ "outDir": "./dist",
+ "rootDir": "./",
+ "esModuleInterop": true
+ },
+ "include": [
+ "./src",
+ "./example/ding-dong-bot.ts"
+ ]
+}
diff --git a/python/3.9.5.81/http_client.py b/python/3.9.5.81/http_client.py
index c661baa..e808419 100644
--- a/python/3.9.5.81/http_client.py
+++ b/python/3.9.5.81/http_client.py
@@ -1,9 +1,10 @@
import requests
import json
+host = "http://127.0.0.1:19088"
def checkLogin():
- url = "127.0.0.1:19088/api/checkLogin"
+ url = host + "/api/checkLogin"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -11,7 +12,7 @@ def checkLogin():
def userInfo():
- url = "127.0.0.1:19088/api/userInfo"
+ url = host + "/api/userInfo"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -19,7 +20,7 @@ def userInfo():
def sendTextMsg():
- url = "127.0.0.1:19088/api/sendTextMsg"
+ url = host + "/api/sendTextMsg"
payload = json.dumps({
"wxid": "filehelper",
"msg": "12www"
@@ -32,7 +33,7 @@ def sendTextMsg():
def sendImagesMsg():
- url = "127.0.0.1:19088/api/sendImagesMsg"
+ url = host + "/api/sendImagesMsg"
print("modify imagePath")
raise RuntimeError("modify imagePath then deleted me")
payload = json.dumps({
@@ -49,7 +50,7 @@ def sendImagesMsg():
def sendFileMsg():
- url = "127.0.0.1:19088/api/sendFileMsg"
+ url = host + "/api/sendFileMsg"
print("modify filePath")
raise RuntimeError("modify filePath then deleted me")
payload = json.dumps({
@@ -64,7 +65,7 @@ def sendFileMsg():
def hookSyncMsg():
- url = "127.0.0.1:19088/api/hookSyncMsg"
+ url = host + "/api/hookSyncMsg"
print("modify ip port url ")
raise RuntimeError("modify ip port url then deleted me")
payload = json.dumps({
@@ -82,7 +83,7 @@ def hookSyncMsg():
def unhookSyncMsg():
- url = "127.0.0.1:19088/api/unhookSyncMsg"
+ url = host + "/api/unhookSyncMsg"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -90,7 +91,7 @@ def unhookSyncMsg():
def getContactList():
- url = "127.0.0.1:19088/api/getContactList"
+ url = host + "/api/getContactList"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -98,7 +99,7 @@ def getContactList():
def getDBInfo():
- url = "127.0.0.1:19088/api/getDBInfo"
+ url = host + "/api/getDBInfo"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -106,7 +107,7 @@ def getDBInfo():
def execSql():
- url = "127.0.0.1:19088/api/execSql"
+ url = host + "/api/execSql"
print("modify dbHandle ")
raise RuntimeError("modify dbHandle then deleted me")
payload = json.dumps({
@@ -121,7 +122,7 @@ def execSql():
def getChatRoomDetailInfo():
- url = "127.0.0.1:19088/api/getChatRoomDetailInfo"
+ url = host + "/api/getChatRoomDetailInfo"
print("modify chatRoomId ")
raise RuntimeError("modify chatRoomId then deleted me")
payload = json.dumps({
@@ -135,7 +136,7 @@ def getChatRoomDetailInfo():
def addMemberToChatRoom():
- url = "127.0.0.1:19088/api/addMemberToChatRoom"
+ url = host + "/api/addMemberToChatRoom"
print("modify chatRoomId memberIds ")
raise RuntimeError("modify chatRoomId memberIds then deleted me")
payload = json.dumps({
@@ -152,7 +153,7 @@ def addMemberToChatRoom():
def delMemberFromChatRoom():
- url = "127.0.0.1:19088/api/delMemberFromChatRoom"
+ url = host + "/api/delMemberFromChatRoom"
print("modify chatRoomId memberIds ")
raise RuntimeError("modify chatRoomId memberIds then deleted me")
payload = json.dumps({
@@ -167,7 +168,7 @@ def delMemberFromChatRoom():
def modifyNickname():
- url = "127.0.0.1:19088/api/modifyNickname"
+ url = host + "/api/modifyNickname"
print("modify chatRoomId wxid nickName")
raise RuntimeError("modify chatRoomId wxid nickName then deleted me")
payload = json.dumps({
@@ -185,7 +186,7 @@ def modifyNickname():
def getMemberFromChatRoom():
print("modify chatRoomId ")
raise RuntimeError("modify chatRoomId then deleted me")
- url = "127.0.0.1:19088/api/getMemberFromChatRoom"
+ url = host + "/api/getMemberFromChatRoom"
payload = json.dumps({
"chatRoomId": "123@chatroom"
})
@@ -199,7 +200,7 @@ def getMemberFromChatRoom():
def topMsg():
print("modify msgId ")
raise RuntimeError("modify msgId then deleted me")
- url = "127.0.0.1:19088/api/topMsg"
+ url = host + "/api/topMsg"
payload = json.dumps({
"msgId": 1222222
})
@@ -214,7 +215,7 @@ def removeTopMsg():
print("modify msgId chatRoomId ")
raise RuntimeError("modify msgId chatRoomId then deleted me")
- url = "127.0.0.1:19088/api/removeTopMsg"
+ url = host + "/api/removeTopMsg"
payload = json.dumps({
"chatRoomId": "123@chatroom",
@@ -231,7 +232,7 @@ def InviteMemberToChatRoom():
print("modify memberIds chatRoomId ")
raise RuntimeError("modify memberIds chatRoomId then deleted me")
- url = "127.0.0.1:19088/api/InviteMemberToChatRoom"
+ url = host + "/api/InviteMemberToChatRoom"
payload = json.dumps({
"chatRoomId": "123@chatroom",
@@ -245,7 +246,7 @@ def InviteMemberToChatRoom():
def hookLog():
- url = "127.0.0.1:19088/api/hookLog"
+ url = host + "/api/hookLog"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -253,7 +254,7 @@ def hookLog():
def unhookLog():
- url = "127.0.0.1:19088/api/unhookLog"
+ url = host + "/api/unhookLog"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -263,7 +264,7 @@ def unhookLog():
def createChatRoom():
print("modify memberIds ")
raise RuntimeError("modify memberIds then deleted me")
- url = "127.0.0.1:19088/api/createChatRoom"
+ url = host + "/api/createChatRoom"
payload = json.dumps({
"memberIds": "wxid_8yn4k908tdqp22,wxid_oyb662qhop4422"
@@ -277,7 +278,7 @@ def createChatRoom():
def quitChatRoom():
print("modify chatRoomId ")
raise RuntimeError("modify chatRoomId then deleted me")
- url = "127.0.0.1:19088/api/quitChatRoom"
+ url = host + "/api/quitChatRoom"
payload = json.dumps({
"chatRoomId": "123@chatroom"
@@ -292,7 +293,7 @@ def quitChatRoom():
def forwardMsg():
print("modify msgId ")
raise RuntimeError("modify msgId then deleted me")
- url = "127.0.0.1:19088/api/forwardMsg"
+ url = host + "/api/forwardMsg"
payload = json.dumps({
"wxid": "filehelper",
@@ -305,7 +306,7 @@ def forwardMsg():
print(response.text)
def getSNSFirstPage():
- url = "127.0.0.1:19088/api/getSNSFirstPage"
+ url = host + "/api/getSNSFirstPage"
payload = {}
headers = {}
@@ -315,7 +316,7 @@ def getSNSFirstPage():
def getSNSNextPage():
print("modify snsId ")
raise RuntimeError("modify snsId then deleted me")
- url = "127.0.0.1:19088/api/getSNSNextPage"
+ url = host + "/api/getSNSNextPage"
payload = json.dumps({
"snsId": ""
@@ -331,7 +332,7 @@ def getSNSNextPage():
def addFavFromMsg():
print("modify msgId ")
raise RuntimeError("modify msgId then deleted me")
- url = "127.0.0.1:19088/api/addFavFromMsg"
+ url = host + "/api/addFavFromMsg"
payload = json.dumps({
"msgId": "1222222"
@@ -347,7 +348,7 @@ def addFavFromMsg():
def addFavFromImage():
print("modify wxid imagePath ")
raise RuntimeError("modify wxid imagePath then deleted me")
- url = "127.0.0.1:19088/api/addFavFromImage"
+ url = host + "/api/addFavFromImage"
payload = json.dumps({
"wxid": "",
@@ -364,7 +365,7 @@ def addFavFromImage():
def getContactProfile():
print("modify wxid ")
raise RuntimeError("modify wxid then deleted me")
- url = "127.0.0.1:19088/api/getContactProfile"
+ url = host + "/api/getContactProfile"
payload = json.dumps({
"wxid": ""
@@ -380,7 +381,7 @@ def getContactProfile():
def sendAtText():
print("modify wxids chatRoomId")
raise RuntimeError("modify wxids chatRoomId then deleted me")
- url = "127.0.0.1:19088/api/sendAtText"
+ url = host + "/api/sendAtText"
payload = json.dumps({
"wxids": "notify@all",
@@ -398,7 +399,7 @@ def sendAtText():
def forwardPublicMsg():
print("modify param ")
raise RuntimeError("modify param then deleted me")
- url = "127.0.0.1:19088/api/forwardPublicMsg"
+ url = host + "/api/forwardPublicMsg"
payload = json.dumps({
"appName": "",
@@ -420,7 +421,7 @@ def forwardPublicMsg():
def forwardPublicMsgByMsgId():
print("modify param ")
raise RuntimeError("modify param then deleted me")
- url = "127.0.0.1:19088/api/forwardPublicMsgByMsgId"
+ url = host + "/api/forwardPublicMsgByMsgId"
payload = json.dumps({
"msgId": 123,
@@ -437,7 +438,7 @@ def forwardPublicMsgByMsgId():
def downloadAttach():
print("modify param ")
raise RuntimeError("modify param then deleted me")
- url = "127.0.0.1:19088/api/downloadAttach"
+ url = host + "/api/downloadAttach"
payload = json.dumps({
"msgId": 123
@@ -454,7 +455,7 @@ def downloadAttach():
def decodeImage():
print("modify param ")
raise RuntimeError("modify param then deleted me")
- url = "127.0.0.1:19088/api/decodeImage"
+ url = host + "/api/decodeImage"
payload = json.dumps({
"filePath": "C:\\66664816980131.dat",
@@ -472,7 +473,7 @@ def decodeImage():
def getVoiceByMsgId():
print("modify param ")
raise RuntimeError("modify param then deleted me")
- url = "127.0.0.1:19088/api/getVoiceByMsgId"
+ url = host + "/api/getVoiceByMsgId"
payload = json.dumps({
"msgId": 7880439644200,
@@ -490,4 +491,5 @@ def getVoiceByMsgId():
if __name__ == '__main__':
checkLogin()
- # userInfo()
+ userInfo()
+ sendTextMsg()
diff --git a/python/client.py b/python/client.py
index 9188e10..53ff550 100644
--- a/python/client.py
+++ b/python/client.py
@@ -1,13 +1,14 @@
import requests
import json
+host = "http://127.0.0.1:19088"
def check_login():
"""
0.检查是否登录
:return:
"""
- url = "127.0.0.1:19088/api/?type=0"
+ url = host + "/api/?type=0"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -19,22 +20,22 @@ def user_info():
登录用户信息
:return:
"""
- url = "127.0.0.1:19088/api/?type=8"
+ url = host + "/api/?type=8"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
-def send_text():
+def send_text(wxid, msg):
"""
发送文本
:return:
"""
- url = "127.0.0.1:19088/api/?type=2"
+ url = host + "/api/?type=2"
payload = json.dumps({
- "wxid": "filehelper",
- "msg": "123"
+ "wxid": wxid,
+ "msg": msg
})
headers = {
'Content-Type': 'application/json'
@@ -43,16 +44,16 @@ def send_text():
print(response.text)
-def send_at():
+def send_at(chatRoomId, wxids, msg):
"""
发送@消息
:return:
"""
- url = "127.0.0.1:19088/api/?type=3"
+ url = host + "/api/?type=3"
payload = json.dumps({
- "chatRoomId": "12333@chatroom",
- "wxids": "notify@all",
- "msg": "12333"
+ "chatRoomId": chatRoomId,
+ "wxids": wxids, # "notify@all"
+ "msg": msg
})
headers = {
'Content-Type': 'application/json'
@@ -61,15 +62,19 @@ def send_at():
print(response.text)
-def send_img():
+def send_img(wxid, imgPath):
+ # {
+ # "wxid": "filehelper",
+ # "imagePath": "C:/123.png"
+ # }
"""
发送图片
:return:
"""
- url = "127.0.0.1:19088/api/?type=5"
+ url = host + "/api/?type=5"
payload = json.dumps({
- "wxid": "filehelper",
- "imagePath": "C:/123.png"
+ "wxid": wxid,
+ "imagePath": imgPath
})
headers = {
'Content-Type': 'application/json'
@@ -83,7 +88,7 @@ def send_file():
发送文件
:return:
"""
- url = "127.0.0.1:19088/api/?type=6"
+ url = host + "/api/?type=6"
payload = json.dumps({
"wxid": "filehelper",
"filePath": "C:/test.txt"
@@ -100,7 +105,7 @@ def hook_msg():
hook 消息
:return:
"""
- url = "127.0.0.1:19088/api/?type=9"
+ url = host + "/api/?type=9"
payload = json.dumps({
"port": "19099",
"ip": "127.0.0.1"
@@ -117,7 +122,7 @@ def unhook_msg():
取消消息hook
:return:
"""
- url = "127.0.0.1:19088/api/?type=10"
+ url = host + "/api/?type=10"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -129,7 +134,7 @@ def hook_img():
hook 图片
:return:
"""
- url = "127.0.0.1:19088/api/?type=11"
+ url = host + "/api/?type=11"
payload = json.dumps({
"imgDir": "C:\\img"
})
@@ -145,7 +150,7 @@ def unhook_img():
取消hook 图片
:return:
"""
- url = "127.0.0.1:19088/api/?type=12"
+ url = host + "/api/?type=12"
payload = json.dumps({
"imgDir": "C:\\img"
})
@@ -161,7 +166,7 @@ def hook_voice():
hook 语音
:return:
"""
- url = "127.0.0.1:19088/api/?type=56"
+ url = host + "/api/?type=56"
payload = json.dumps({
"msgId": 322456091115784000
})
@@ -177,7 +182,7 @@ def unhook_voice():
取消hook 语音
:return:
"""
- url = "127.0.0.1:19088/api/?type=14"
+ url = host + "/api/?type=14"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -189,7 +194,7 @@ def del_friend():
删除好友
:return:
"""
- url = "127.0.0.1:19088/api/?type=17"
+ url = host + "/api/?type=17"
payload = json.dumps({
"wxid": "wxid_1124423322"
})
@@ -205,7 +210,7 @@ def search_friend():
网络搜素用户
:return:
"""
- url = "127.0.0.1:19088/api/?type=19"
+ url = host + "/api/?type=19"
payload = json.dumps({
"keyword": "13812345678"
})
@@ -221,7 +226,7 @@ def add_friend():
添加好友
:return:
"""
- url = "127.0.0.1:19088/api/?type=20"
+ url = host + "/api/?type=20"
payload = json.dumps({
"wxid": "wxid_o11222334422"
})
@@ -237,7 +242,7 @@ def fetch_chat_room_members():
群成员
:return:
"""
- url = "127.0.0.1:19088/api/?type=25"
+ url = host + "/api/?type=25"
payload = json.dumps({
"chatRoomId": "2112222004@chatroom"
})
@@ -253,7 +258,7 @@ def get_member_nickname():
群成员昵称
:return:
"""
- url = "127.0.0.1:19088/api/?type=26"
+ url = host + "/api/?type=26"
payload = json.dumps({
"chatRoomId": "322333384@chatroom",
"memberId": "wxid_4m1112222u22"
@@ -270,7 +275,7 @@ def del_member():
删除群成员
:return:
"""
- url = "127.0.0.1:19088/api/?type=27"
+ url = host + "/api/?type=27"
payload = json.dumps({
"chatRoomId": "31122263384@chatroom",
"memberIds": "wxid_12223334422"
@@ -287,7 +292,7 @@ def add_member():
增加群成员
:return:
"""
- url = "127.0.0.1:19088/api/?type=28"
+ url = host + "/api/?type=28"
payload = json.dumps({
"chatRoomId": "1111163384@chatroom",
"memberIds": "wxid_o12222222"
@@ -304,7 +309,7 @@ def modify_room_name():
修改群昵称
:return:
"""
- url = "127.0.0.1:19088/api/?type=31"
+ url = host + "/api/?type=31"
payload = json.dumps({
"chatRoomId": "222285428@chatroom",
"wxid": "wxid_222222512",
@@ -322,7 +327,7 @@ def get_db_handlers():
获取sqlite3的操作句柄
:return:
"""
- url = "127.0.0.1:19088/api/?type=32"
+ url = host + "/api/?type=32"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -334,7 +339,7 @@ def query_db_by_sql():
查询数据库
:return:
"""
- url = "127.0.0.1:19088/api/?type=34"
+ url = host + "/api/?type=34"
payload = json.dumps({
"dbHandle": 116201928,
"sql": "select localId from MSG where MsgSvrID= 7533111101686156"
@@ -351,7 +356,7 @@ def hook_log():
hook 日志
:return:
"""
- url = "127.0.0.1:19088/api/?type=36"
+ url = host + "/api/?type=36"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -363,7 +368,7 @@ def unhook_log():
取消hook日志
:return:
"""
- url = "127.0.0.1:19088/api/?type=37"
+ url = host + "/api/?type=37"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -375,7 +380,7 @@ def forward():
转发消息
:return:
"""
- url = "127.0.0.1:19088/api/?type=40"
+ url = host + "/api/?type=40"
payload = json.dumps({
"wxid": "filehelper",
"msgid": "705117679011122708"
@@ -392,7 +397,7 @@ def logout():
退出登录
:return:
"""
- url = "127.0.0.1:19088/api/?type=44"
+ url = host + "/api/?type=44"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -404,7 +409,7 @@ def confirm_receipt():
确认收款
:return:
"""
- url = "127.0.0.1:19088/api/?type=45"
+ url = host + "/api/?type=45"
payload = json.dumps({
"wxid": "wxid_1111112622",
"transcationId": "10000500012312222212243388865912",
@@ -422,7 +427,7 @@ def contact_list():
好友列表
:return:
"""
- url = "127.0.0.1:19088/api/?type=46"
+ url = host + "/api/?type=46"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -434,7 +439,7 @@ def room_detail():
群详情
:return:
"""
- url = "127.0.0.1:19088/api/?type=47"
+ url = host + "/api/?type=47"
payload = json.dumps({
"chatRoomId": "199134446111@chatroom"
})
@@ -450,7 +455,7 @@ def ocr():
ocr提取文字
:return:
"""
- url = "127.0.0.1:19088/api/?type=49"
+ url = host + "/api/?type=49"
payload = json.dumps({
"imagePath": "C:\\WeChat Files\\b23e84997144dd12f21554b0.dat"
})
@@ -466,7 +471,7 @@ def pat():
拍一拍
:return:
"""
- url = "127.0.0.1:19088/api/?type=50"
+ url = host + "/api/?type=50"
payload = json.dumps({
"chatRoomId": "211111121004@chatroom",
"wxid": "wxid_111111111422"
@@ -483,7 +488,7 @@ def top_msg():
消息置顶
:return:
"""
- url = "127.0.0.1:19088/api/?type=51"
+ url = host + "/api/?type=51"
payload = json.dumps({
"wxid": "wxid_o11114422",
"msgid": 3728307145189195000
@@ -500,7 +505,7 @@ def close_top_msg():
取消置顶
:return:
"""
- url = "127.0.0.1:19088/api/?type=52"
+ url = host + "/api/?type=52"
payload = json.dumps({
"chatRoomId": "213222231004@chatroom",
"msgid": 3728307145189195000
@@ -517,7 +522,7 @@ def sns_first():
朋友圈首页
:return:
"""
- url = "127.0.0.1:19088/api/?type=53"
+ url = host + "/api/?type=53"
payload = {}
headers = {}
response = requests.request("POST", url, headers=headers, data=payload)
@@ -529,7 +534,7 @@ def sns_next():
朋友圈下一页
:return:
"""
- url = "127.0.0.1:19088/api/?type=54"
+ url = host + "/api/?type=54"
payload = json.dumps({
"snsId": "14091988153735844377"
})
@@ -545,7 +550,7 @@ def query_nickname():
查询联系人或群名称
:return:
"""
- url = "127.0.0.1:19088/api/?type=55"
+ url = host + "/api/?type=55"
payload = json.dumps({
"id": "wxid_1112p4422"
@@ -562,7 +567,7 @@ def download_msg_attach():
下载消息附件
:return:
"""
- url = "127.0.0.1:19088/api/?type=56"
+ url = host + "/api/?type=56"
payload = json.dumps({
"msgId": 6080100336053626000
})
@@ -578,7 +583,7 @@ def get_member_info():
获取群/群成员信息
:return:
"""
- url = "127.0.0.1:19088/api/?type=57"
+ url = host + "/api/?type=57"
payload = json.dumps({
"wxid": "wxid_tx8k6tu21112"
})
@@ -592,4 +597,4 @@ def get_member_info():
if __name__ == '__main__':
check_login()
user_info()
- send_text()
\ No newline at end of file
+ send_text("filehelper","123")
\ No newline at end of file