أردت ذات مرة الحصول على رسائل من إحدى محادثات البرقية المخزنة على القرص الخاص بي (بدون بدء عميل عادي). لن تكشف عن دوافعي ، لكن هذه الفرصة بدت لي ضرورية ومفيدة.
هناك روبوتات في البرقية لذلك. يوجد في حبري عدة مقالات مخصصة لبرامج الروبوت ، على سبيل المثال: " 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()
الوصف الكامل للمكتبة .