const express = require("express"); // npm i express
const bodyParser = require("body-parser"); // npm i body-parser
const { TelegramClient, utils } = require("telegram");
const { StoreSession } = require("telegram/sessions");
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
const port = 8080; // default port to listen
const BASE_TEMPLATE = `
GramJS + Express
{{0}}
`;
const PHONE_FORM = `
`;
const CODE_FORM = `
`;
const PASSWORD_FORM = `
`;
const API_ID = -1; // Fill your API ID
const API_HASH = ""; // Fill your API Hash
// Single client; can use an object if you want to store multiple clients
const client = new TelegramClient(
new StoreSession("session_name"),
API_ID,
API_HASH,
{}
);
let phone;
// define a route handler for the default home page
app.get("/", async (req, res) => {
if (await client.isUserAuthorized()) {
const dialog = (await client.getDialogs({ limit: 1 }))[0];
let result = `${dialog.title}
.`;
for (const m of await client.getMessages(dialog.entity, { limit: 10 })) {
result += formatMessage(m);
}
return res.send(BASE_TEMPLATE.replace("{{0}}", result));
} else {
client.start({
phoneNumber: async () => {
return phoneCallback.promise;
},
phoneCode: async () => {
return codeCallback.promise;
},
password: async () => {
return passwordCallback.promise;
},
onError: (err) => console.log(err),
});
return res.send(BASE_TEMPLATE.replace("{{0}}", PHONE_FORM));
}
});
app.post("/", async (req, res) => {
//To access POST variable use req.body()methods.
if ("phone" in req.body) {
phone = req.body.phone;
phoneCallback.resolve(phone);
return res.send(BASE_TEMPLATE.replace("{{0}}", CODE_FORM));
}
if ("code" in req.body) {
codeCallback.resolve(req.body.code);
return res.send(BASE_TEMPLATE.replace("{{0}}", PASSWORD_FORM));
}
if ("password" in req.body) {
passwordCallback.resolve(req.body.code);
res.redirect("/");
}
console.log(req.body);
});
function callbackPromise() {
// helper method for promises
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
}
function formatMessage(message) {
let content = (message.text || "(action message or media)").replace(
"\n",
"
"
);
return `${utils.getDisplayName(
message.sender
)}: ${content}${message.date}
`;
}
const phoneCallback = callbackPromise();
const codeCallback = callbackPromise();
const passwordCallback = callbackPromise();
// callbacks for code and password also
// then inside your grammy code when use sends phone do the following
// start the Express server
app.listen(port, async () => {
client.session.setDC(2, "149.154.167.40", 80);
client.setParseMode("html");
// Connect before fully starting the server
await client.connect();
console.log(`server started at http://localhost:${port}`);
});