feat: 封装 TG Client 模块

This commit is contained in:
凌莞 2022-02-16 16:20:50 +08:00
parent 88c8555444
commit 87e8cdd805
No known key found for this signature in database
GPG Key ID: 05F8479BA63A8E92
5 changed files with 258 additions and 0 deletions

View File

@ -10,6 +10,7 @@
"devDependencies": {
"@types/node": "^17.0.18",
"prisma": "^3.9.2",
"ts-node": "^10.5.0",
"tsc": "^2.0.4",
"typescript": "^4.5.5"
},

78
src/client/Telegram.ts Normal file
View File

@ -0,0 +1,78 @@
import { Api, TelegramClient } from 'telegram';
import { StringSession } from 'telegram/sessions';
import { BotAuthParams, UserAuthParams } from 'telegram/client/auth';
import { NewMessage, NewMessageEvent } from 'telegram/events';
import { EditedMessage, EditedMessageEvent } from 'telegram/events/EditedMessage';
import { DeletedMessage, DeletedMessageEvent } from 'telegram/events/DeletedMessage';
import { EntityLike } from 'telegram/define';
import { SendMessageParams } from 'telegram/client/messages';
import { CustomFile } from 'telegram/client/uploads';
export class Telegram {
private readonly client: TelegramClient;
private constructor(stringSession = '') {
this.client = new TelegramClient(
new StringSession(stringSession),
parseInt(process.env.TG_API_ID),
process.env.TG_API_HASH,
{
connectionRetries: 5,
proxy: process.env.PROXY_IP ? {
socksType: 5,
ip: process.env.PROXY_IP,
port: parseInt(process.env.PROXY_PORT),
} : undefined,
},
);
}
public static async create(startArgs: UserAuthParams | BotAuthParams, stringSession = '') {
const bot = new this(stringSession);
await bot.client.start(startArgs);
return bot;
}
public static async connect(stringSession: string) {
const bot = new this(stringSession);
await bot.client.connect();
return bot;
}
public addNewMessageEventHandler(handler: (event: NewMessageEvent) => any) {
this.client.addEventHandler(handler, new NewMessage({}));
}
public addEditedMessageEventHandler(handler: (event: EditedMessageEvent) => any) {
this.client.addEventHandler(handler, new EditedMessage({}));
}
public addDeletedMessageEventHandler(handler: (event: DeletedMessageEvent) => any) {
this.client.addEventHandler(handler, new DeletedMessage({}));
}
public async getChat(entity: EntityLike) {
return new TelegramChat(this.client, await this.client.getInputEntity(entity));
}
}
export class TelegramChat {
constructor(private client: TelegramClient, private entity: Api.TypeInputPeer) {
}
public async sendMessage(params: SendMessageParams) {
return await this.client.sendMessage(this.entity, params);
}
public async sendSelfDestructingPhoto(params: SendMessageParams, photo: CustomFile, ttlSeconds: number) {
// @ts-ignore 定义不好好写的?你家 `FileLike` 明明可以是 `TypeInputMedia`
params.file = new Api.InputMediaUploadedPhoto({
file: await this.client.uploadFile({
file: photo,
workers: 1,
}),
ttlSeconds
});
return await this.client.sendMessage(this.entity, params);
}
}

14
src/index.ts Normal file
View File

@ -0,0 +1,14 @@
import { Telegram } from './client/Telegram';
import { CustomFile } from 'telegram/client/uploads';
import fs from 'fs';
(async () => {
const bot = await Telegram.create({
botAuthToken: process.env.TG_BOT_TOKEN,
});
const me = await bot.getChat('@Clansty');
await me.sendSelfDestructingPhoto({},
new CustomFile('test.jpg',
fs.statSync('/Users/clansty/Pictures/stickers/0.png').size,
'/Users/clansty/Pictures/stickers/0.png'), 10);
})();

View File

@ -0,0 +1,25 @@
import fs from 'fs';
type UserConfig = {
userBotSession: string;
qqUin: number;
qqPassword: string;
isSetup: boolean;
}
const CONFIG_PATH = './data/config.json';
const defaultConfig: UserConfig = {
userBotSession: '',
qqUin: 0,
qqPassword: '',
isSetup: false,
};
export const config: UserConfig = fs.existsSync(CONFIG_PATH) ?
JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8')) :
defaultConfig;
export const saveConfig = () => {
fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 0), 'utf8');
};

140
yarn.lock
View File

@ -12,6 +12,22 @@ __metadata:
languageName: node
linkType: hard
"@cspotcode/source-map-consumer@npm:0.8.0":
version: 0.8.0
resolution: "@cspotcode/source-map-consumer@npm:0.8.0"
checksum: c0c16ca3d2f58898f1bd74c4f41a189dbcc202e642e60e489cbcc2e52419c4e89bdead02c886a12fb13ea37798ede9e562b2321df997ebc210ae9bd881561b4e
languageName: node
linkType: hard
"@cspotcode/source-map-support@npm:0.7.0":
version: 0.7.0
resolution: "@cspotcode/source-map-support@npm:0.7.0"
dependencies:
"@cspotcode/source-map-consumer": 0.8.0
checksum: 9faddda7757cd778b5fd6812137b2cc265810043680d6399acc20441668fafcdc874053be9dccd0d9110087287bfad27eb3bf342f72bceca9aa9059f5d0c4be8
languageName: node
linkType: hard
"@gar/promisify@npm:^1.0.1":
version: 1.1.2
resolution: "@gar/promisify@npm:1.1.2"
@ -74,6 +90,34 @@ __metadata:
languageName: node
linkType: hard
"@tsconfig/node10@npm:^1.0.7":
version: 1.0.8
resolution: "@tsconfig/node10@npm:1.0.8"
checksum: b8d5fffbc6b17ef64ef74f7fdbccee02a809a063ade785c3648dae59406bc207f70ea2c4296f92749b33019fa36a5ae716e42e49cc7f1bbf0fd147be0d6b970a
languageName: node
linkType: hard
"@tsconfig/node12@npm:^1.0.7":
version: 1.0.9
resolution: "@tsconfig/node12@npm:1.0.9"
checksum: a01b2400ab3582b86b589c6d31dcd0c0656f333adecde85d6d7d4086adb059808b82692380bb169546d189bf771ae21d02544a75b57bd6da4a5dd95f8567bec9
languageName: node
linkType: hard
"@tsconfig/node14@npm:^1.0.0":
version: 1.0.1
resolution: "@tsconfig/node14@npm:1.0.1"
checksum: 976345e896c0f059867f94f8d0f6ddb8b1844fb62bf36b727de8a9a68f024857e5db97ed51d3325e23e0616a5e48c034ff51a8d595b3fe7e955f3587540489be
languageName: node
linkType: hard
"@tsconfig/node16@npm:^1.0.2":
version: 1.0.2
resolution: "@tsconfig/node16@npm:1.0.2"
checksum: ca94d3639714672bbfd55f03521d3f56bb6a25479bd425da81faf21f13e1e9d15f40f97377dedbbf477a5841c5b0c8f4cd1b391f33553d750b9202c54c2c07aa
languageName: node
linkType: hard
"@types/node@npm:^17.0.18":
version: 17.0.18
resolution: "@types/node@npm:17.0.18"
@ -88,6 +132,22 @@ __metadata:
languageName: node
linkType: hard
"acorn-walk@npm:^8.1.1":
version: 8.2.0
resolution: "acorn-walk@npm:8.2.0"
checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1
languageName: node
linkType: hard
"acorn@npm:^8.4.1":
version: 8.7.0
resolution: "acorn@npm:8.7.0"
bin:
acorn: bin/acorn
checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0
languageName: node
linkType: hard
"agent-base@npm:6, agent-base@npm:^6.0.2":
version: 6.0.2
resolution: "agent-base@npm:6.0.2"
@ -142,6 +202,13 @@ __metadata:
languageName: node
linkType: hard
"arg@npm:^4.1.0":
version: 4.1.3
resolution: "arg@npm:4.1.3"
checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43
languageName: node
linkType: hard
"async-mutex@npm:^0.3.0":
version: 0.3.2
resolution: "async-mutex@npm:0.3.2"
@ -298,6 +365,13 @@ __metadata:
languageName: node
linkType: hard
"create-require@npm:^1.1.0":
version: 1.1.1
resolution: "create-require@npm:1.1.1"
checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff
languageName: node
linkType: hard
"d@npm:1, d@npm:^1.0.1":
version: 1.0.1
resolution: "d@npm:1.0.1"
@ -368,6 +442,13 @@ __metadata:
languageName: node
linkType: hard
"diff@npm:^4.0.1":
version: 4.0.2
resolution: "diff@npm:4.0.2"
checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d
languageName: node
linkType: hard
"dom-serializer@npm:^1.0.1":
version: 1.3.2
resolution: "dom-serializer@npm:1.3.2"
@ -1020,6 +1101,13 @@ __metadata:
languageName: node
linkType: hard
"make-error@npm:^1.1.1":
version: 1.3.6
resolution: "make-error@npm:1.3.6"
checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402
languageName: node
linkType: hard
"make-fetch-happen@npm:^9.1.0":
version: 9.1.0
resolution: "make-fetch-happen@npm:9.1.0"
@ -1409,6 +1497,7 @@ __metadata:
oicq: ^2.2.0
prisma: ^3.9.2
telegram: ^2.5.0
ts-node: ^10.5.0
tsc: ^2.0.4
typescript: ^4.5.5
languageName: unknown
@ -1689,6 +1778,43 @@ __metadata:
languageName: node
linkType: hard
"ts-node@npm:^10.5.0":
version: 10.5.0
resolution: "ts-node@npm:10.5.0"
dependencies:
"@cspotcode/source-map-support": 0.7.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.0
yn: 3.1.1
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
bin:
ts-node: dist/bin.js
ts-node-cwd: dist/bin-cwd.js
ts-node-script: dist/bin-script.js
ts-node-transpile-only: dist/bin-transpile.js
ts-script: dist/bin-script-deprecated.js
checksum: d51ac8a9b3582ce3705cef8d35f3372e40caa277dbd7c7baeb651961538f13d2f11f22402614348f78d9b10501bd1cb5f05ec4f2ec9a74bd0e288de769c32335
languageName: node
linkType: hard
"tsc@npm:^2.0.4":
version: 2.0.4
resolution: "tsc@npm:2.0.4"
@ -1816,6 +1942,13 @@ __metadata:
languageName: node
linkType: hard
"v8-compile-cache-lib@npm:^3.0.0":
version: 3.0.0
resolution: "v8-compile-cache-lib@npm:3.0.0"
checksum: 674e312bbca796584b61dc915f33c7e7dc4e06d196e0048cb772c8964493a1ec723f1dd014d9419fd55c24a6eae148f60769da23f622e05cd13268063fa1ed6b
languageName: node
linkType: hard
"websocket@npm:^1.0.34":
version: 1.0.34
resolution: "websocket@npm:1.0.34"
@ -1908,3 +2041,10 @@ __metadata:
checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
languageName: node
linkType: hard
"yn@npm:3.1.1":
version: 3.1.1
resolution: "yn@npm:3.1.1"
checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6
languageName: node
linkType: hard