const express = require("express"); // npm i express
const bodyParser = require("body-parser"); // npm i body-parser
const { Api, 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;
let phoneCodeHash; // needed for sign in
// 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 {
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;
const result = await client.sendCode(
{
apiId: API_ID,
apiHash: API_HASH,
},
phone
);
phoneCodeHash = result.phoneCodeHash;
return res.send(BASE_TEMPLATE.replace("{{0}}", CODE_FORM));
}
if ("code" in req.body) {
try {
await client.invoke(
new Api.auth.SignIn({
phoneNumber: phone,
phoneCodeHash,
phoneCode: req.body.code,
})
);
} catch (err) {
if (err.errorMessage === "SESSION_PASSWORD_NEEDED") {
return res.send(BASE_TEMPLATE.replace("{{0}}", PASSWORD_FORM));
}
}
}
if ("password" in req.body) {
await client.signInWithPassword(
{
apiId: API_ID,
apiHash: API_HASH,
},
{
password: req.body.password,
onError: (err) => {
throw err;
},
}
);
}
res.redirect("/");
});
function formatMessage(message) {
let content = (message.text || "(action message or media)").replace(
"\n",
"
"
);
return `${utils.getDisplayName(
message.sender
)}: ${content}${message.date}
`;
}
// 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}`);
});