باختصار
ما الذي تقوله هذه المقالة
عندما يكون تطبيق أندرويد مفتوح المصدر، يستطيع وكيل برمجة بالذكاء الاصطناعي استنساخه، وإضافة ميزة شخصية، وبناء APK، وتثبيته على هاتف متصل عبر USB، وفحص النتيجة، ثم تحسينها. تشرح المقالة ذلك عبر تفريع tg-digest-android العام وتقدم موجّهات جاهزة، مع إبقاء api_id وapi_hash الخاصين بتيليغرام في ملف local.properties محلي يتجاهله Git.
- يضيف التفريع المستخدم في المثال علامة تبويب Digest تجمع المنشورات غير المقروءة من قنوات تيليغرام المحددة في موجز زمني واحد.
- بنى Claude التطبيق وثبّته وفتحه وفحصه بصريًا وحسّنه على هاتف Redmi Note 8 Pro فعلي خلال يوم واحد.
- يجب على القارئ الحصول على api_id وapi_hash شخصيين من تيليغرام، ووضعهما في local.properties بجذر المشروع، وتفعيل خيارات مطوّر أندرويد وUSB debugging.
- وقت نشر المقال، لا تظهر بيانات اعتماد تيليغرام الشخصية للمؤلف في الشجرة العامة الحالية ولا في أي من الإيداعين العامين؛ ولا يبقى في المصدر المستورد سوى الزوج النموذجي الخاص بتيليغرام.
- البناء المتاح مخصص لـarm64-v8a ويستند إلى Telegram for Android 12.7.3 (6750).
كنت أريد أن أفتح تيليغرام فأرى موجزًا واحدًا للمنشورات غير المقروءة من القنوات التي اخترتها وحدها. لم يكن ذلك الزر موجودًا. لم أرسل طلبًا ثم أنتظر لأرى إن كانت الفكرة ستدخل خارطة طريق شخص آخر. فتحت الشفرة المصدرية لعميل أندرويد الرسمي، ووصفت السلوك لـClaude، ووصلت هاتفي، وفي مساء اليوم نفسه كنت أستخدم نسختي الخاصة.
في ذلك الصباح، لم تكن الميزة موجودة
غالبًا ما تنتهي الاشتراكات في القنوات إلى واحدة من حالتين سيئتين بالقدر نفسه: مئات العدادات الحمراء، أو وضع علامة «مقروء» على كل شيء فيما تضيع المنشورات المفيدة. أردت نموذجًا ثالثًا: أن أختار بنفسي عددًا قليلًا من القنوات، ثم أقرأ كل منشوراتها غير المقروءة كمخطط زمني عادي واحد.
وهذا بالضبط ما تفعله علامة تبويب Digest الناتجة:
- تتيح البحث عن القنوات وتجمع منشوراتها بترتيب زمني؛
- تحتفظ بحدّ منفصل لآخر ما قُرئ في كل حساب؛
- تفتح عند أول عنصر غير مقروء وتتيح التمرير بلا نهاية إلى الماضي؛
- تعرض أسماء القنوات وألبومات الوسائط والتواريخ والتفاعلات بواجهة تيليغرام نفسها؛
- تضع علامة «مقروء» على الرسائل الظاهرة عبر المسار نفسه الذي تستخدمه شاشة القناة العادية.
هذا ليس عرضًا تجريبيًا صغيرًا ولا عميلًا جديدًا رُسم من الصفر. كان على الوكيل نقل القاعدة إلى أحدث مصدر منشور لتيليغرام، وفهم قاعدة بياناته المحلية، وتقسيم الصفحات، وتجميع الوسائط، والتنقل. لكنني لم أحتج إلى إملاء أسماء الأصناف. وصفت ما ينبغي أن يراه مستخدم التطبيق وما ينبغي أن يشعر به.
حدّد الموجّه السلوك، لا الشفرة
بدا الطلب الأساسي على النحو التالي تقريبًا. كانت الجملة الأخيرة مهمة: منعت الوكيل من بناء واجهة ثانية غريبة بوضوح إلى جانب واجهة تيليغرام الموجودة.
أضف صفحة منفصلة تحتوي على كل الرسائل غير المقروءة من قنوات تيليغرام التي أحددها.
أحتاج إلى واجهة لاختيار القنوات. احتفظ لـDigest بحدّ منفصل لآخر عنصر قرأته فعلًا. عند فتح الصفحة، ضعها عند أول رسالة غير مقروءة. أضف تمريرًا لا نهائيًا إلى الماضي وزرًا سفليًا يعيدني إلى أول عنصر غير مقروء. ضع علامة «مقروء» على المنشورات الظاهرة عبر حالة القراءة القياسية في تيليغرام.
اعرض الألبومات واسم القناة وصورتها الرمزية بالطريقة نفسها التي يعرضها بها تيليغرام العادي. أعد استخدام الواجهة الموجودة قدر الإمكان؛ ولا تكتب واجهة مخصصة إلا حيث لا يمكن تجنب ذلك.
ابنِ التطبيق، وثبّته على الهاتف المتصل، وتحقق من النتيجة على الجهاز.بعد بضع ساعات كان التطبيق يعمل على Redmi Note 8 Pro. ثم أعطيت ملاحظتين قصيرتين: إزالة الارتجاج أثناء التمرير، ونقل الزر الدائري إلى أعلى شريط التنقل السفلي مع إزالة صورة رمزية شاردة بين الرسائل. فحص Claude النتيجة على الهاتف، وعثر على الأسباب، وأعاد بناء ملف APK، ثم تحقق مرة أخرى. كان هذا أشبه بالعمل مع فريق منتج منه بـ«توليد الشفرة».
الشفرة تزداد رخصًا؛ والقصد الدقيق تزداد قيمته
كانت هناك في السابق سلسلة مكلفة بين «أحتاج إلى هذا» و«أنا أستخدم هذا»: العثور على مطوّر أندرويد، وشرح البنية، وتجهيز البيئة، وانتظار عمليات البناء، وتعلّم ADB. درّبنا ذلك على التعامل مع واجهة التطبيق كأنها نهائية. نقبل ما يطرحه المورّد وننتظر الإصدار التالي.
يغيّر وكيل البرمجة اقتصاديات هذه السلسلة. يستطيع قراءة مستودع كبير غير مألوف،
ومطابقة إصدارات JDK وSDK وNDK، والعثور على نقطة الدمج الصحيحة، وبناء APK، وفحص فشل
التثبيت، وقراءة logcat، ثم التكرار. ليست كل نتيجة جيدة، لكن تكلفة الوصول إلى
أول نسخة عاملة انهارت.
لا ينطبق هذا على كل شيء. فتطبيق مغلق بلا مصدر، أو وظيفة تنفذ على الخادم، أو بنية دفع، أو تغيير في بروتوكول تشفيري، لن يظهر من موجّه واحد. لكن عندما يكون السلوك المطلوب داخل عميل أندرويد مفتوح ويمكن التحقق منه على الشاشة، لم يعد انتظار الزر الرسمي قرارًا منطقيًا دائمًا.
كيف تكرر التجربة: اترك للإنسان الإجراءات الضرورية وحدها
سير العمل أدناه مخصص لهذا التفريع. تحتاج إلى حاسوب، ووكيل برمجة يعمل من الطرفية مثل Claude Code أو Codex، وهاتف أندرويد، وكابل USB لنقل البيانات، وعدة غيغابايت من المساحة الخالية. المستودع كبير، وأول بناء لأندرويد يستغرق وقتًا. دع الوكيل يجهّز البيئة التقنية؛ وستضيف أنت بيانات الاعتماد الخاصة، وتغيّر إعدادات الهاتف، وتسجّل الدخول إلى تيليغرام.
1 دع الوكيل يجهّز المشروع
افتح الوكيل في مجلد فارغ والصق الموجّه أدناه. يتوقف عمدًا قبل الوصول إلى الأسرار، ويرفض إزالة تطبيق مثبت إذا أبلغ أندرويد عن تعارض في التوقيع.
جهّز https://github.com/howaihelps/tg-digest-android لبناء محلي.
اعمل باستقلالية: استنسخ المشروع، واقرأ README، وافحص سجل Git وشجرة العمل. اكتشف نظام التشغيل لديّ وتحقق من Git وJDK 17 وAndroid SDK / Build Tools 35 وNDK 27.2.12479018 وCMake وplatform-tools. جهّز كل ما ينقص؛ وإذا احتاج تنزيل أو تثبيت إلى إذني، فاطلبه مرة واحدة واشرح السبب بدقة.
لا تطبع أو ترسل أو تودع TELEGRAM_API_ID أو TELEGRAM_API_HASH مطلقًا. تحقق من أن Git يتجاهل ملف local.properties في جذر المشروع. إن لم يكن موجودًا، فأنشئ قالبًا آمنًا لا يحتوي إلا على sdk.dir الصحيح وعناصر نائبة للقيمتين، ثم توقف واطلب مني تعبئتهما يدويًا.
لا تبدأ البناء ولا تدفع التغييرات بعد. اختم بتقرير لا يتضمن سوى مسار المستودع، وجاهزية سلسلة الأدوات، ومسار local.properties، والإجراء التالي المطلوب مني.2 احصل على Telegram API ID وhash خاصين بك
إجراء بشري
- سجّل الدخول عبر تطبيق تيليغرام رسمي إن لم يكن لديك حساب بالفعل.
- افتح my.telegram.org، وسجّل الدخول برقم هاتفك، واختر API development tools.
- أكمل نموذج التطبيق، واختر Android، واحفظ
api_idوapi_hashالصادرين.
هذا ليس رمز بوت. يصدر تيليغرام زوجًا واحدًا لكل رقم هاتف، ويشترط معرّفًا شخصيًا للعميل الخارجي. راجع تعليمات تيليغرام الرسمية.
في جذر المستودع المستنسخ، بجوار settings.gradle، افتح local.properties واستبدل العناصر النائبة يدويًا. لا تضف علامات اقتباس:
sdk.dir=/Users/[YOUR_NAME]/Library/Android/sdk
TELEGRAM_API_ID=[YOUR_NUMERIC_API_ID]
TELEGRAM_API_HASH=[YOUR_32_CHARACTER_API_HASH]يختلف مسار sdk.dir على Windows وLinux؛ ويُفترض أن يكون الوكيل قد ملأه
بالفعل. في هذا التفريع يحقن TMessagesProj/build.gradle القيمتين في BuildConfig، ويقرأهما BuildVars.java وقت التشغيل.
ملف local.properties مدرج في .gitignore.
حتى وقت نشر هذا المقال، قارنت أيضًا قيمي الحقيقية بكل ملف في كلا الإيداعين العامين: لا يظهر api_id أو api_hash الشخصيان الخاصان بي في الشجرة الحالية ولا في سجل Git. يحتوي المصدر المستورد من upstream على زوج تيليغرام النموذجي المقيّد. هذه ليست بيانات اعتمادي، ويجب ألا تعتمد عليها في بنائك.
3 جهّز الهاتف
إجراء بشري
- افتح «حول الهاتف» وانقر «رقم الإصدار» سبع مرات. في أجهزة Xiaomi قد يسمى هذا «إصدار MIUI» أو «إصدار HyperOS».
- عُد إلى الإعدادات، وافتح «خيارات المطوّر»، وفعّل USB debugging.
- في Xiaomi، فعّل أيضًا Install via USB؛ وتتطلب بعض الطرز USB debugging (Security settings).
- صل الهاتف وهو مفتوح بكابل يدعم نقل البيانات، لا الشحن وحده.
- وافق على بصمة RSA الخاصة بالحاسوب على الهاتف؛ وخيار «Always allow» مريح.
تختلف أسماء القوائم باختلاف الشركة المصنّعة. التسلسل الأساسي موثق في دليل خيارات المطوّر الرسمي من Android. أبقِ الشاشة مفتوحة أثناء أول تثبيت: لا يستطيع الوكيل الموافقة على مربع حوار النظام نيابة عنك.
4 اطلب من الوكيل البناء والتشغيل
بعد إكمال local.properties وتوصيل الهاتف، أرسل الموجّه التالي. هذه هي تعليمات
التشغيل. أدرجت أوامر README المتوقعة، لكنك لا تحتاج إلى فهمها أو تشغيلها بنفسك.
اكتملت بيانات الاعتماد في local.properties، وهاتف أندرويد المفتوح متصل عبر USB. ابنِ التطبيق وشغّله عليه.
واصل العمل حتى تصل إلى نتيجة قابلة للتحقق. لا تُخرج TELEGRAM_API_ID أو TELEGRAM_API_HASH، وقبل أي إجراء في Git تحقق من أن local.properties غير متتبَّع.
1. شغّل adb devices -l. إذا كانت الحالة unauthorized، فاطلب مني الموافقة على مربع حوار RSA، ثم تابع.
2. تحقق من ABI عبر adb shell getprop ro.product.cpu.abilist. يبني هذا التفريع حاليًا لـarm64-v8a فقط. إذا كان الهاتف لا يدعم arm64-v8a، فكيّف إعداد ABI بأصغر تغيير واشرحه.
3. جهّز PATH وJAVA_HOME وANDROID_HOME وANDROID_SDK_ROOT؛ ووفّق إصدار CMake المثبت مع Gradle.
4. شغّل ./gradlew :TMessagesProj_App:assembleAfatDebug. أصلح أخطاء البيئة أو البناء بدلًا من التوقف عند أول خطأ.
5. ملف APK المتوقع: TMessagesProj_App/build/outputs/apk/afat/debug/app.apk. ثبّته عبر adb install -r.
6. إذا مُنع التثبيت، فاطلب مني تفعيل Install via USB. إذا أبلغ أندرويد عن تعارض في التوقيع، فلا تُزل التطبيق القديم من دون موافقتي الصريحة: إزالته تمحو بياناته المحلية.
7. شغّل الحزمة org.telegram.messenger.beta وتحقق من أن الشاشة الأولى تفتح وأن علامة تبويب Digest موجودة. استخدم adb وlogcat ولقطات الشاشة للتشخيص.
اختم بتقرير عن مسار APK وحجمه، وABI الجهاز، ونتيجة التثبيت، والحزمة/النشاط الذي شُغّل، وما ينبغي أن أتحقق منه بصريًا. لا تدفع أي شيء.تم التحقق من الإعداد الحالي على arm64-v8a: بُني ملف APK تجريبي بحجم يقارب
75 MB، وثُبّت، وشُغّل باسم org.telegram.messenger.beta. عند أول تشغيل ما زلت
بحاجة إلى تسجيل الدخول إلى تيليغرام بنفسك، وإدخال رمز الدخول وكلمة مرور المصادقة
الثنائية إن كانت مفعّلة. لا تعطِ هذه البيانات للوكيل.
5 اطلب ميزتك بلغة النتائج
بعد تشغيل التطبيق، يمكنك تغيير هذا التفريع أو تكرار العملية مع تطبيق آخر مفتوح المصدر. لا تبدأ بعبارة «أنشئ صنفًا» أو «أصلح RecyclerView». صف الوضع، والسلوك الذي يمكن ملاحظته، ومعايير القبول.
غيّر التطبيق العامل على هاتفي ليلائم سير العمل الشخصي التالي.
المشكلة: [ما أفعله يدويًا الآن أو ما ينقصني].
السلوك المطلوب: [ما ينبغي أن أراه وما ينبغي أن يحدث بعد كل إجراء].
البيانات والحالة: [ما يجب تخزينه، ومتى يُحدَّث، وما يجب أن يبقى بعد إعادة التشغيل].
الحدود: [ما يجب ألا يتغير؛ وأي الشاشات والسلوكيات الأصلية يجب أن تبقى].
تُعد المهمة منجزة عندما:
- [معيار قابل للتحقق 1]؛
- [معيار قابل للتحقق 2]؛
- [معيار قابل للتحقق 3].
اعثر أولًا على المكونات ومسارات البيانات الموجودة في المصدر. أعد استخدام واجهة التطبيق وبنيته قدر الإمكان. ثم نفّذ أصغر نسخة مكتملة، وابنها، وثبّتها على الهاتف المتصل، وتحقق بنفسك من كل معيار. اعرض النتيجة في لقطة شاشة واسرد المقايضات. لا تدفع التغييرات من دون تعليمات منفصلة.6 عالج الإحساس، لا نجاح التجميع وحده
نجح أول بناء لـDigest، لكن الموجز كان يرتج قليلًا عند تحميل مزيد من العناصر. لم يتضمن الموجّه التالي تشخيصًا، بل ملاحظة وطلبًا لنتيجة مقيسة فحسب:
على الهاتف الفعلي، يرتج الموجز عند تقسيم الصفحات أثناء التمرير. أعد إنتاج المشكلة بنفسك، وقِس الإطارات المتعثرة / زمن الإطار، واعثر على السبب، وأصلحه من دون تغيير سلوك الموجز، وأعد تثبيت APK، ثم كرر القياس نفسه. لا تعتبر المهمة منجزة لمجرد أن الشفرة تتجمّع بنجاح.عثر الوكيل على تحديث كامل للقائمة أثناء تقسيم الصفحات واستبدله بتحديث تدريجي. في القياس المكرر، انخفضت نسبة الإطارات المتعثرة من 11.9% إلى 2.1%، بينما انخفض زمن الإطار عند المئين 99 من 40 إلى 22 مللي ثانية. وصفت عيبًا بصريًا آخر بكلمات أبسط: «انقل الزر فوق شريط التنقل السفلي وأزل العنصر الشاذ في الوسط، مع الحفاظ على اسم القناة». والحل الوسط النهائي هو ترويسة تعرض الاسم فقط: لا تُرسم الصورة الرمزية للمرسل التي كانت تسبب العنصر الشاذ. هذه الحلقة — انظر، وسمِّ العيب، ودع الوكيل يعيد إنتاجه، ثم تحقق — أهم من موجّه أول مثالي.
قبل النشر، استخدم موجّه أمان منفصلًا
وجود APK عامل لا يجعل المستودع آمنًا. قبل الدفع، اطلب من الوكيل فحص الملفات المتتبعة وكل السجل الذي سيُنشر بحثًا عن الأسرار، وإظهار الفرق عن upstream، والحفاظ على الترخيص، وتجنّب تقديم APK تجريبي كما لو كان عميلًا رسميًا.
جهّز التغييرات للنشر، لكن نفّذ أولًا تدقيقًا للأمان والترخيص.
افحص git status وgit diff وكل ملف متتبَّع والسجل الكامل الذي سيُنشر بحثًا عن TELEGRAM_API_ID وTELEGRAM_API_HASH الحقيقيين الخاصين بي، والرموز، وكلمات المرور، ومفاتيح التوقيع، والمسارات المطلقة الخاصة. لا تطبع أي قيمة سرية تعثر عليها؛ أبلغ فقط عن نوعها وملفها وطريقة آمنة لمعالجتها. تحقق من أن local.properties مُهمَل ولم يسبق تتبعه.
قارن التغييرات مع upstream، وحافظ على ترويسات حقوق النشر والتزامات الترخيص. اذكر في README أن هذه نسخة شخصية غير رسمية، وما الإصدارات وواجهات ABI التي اختُبرت، وأين يجب إدخال بيانات الاعتماد محليًا، وكيفية بناء APK.
اعرض لي القائمة النهائية للملفات ونتيجة التدقيق. لا تودع التغييرات ولا تدفعها إلا بعد موافقتي الصريحة.يوزّع Telegram for Android بموجب GNU GPL v2 أو أي إصدار لاحق، ولذلك يحتفظ التفريع بالترخيص ويجعل المصدر متاحًا. وهناك التزام عملي أيضًا: صُن تفريعك، وراجع الفرق فيه، ولا تتعامل مع الشفرة المولّدة كأنها جديرة بالثقة تلقائيًا. يخفض الوكيل تكلفة التنفيذ بصورة جذرية؛ لكنه لا يلغي مسؤولية المالك.
ليس تطبيقًا للجميع — بل تطبيق لك أنت بالضبط
يجب أن يختار المنتج الموجّه للسوق العام ميزات منطقية لملايين الناس. أما النسخة الشخصية فيمكن أن تكون غريبة وضيقة ومثالية لشخص واحد. هنا يغيّر الوكلاء البرمجيات أكثر من أي موضع آخر: لا تحتاج إلى تأسيس شركة ناشئة أو انتظار تصويت على طلب ميزة لسنوات. أحيانًا يكفي مستودع مفتوح، ووصف دقيق، وكابل USB، واستعداد لفحص النتيجة.
لم تصبح الشفرة عديمة الفائدة. بل أصبحت أقل ندرة بكثير. وازدادت تبعًا لذلك قيمة حقك في أخذها وتغييرها وتشغيلها على جهازك.
الطريق المختصر
- اختر مصدر أندرويد مفتوحًا ودع الوكيل يجهّز سلسلة الأدوات.
- احصل بنفسك على بيانات الاعتماد الخاصة واحفظها في ملف محلي مُهمَل وحده.
- فعّل خيارات المطوّر وUSB debugging، ثم صل هاتفًا مفتوحًا.
- كلّف الوكيل ببناء APK وتثبيته وتشغيله والتحقق منه.
- صف الميزات عبر السلوك ومعايير القبول.
- كرّر التحسين على جهاز حقيقي، ثم دقق الأسرار والترخيص بصورة منفصلة قبل أي دفع.
أسئلة شائعة سريعة
هل يستطيع شخص غير مطوّر تعديل تطبيق أندرويد فعلًا باستخدام وكيل ذكاء اصطناعي؟
نعم، عندما يكون المصدر متاحًا ويمكن التحقق من المهمة على جهاز. ما زلت بحاجة إلى وصف السلوك المطلوب، والموافقة على الإجراءات الحساسة، وإضافة بيانات الاعتماد الخاصة محليًا، واختبار النتيجة؛ لكن الوكيل يستطيع تولّي معظم أعمال المستودع وسلسلة الأدوات والبناء والتثبيت وتصحيح الأخطاء.
أين أضع api_id وapi_hash الخاصين بتيليغرام في هذا التفريع؟
أنشئ local.properties في جذر المستودع وأضف TELEGRAM_API_ID وTELEGRAM_API_HASH من دون علامات اقتباس. يتجاهل Git الملف، ويحقن Gradle القيمتين في BuildConfig وقت البناء.
ما الذي يجب أن أفعله على هاتف أندرويد؟
فعّل خيارات المطوّر بالنقر على «رقم الإصدار» سبع مرات، وفعّل USB debugging، وصل هاتفًا مفتوحًا بكابل بيانات، ووافق على بصمة RSA الخاصة بالحاسوب. وقد تتطلب أجهزة Xiaomi أيضًا تفعيل Install via USB.