التنصت على دردشة برقية باستخدام عميلك

أردت ذات مرة الحصول على رسائل من إحدى محادثات البرقية المخزنة على القرص الخاص بي (بدون بدء عميل عادي). لن تكشف عن دوافعي ، لكن هذه الفرصة بدت لي ضرورية ومفيدة.


هناك روبوتات في البرقية لذلك. يوجد في حبري عدة مقالات مخصصة لبرامج الروبوت ، على سبيل المثال: " Chat-assistant to the site ".


يسمح لك برنامج التتبُّع بقراءة الرسائل وإرسالها ، ولا تحتاج إلى هاتف لتسجيل برنامج بوت ، ويمكن أن يكون عدد برامج التتبُّع أيًا. لكن اسم الروبوت يتضمن كلمة "bot" ، والتي قد تسبب أسئلة غير ضرورية من مضيف الدردشة.


ولكن ، كما يقولون ، فإن السؤال المطروح بشكل صحيح هو نصف الإجابة.


اتضح أنه بالإضافة إلى "Telegram bot API" ، هناك أيضًا "Telegram client API" ، أي API لإنشاء عملائك.


يمكن للعميل أيضًا إرسال وقراءة الرسائل ، ولكن فقط من مستخدم مسجل (مرتبط بالهاتف) ، وهو حق مناسب لي (أنا مسجل بالفعل في الدردشة).


يحتوي موقع البرقية على قائمة بواجهات برمجة التطبيقات لمنصات مختلفة: https://telegram.org/apps#source-code


ومع ذلك ، كانت أسهل طريقة لاستخدام المكتبة هي python: مكتبة عميل Pure Python 3 MTProto API Telegram تسمى "telethon"


هنا فقط المشكلة. أنا لا أعرف الثعبان. حسنا ، هناك سبب لمقابلتك.
وفقا لدليل teleton ، فإن تركيبه بسيط للغاية. فقط قم بتشغيل الأمر في سطر الأوامر:


pip3 install telethon 

المطبات التي التقيت بها أثناء التثبيت:


  • لم يتم تثبيت pip3 (المثبت لبايثون).

sudo apt-get -y تثبيت python3-pip


  • تعمل المكتبة فقط على إصدارات بيثون> 3.5. لذلك قد تضطر إلى تحديثه.

تم تأسيس كل شيء. قم بالتمرير إلى readme.txt أكثر.


النقطة التالية هي إنشاء عميل برقية ... كيف بالفعل؟ حسنًا ، نعم ، كل شيء بسيط. صحيح ، تحتاج أولاً إلى تسجيل نفسك كمبدع للعميل.


نذهب إلى موقع البرقية: https://my.telegram.org
ندخل الهاتف وننتظر رمز التأكيد على العميل الأصلي للبرقية. وهي طويلة جدًا (12 حرفًا) وغير ملائمة للإدخال.


ننتقل إلى عنصر " API ". نبحث عن "Telegram API" وننتقل إلى "إنشاء تطبيق" ( https://my.telegram.org/apps ).


املأ عنوان التطبيق وحقول الاسم المختصر ، وانقر على "إنشاء تطبيق" وتذكر متغيرين: api_id و api_hash .


حان الوقت لجعل العميل.


 from telethon import TelegramClient, sync #  api_id  api_hash api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) client.start() 

session_name - يمكنك إدراج أي اسم. سيُطلب منك إدخال الهاتف وسيتم إرسال رمز التأكيد. بعد ذلك ، سيعمل العميل دون الاتصال بالهاتف (حتى تقوم بتغيير اسم_الجلسة). سيظهر ملف session_name.session بجانب البرنامج.


إذا لم تكن هناك أخطاء ، فإن العميل جاهز. فقط الآن ، لا يعرض أي شيء. لنحاول الحصول على معلومات مفيدة.


تعلم القليل عن نفسك:


 print(client.get_me().stringify()) 

النتيجة معطاة بالشكل:


 User( photo=None, last_name='Pupkin', first_name='Vasya', id=123456789, phone='79041234567', .... - - ... ) 

يمكننا إرسال رسالة من أنفسنا:


 client.send_message('username', 'Hello! Talking to you from Telethon') 

يمكنك وصورة


 client.send_file('username', '/home/myself/Pictures/holidays.jpg') 

كما يراني الآخرون:


 client.download_profile_photo('me') 

نحن ننظر إلى المحادثات التي اشتركنا فيها:


 print all chats name for dialog in client.iter_dialogs(): print(dialog.title) 

نقرأ جميع رسائل الدردشة "chat_name" (بعناية ، يمكن أن يكون هناك الكثير من الرسائل)


 messages = client.get_entity('chat_name') print(messages) 

عرض جميع مستخدمي الدردشة


 participants = client.get_participants('chat_name') print(participants) 

انغمس في؟
الآن ، في الواقع ، نحن نفعل ما بدأناه جميعًا لهذا ...


نحتاج إلى برنامج يراقب الرسائل الجديدة في قناة معينة.


لمنع العميل من إنهاء العمل ، بعد client.start () نقوم بإدراج السطر:


 client.run_until_disconnected() 

يعرض هذا البناء (المدرج قبل client.start ()) الرسائل الجديدة فقط:


 @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) print(event.message.to_dict()['message']) 

دعونا نكتشف ذلك.


 @client.on(events.NewMessage(chats=('chat_name'))) 

ينشئ حدثًا ينطلق عند ظهور رسالة جديدة


  print(event.message) 

يعرض رسالة في هذا النموذج:


 Message(edit_date=None, views=None, reply_markup=None, fwd_from=None, id=187, entities=[], post=False, mentioned=False, via_bot_id=None, media_unread=False, out=True, media=None, date=datetime.datetime(2018, 10, 1, 9, 26, 21, tzinfo=datetime.timezone.utc), to_id=PeerChannel(channel_id=123456789), reply_to_msg_id=None, from_id=123456789, silent=False, grouped_id=None, post_author=None, message='hello telegram') 

من كل هذا نحتاج إلى حقل: "message = 'hello telegram'":


  print(event.message.to_dict()['message']) 

تم تلقي الرسالة ، ولكن من هو ، ليس واضحا ، لأنه معرف المستخدم فقط لكل رسالة. لمطابقة رقم التعريف واسم المستخدم ، قم بتنزيل جميع مستخدمي الدردشة ووضعهم في القاموس (التجزئة) في شكل d [id] = "first_name last_name"


 participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname 

الآن يمكننا معرفة من أرسل الرسالة:


 s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) 

من حيث المبدأ ، يمكنك الحصول على اسم المستخدم مباشرة من البرقية ، ولكن إذا كان هناك عدد قليل من المستخدمين ، فمن الأسهل باستخدام القاموس.


نحصل على تاريخ الإرسال من الرسالة:


 mess_date=event.message.to_dict()['date'] 

كل شيء ، كل البيانات التي لدينا. يبقى لكتابتها في ملف.
للقيام بذلك ، قم أولاً بفتح الملف للكتابة:


 f=open('messages_from_chat', 'a') 

واكتب الرسالة:


 f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() 

هذا كل شيء! كل ما احتاجه هو البرنامج. الأداة ، بالطبع ، رطبة ، لكنها تؤدي مهمتها.


لم تكن Python معقدة للغاية حيث تم رسمها ، خاصة وأن وصف المكتبات المختلفة على الإنترنت ممتلئ. لكتابة المزيد من الأدوات المساعدة والتعود عليها ، يمكنك استخدامها كلغة برمجة بدلاً من bash.


النص الكامل للأداة المساعدة:
 from telethon import TelegramClient, sync, events api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) user_mess=event.message.to_dict()['message'] s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) mess_date=event.message.to_dict()['date'] f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() client.start() group='group_name' participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname f=open('messages_from_chat', 'a') client.run_until_disconnected() f.close() 

الوصف الكامل للمكتبة .

Source: https://habr.com/ru/post/ar425151/


All Articles