diff --git a/package.json b/package.json index cacf46f..e196a49 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/src/client/Telegram.ts b/src/client/Telegram.ts new file mode 100644 index 0000000..032aad7 --- /dev/null +++ b/src/client/Telegram.ts @@ -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); + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..3af6bea --- /dev/null +++ b/src/index.ts @@ -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); +})(); diff --git a/src/providers/userConfig.ts b/src/providers/userConfig.ts new file mode 100644 index 0000000..f964db0 --- /dev/null +++ b/src/providers/userConfig.ts @@ -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'); +}; diff --git a/yarn.lock b/yarn.lock index 90c0056..a1ff9f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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