Парсим и определяем тональность сообщений в Telegram
До начала работы с API Telegram необходимо получить собственный API ID и Hash. Это можно сделать пройдя по ссылке https://my.telegram.org/auth?to=apps, указав номер телефона привязанный к профилю, и заполнив App title и Short name. Platform — можно выбрать “Other (specify in description)”. Остальные параметры можно оставить пустыми.
После того как все шаги выполнены вы получите собственные API ID и Hash.
Важно: В Telegram в настройках конфиденциальности должна быть отключена двухэтапная аутентификация.
Шаг 2. Вход в аккаунт Telegram.
Теперь переходим в Google Colab и первым делом устанавливаем библиотеку telethon:
pip install telethon
Для начала работы нам понадобятся две библиотеки: pandas и TelegramClient:
import pandas as pd from telethon.sync import TelegramClient
После того, как библиотеки установлены подключаемся к Telegram с помощью полученных ранее API ID и Hash:
api_id = Ваш API ID api_hash = 'Ваш Hash' phone = 'ваш номер телефона, привязанный к профилю' client = TelegramClient(phone, api_id, api_hash) await client.start() print(await client.get_me())
Если данные введены корректно, Google Colab запросит ваш телефон. Вводить телефон надо с 8 (не с +7).
После ввода телефона Telegram пришлет код подтверждения. Этот код используется для входа в ваш аккаунт в Telegram. Введите полученный код в ячейку с запросом.
Если все верно, Telegram пришлет сообщение, что вход выполнен.
Шаг 3. Парсим группу.
Создадим переменную адресом чата (начинается с https://t.me/….), сообщения из которого хотим спарсить (адрес можно посмотреть в Group info )
chat = 'адрес чата'
Если есть необходимость, можно посмотреть участников группы. Для этого создадим пустой список, в который спарсим данные участников группы и затем создадим датафрейм, для более удобного анализа:
data_item = [] part_item = await client.get_participants(chat) for item in part_item: data_item.append([item.first_name, item.last_name, item.id]) df = pd.DataFrame(data_item, columns=['first_name', 'last_name', 'id']) df
Однако нас интересуют сообщения участников группы. Шаги выполнения те же, что при парсинге участников группы, за единственным исключением — необходимо установить количество сообщений, которые хотим загрузить. Например, limit=100 позволяет выгрузить последние 100 сообщений. Если есть необходимость выгрузить все сообщения, limit=100 можно просто убрать.
data_message = [] part_mes= await client.get_messages(chat, limit=100) for message in part_mes: data_message.append([message.sender_id, message.text]) df_message = pd.DataFrame(data_message, columns=['user_id', 'text']) df_message
При желании полученный датафрейм можно сохранить в формате csv:
df_message.to_csv('message.csv')
Чтобы, при желании, загружать уже готовые данные в любое удобное время:
df_op = pd.read_csv('message.csv', encoding="UTF-8")
Шаг 4. Определяем тональность сообщений.
Для начала необходимо установить transformers:
!pip install transformers
from transformers import pipeline
Создаем пайплайн для обработки естественного языка:
model=pipeline("sentiment-analysis", "blanchefort/rubert-base-cased-sentiment")
Создаем копию датафрейма:
df_model = df_message.copy()
Используем пайплайн для определения тональности текста:
lst = [] for i in df_model["text"]: lst.append(model(str(i))[0]["label"]) df_model["Sentinent"]=pd.DataFrame(lst) df_model
Теперь (к примеру) можно посмотреть отдельно негативные сообщения и какой id из оставил:
df_NEGATIVE = df_model[df_model["Sentinent"]=="NEGATIVE"] df_NEGATIVE
или позитивные сообщения:
df_POSITIVE = df_model[df_model["Sentinent"]=="POSITIVE"] df_POSITIVE
What is access_hash in telegram API?
I know libs like pyrogram , telethon store this access_hash inside their local sqlite databases. This way they make it possible to call high level functions which require both id and access_hash using only id .
asked Mar 21, 2023 at 16:26
1,133 1 1 gold badge 9 9 silver badges 30 30 bronze badges
It’s not limited to resolveUsername , access_hash is available on a lot of Types.
Mar 21, 2023 at 16:51
@0stone0 yeah, I know, but still it doesn’t explain anything, unfortunately.
Mar 21, 2023 at 16:57
1 Answer 1
The access_hash values commonly appear in Telegram’s API when access to something should be «restricted» in some way. You can find access_hash for users, channels, or even media objects.
I’ll be using Telethon for the examples below, but the same applies to any library interacting with Telegram’s API.
Does it change over time? Probably not. To the best of my knowledge, the access_hash does not change over time. I have not heard of any reports from users claiming that the access_hash has changed.
It is impossible to know for sure, as that would require access to the code the Telegram servers are using for this (and they could change their implementation at any time), but I’ve been working with Telegram for a very long time, and I can confidently say it likely never changes.
Does it mean anything at all? Not by itself. It’s just a random-looking number. However, it is proof that you have access to a particular object, whether that’s an user, channel, or media.
If the access_hash didn’t exist, you could try guessing random IDs, which would for example make it possible to enumerate every user registered to Telegram!:
for user_id in range(1_000_000): await client.get_entity(user_id)
Thankfully, the above code won’t work, because in order to fetch user information, the access_hash needs to be known. But since it’s random, and different for each account, it’s pretty much impossible to guess. Thus, the access_hash keeps your account safe (as long as there’s no way to «reach» it by other means, e.g. via a message forwarded from you, or your participation in public groups).
Is it safe to store in the database and be certain that it’s constant? Yes. Telethon v1 for example stores the access_hash inside its .session file, which lets you use just the id to refer to users and channels, as long as the library has «seen» (and cached) their access_hash before.
from telethon import types CHANNEL = types.InputPeerChannel(channel_id=. access_hash=. )
Does it differ from account to account? Yes. The access_hash is unique to each account. For example, if Account_A fetches Channel_X, it may have id=123, access_hash=456 . But if Account_B fetches the same Channel_X, it may have id=123, access_hash=789 .
This means you cannot fetch an access_hash in Account_A and then try using it in Account_B, as it won’t work (stickers seem to have been an exception at some point).
Every account will see the same ID for the same thing (messages appear to be an exception, but in reality they follow the same rules; they’re duplicated for each account unless they occur inside a channel, so the «same» message can appear to have a different ID.)
Делаем OAuth авторизацию Telegram на своём сайте
Раньше тоже можно было авторизовать пользователя через телеграм. Но для этого и пользователю и разработчику нужно было сделать много лишних телодвижений.
А теперь всё просто как в ВК или Facebook.
Что нам нужно?
На нужен вебсайт. На localhost авторизацию проверить не получится, потому что к боту привязывается доменное имя.
Создаём бота
Создать бота всё-таки придётся. Авторизовываться будут с помощью него. Разработчики Телеграм говорят, что бот сможет сам инициировать диалог с авторизованными таким способом пользователями. Я этого пока не проверял. Поверим на слово.
Подробно писать как создать бота я не буду, потому что про это написана и перенаписано миллион статей. Вот ссылка на мануал от Telegram https://core.telegram.org/bots#3-how-do-i-create-a-bot .
После создания бота нам дадут ключ api, который пригодится нам в дальнейшем.
Привязываем к боту домен
Нужно отправить боту @BotFather команду /setdomain , он сначала попросит выбрать бота, а потом нужно будет ввести адрес сайта.
Виджет авторизации
На странице https://core.telegram.org/widgets/login находим конфигурацию виджета
Вводим username бота, который сами придумали в процессе создания бота.
Далее выбирает размер кнопки. Три варианта. При перещёлкивании кнопка внизу будет автоматически менять размер.
Затем нужно выбрать как мы будем обрабатывать данные полученные от телеграм. Тут два варианта. Либо мы делает под это отдельную страницу и пользователя перенаправить туда, мы обработаем данные и можем перенаправить обратно или, например в закрытую часть сайта. Либо же мы делаем всё это через callback без перезагрузки страницы. Второй вариант мне кажется правильнее и современнее. Его и выбираю.
Далее там самая галочка, которая видимо и отвечает за отсылку сообщений от имени бота
Ну дальше поле с получившимся кодом.
Тут два тега скрипт. В принципе можно всё это вставить в нужное место на сайте, но я вставил только верхний, который рисует кнопку. Из нижнего я взял callback функцию и вставил в общий js-файл для сайта.
Сейчас эта функция просто выводит стандартный alert в браузере с сообщением о том, что пользователь залогинен и некоторые его данные. Позже напишем сюда запрос к серверу.
На сайте
На клиенте
Как уже написал чуть выше, скрипт, отрисовывающий кнопку входа в телеграм, я вставил в нужное место в разметке. В файл, где у меня прописаны основные js функции, я добавил ту самую callback-функцию. У меня на сайте установлен jquery, поэтому не стал выделываться и отправил запрос через него.
На сервере
Сайт работает на nodejs на фреймворке koa, поэтому пример буду приводить на нём(в конце дам ссылку на php)
Это контроллер login
//подключаем необходимые модули
const Router = require(‘koa-router’)
const router = new Router()
const jwt = require(‘jsonwebtoken’)
const config = require(‘../config/config’)
const mongo = require(‘../config/mongo’)
const crypto = require(‘crypto’);
const < strcmp >= require(‘../lib/utils’)
const ObjectID = require(‘../config/mongo’).ObjectID
// тут роут
exports.init = function (app)
router.post(‘/login’, login)
app.use(router.routes())
>
// собственно функция логина
async function login(ctx,next)
// сюда методом post приходят данные в виде json
const authData = ctx.request.fields
//с помощью hash мы проверим целостность данных, то есть вообще с телеграма ли нам это пришло или кто-то нехороший копается
const checkHash = authData.hash
delete authData[‘hash’]
/* по инструкции телеграм мы должны взять все данные, кроме hash, которые пришла нам от телеграм и собрать из в одну строку в формате key=value, разделяя символом переноса строки \n */
let dataCheck = []
for (let key in authData)
dataCheck.push(key + ‘=’ + authData[key])
>
dataCheck.sort();
dataCheck.join(“\n”)
// Делаем из неё sha256
const secretKey = crypto.createHash(‘sha256’)
.update(config.oauth.telegram.botToken)
/* и проверяем если не ок, то шлём юзера куда подальше, если ок, то добавляем или обновляем пользователя в базе данных */
const hash = crypto.createHmac(‘sha256’, dataCheck.toString(), secretKey);
if (strcmp(hash, checkHash) === -1)
ctx.status = 401
ctx.body = ‘Data is NOT from Telegram’
>
if ( +(new Date()) — authData.auth_date > 86400)
ctx.status = 401
ctx.body = ‘Data is outdated’
>
const user = await mongo.users.findOne()
if(!user)
await mongo.users.insertOne(authData)
>else
await mongo.users.updateOne(,>)
>
/*Здесь я использовал jwt, чтобы сделать токен, в принципе можно написать это самому, но суть статьи не в этом*/
const token = await jwt.sign(authData, config.app.secret)
/* Ставлю куку с этим токеном */
/*Теперь я добавлю перед всеми роутами middlware. Я использую koa, там принять пользователя хранить в ctx.state.user*/
app.use(async (ctx,next) =>
const token = ctx.cookies.get(‘tgUser’)
if(token)
try
ctx.state.user = await jwt.verify(token, config.app.secret)
>catch (error)
ctx.cookies.set(‘tgUser’, ‘’);
>
>
await next(ctx)
>)
После этого остаётся где нужно проверять переменную ctx.state.user.
Есть пример намного проще и на php от самих Телеграм. Вероятно, самые внимательные его уже нашли https://gist.github.com/anonymous/6516521b1fb3b464534fbc30ea3573c2
Этот пример чисто демонстративный, для реального сайта его нужно будет допилить.
Как получить access_hash, пользователя который написал в группу | telethon?
на стаковерфлоу вот чо пишут
4 пункт то что надо но там нет примера кода
не могу вьехать как это сделать помогите плез
Код Python:
There are 4 ways to get access hash:
From a Group
From username
From contact list
From chats message
So, if you have id only, there is no way to get access hash
я понимаю что код который отправляет сообщение должен выглядеть так
но где ацесс хэш взять я нэ понимаю
user_id = await client.get_entity(event.from_id.user_id) user_access_hash = . ## помогите вот тут пжпж succes_is_nearby = InputPeerUser(user_id, user_access_hash) await client.send_message(succes_is_nearby, message='здарова, гачимученик')
- Вопрос задан более года назад
- 922 просмотра