أبريل 2018. كنت في الرابعة عشرة من عمري ولعبنا في مسابقة "Clover" الشهيرة على الإنترنت من فكونتاكتي. كان أحدنا (عادةً أنا) وراء الكمبيوتر المحمول دائمًا لمحاولة طرح الأسئلة بسرعة على google والبحث في نتائج البحث عن الإجابة الصحيحة. لكن فجأة أدركت أنني كنت أفعل نفس الشيء في كل مرة ، وقررت أن أحاول كتابته في بيثون 3 ، المعروف جزئيًا في ذلك الوقت.
الخطوة 0. ما الذي يحدث هنا؟
بادئ ذي بدء ، سوف أقوم بتحديث في الذاكرة الخاصة بك ميكانيكا "البرسيم".
تبدأ اللعبة للجميع في نفس الوقت - الساعة 13:00 و 20:00 بتوقيت موسكو. للعب ، تحتاج إلى الدخول إلى التطبيق في هذا الوقت والاتصال بالبث المباشر. تستمر اللعبة 15 دقيقة ، يتم خلالها إرسال الأسئلة إلى المشاركين على الهاتف
في نفس الوقت . الجواب
10 ثواني. ثم يتم الإعلان عن الإجابة الصحيحة. كل من خمن يذهب أبعد من ذلك. هناك 12 سؤالًا في المجموع ، وإذا أجبت على جميع الأسئلة ، فستحصل على جائزة نقدية.

اتضح أن مهمتنا هي التقاط أسئلة جديدة على الفور من خادم Clover ومعالجتها من خلال محرك بحث وتحديد الإجابة الصحيحة بناءً على نتائج البحث. تقرر إخراج الإجابة في روبوت telegram بحيث تظهر إخطارات منه على الهاتف مباشرة أثناء اللعبة. وكل هذا مرغوب فيه في بضع ثوان ، لأن وقت الاستجابة محدود للغاية. إذا كنت تريد أن ترى كيف أن قانون العمل بسيط إلى حد ما ، ولكن النظر إلى هذا الرمز (سيكون مفيدًا للمبتدئين) ساعدنا في التغلب على Clover - مرحبًا بك في هذا المقطع.
الخطوة 1. الحصول على أسئلة من الخادم
في البداية بدا الأمر أصعب المراحل. لقد أخذت نفسًا عميقًا بالفعل وكنت مستعدًا للتسلق إلى براري مثل رؤية الكمبيوتر أو اعتراض حركة المرور أو إلغاء ترجمته من التطبيق ... عندما انتظرت فجأة مفاجأة - لدى Clover واجهة برمجة تطبيقات مفتوحة! لم يتم توثيقه في أي مكان ، ولكن إذا كان أثناء اللعبة ، وبمجرد طرح سؤال على جميع اللاعبين ، قدم طلبًا على api.vk.com ، ثم ردًا على ذلك ، سنحصل على خيارات الأسئلة والإجابة عليها في JSON:

https://api.vk.com/method/execute.getLastQuestion?v=5.5&access_token=VK_USER_TOKEN
باعتباره access_token ، من الضروري نقل رمز واجهة برمجة التطبيقات (API) لأي مستخدم من مستخدمي VKontakte ، ولكن من المهم أن يكون قد صدر في الأصل خصيصًا لـ Clover. app_id له هو 6334949.
الخطوة 2. نعالج المشكلة من خلال محرك البحث
كان هناك خياران: استخدام واجهة برمجة تطبيقات محرك البحث الرسمي أو إضافة وسيطات بحث مباشرة إلى شريط العناوين ، وتحليل النتائج. في البداية جربت التجربة الثانية ، لكنني لم أقم بالتقاطها في بعض الأحيان فحسب ، بل فقدت أيضًا الكثير من الوقت ، لأن الصفحات تم تحميلها في المتوسط خلال ثانيتين. وأذكرك أنه من المستحسن أن نلتقي بهذين الثواني. حسنًا والشيء الرئيسي - لم أحصل على نصوص كبيرة ومهيكلة من محركات البحث حول الموضوع الضروري ، نظرًا لأن أجزاء صغيرة فقط من المواد الضرورية ، والتي تسمى
المقتطفات ، معلقة على صفحة البحث:

لذلك بدأت أبحث عن API. لم تناسب Google - كانت حلولهم محدودة للغاية وأرجعت القليل جدًا من البيانات. تبين أن
Yandex.XML هو الأكثر سخاءً - فهو يسمح لك بإرسال 10000 طلب يوميًا ، وليس أكثر من 5 طلبات في الثانية ، وإرجاع البيانات بسرعة كبيرة. طلب ذلك هو اختياريا عدد الصفحات (حتى 100) وعدد الفقرات - القيم الخاصة التي يتم استخدامها لتشكيل القصاصات. نحصل على البيانات في XML. ومع ذلك ، هذه كلها نفس القصاصات.
حتى تتمكن من التعرف على ما تعود إليه Yandex واللعب به ، إليك مثال على إجابة على استعلام "ما هو اسم الخصم الرئيسي في سلسلة الفيديو" The Legend of Zelda؟ ":
Yandex. قيادةكنت محظوظًا ، واتضح أنه في pypi ، توجد بالفعل وحدة
بحث منفصلة عن
yandex لهذا الغرض. لذا ، حاولت أن أحصل على السؤال من الخادم ، وأجده في ياندكس ، وقم بنص نص واحد كبير من المقتطفات وتقسيمه إلى جمل:
import requests as req import yandex_search import json apiurl = "https://api.vk.com/method/execute.getLastQuestion?access_token=VK_USER_TOKEN&v=5.5" clever_response = (json.loads(req.get(apiurl).content))["response"]
الخطوة 3. البحث عن الإجابات
في البداية ، كانت مهمة التعرف بدقة على الإجابة وفقًا للقصاصات غير واقعية بالنسبة لي (أذكرك بأنه في وقت كتابة الرمز ، كنت مبتدئًا مطلقًا). لذلك ، قررت أولاً تبسيط المهمة التي قمنا بها من خلال البحث اليدوي.
ماذا فعل أصدقائي وأنا عندما أقود سؤالك إلى محرك بحث؟ بدأوا ينظرون بسرعة من خلال عيون للحصول على إجابات في النتائج. ما هي مشكلة هذا النهج؟ في
الرسائل المتعددة ، يوجد عدد كبير من العناصر غير الضرورية ، لا تحتوي على معلومات حول الإجابات والمقترحات. البحث مع عيني استغرق أحيانا وقتا طويلا. لذلك ، فإن أول شيء قررت أن أقوم به هو اختيار كل الجمل مع ذكر أي من الإجابات وعرضها حتى نبحث عن إجابة في نص صغير للغاية يحتوي على المعلومات التي نحتاجها بدقة.
hint = []
يبدو أن الحصول على العروض الصحيحة ، وقراءتها والإجابة بشكل صحيح. لكن ماذا لو لم نجد جملة واحدة؟ في هذه الحالة ، قررت تقليم الكلمات حتى لا تفوتها إذا كانت في حالة أخرى. وكذلك لالتقاط تلك التي يتم تشكيلها من المصدر. باختصار ، قمت بتقليص نهايتها إلى حرفين:
if len(hint) == 0: def cut(string): if len(string) > 2: return string[0:-2] else: return string short_ans1, short_ans2, short_ans3 = cut(ans1), cut(ans2), cut(ans3) for pred in itemslist:
ولكن حتى بعد شبكة الأمان هذه ، لا تزال هناك حالات عندما ظل التلميح فارغًا ، وذلك ببساطة لأن النتائج لم تمس دائمًا الإجابات. قل للسؤال
"أي من هؤلاء الكتاب لديه قصة ، سميت تمامًا مثل أغنية المجموعة Bi 2؟" لا توجد إجابة دقيقة يمكن العثور عليها. في هذه الحالة ، لجأت إلى النهج المعاكس - لقد سألت عن الإجابات واستخلصت الخيار بناءً على عدد المرات التي يتم فيها ذكر الكلمات من السؤال في النتائج.
if len(hint) == 0: questionlist = question.split(" ") blacklist = ["", "", '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] for w in questionlist: if w in blacklist: questionlist.remove(w) yandex_ans1 = yandexfind(ans1) yandex_ans2 = yandexfind(ans2) yandex_ans3 = yandexfind(ans3)
في هذه المرحلة ، اكتسب البرنامج النصي الوظائف الأساسية. والآن ، بعد أسبوع ونصف فقط من إطلاق Clover ، نحن نجلس ونلعب بالفعل مع مثل هذا "الغش" العصامي. من المفترض أن تكون قد شاهدت وجوهنا مع صديق عندما
فزنا في اللعبة لأول مرة
من خلال قراءة الاقتراحات في سطر الأوامر كما لو كان بالسحر!
الخطوة 4. عرض إجابات واضحة
ولكن سرعان ما أصبح هذا التنسيق متعبًا. أولاً ، كان عليك أن تجلس مع كل كمبيوتر محمول في كل لعبة. ثانياً ، سأل الأصدقاء أنفسهم عن البرنامج النصي ، وقد سئمت من شرح للجميع كيفية إدخال رمز VKontakte الخاص بهم ، وكيفية تكوين Yandex.XML (مرتبط بـ IP ، أي أنه كان من الضروري إنشاء حساب لكل مستخدم للبرنامج النصي) وكيفية تثبيت بيثون على الكمبيوتر.
سيكون أفضل بكثير إذا ظهرت الإجابات في إعلامات الدفع على الهاتف مباشرة أثناء اللعبة! مجرد إلقاء نظرة على الجزء العلوي من الشاشة والإجابة كما هو مكتوب في إشعار الدفع! ويمكنك تنظيم هذا للجميع إذا أنشأت قناة برقية للنص! رائع!
لكن مجرد عرض الجمل نفسها في البرقيات ليس خيارًا. قراءتها من هاتفك غير مريحة للغاية. لذلك ، كان عليّ أن أتعلم البرنامج النصي بنفسي لأتفهم الإجابة الصحيحة.
نحن نستورد
telebot ونغير جميع وظائف
print () إلى
send_tg () و
notsure () ، والتي
سنستخدمها في الطريقة الأخيرة ، نظرًا لأنها تفوتها كثيرًا أكثر من غيرها:
def send_tg(ans): bot.send_message("@autoclever", str(ans).capitalize()) print(str(ans)) return def notsure(ans): send_tg(ans.capitalize() + ". !") hint.append("WE TRIED!")
وفي تلك اللحظة ، أدركت أن المقتطفات أفضل بكثير من النصوص الطويلة! لأن محرك البحث يحاول جاهداً
تقديم إجابة لطلبنا ، وليس فقط العثور على تطابقات في الكلمات. وقد نجح - غالبًا ما كانت المقتطفات تحتوي على الإجابات الصحيحة أكثر من الإجابات الخاطئة ، أي أنه لم تكن هناك حاجة لتحليل النص. وأنا ، في الواقع ، لم أكن أعرف كيف.
لذلك نحن بسيطون لحساب ذكر الكلمات في النتائج:
anscounts = { ans1: 0, ans2: 0, ans3: 0 } for s in hint: for a in [ans1, ans2, ans3]: anscounts[a] += s.count(a) right = (max(anscounts, key=anscounts.get)) send_tg(right)
ماذا حدث كنتيجة:

مزيد من مصير
في الإنصاف ، يجب أن أقول أنني لم تنجح في آلة الموت. في المتوسط ، أجاب الروبوت بشكل صحيح فقط 9-10 من أصل 12 سؤالا. إنه أمر مفهوم ، لأن هناك أشخاصًا صعبين لم يستسلموا لتحليل بحث ياندكس. لقد تعبت أنا وأصدقائي من الطيران باستمرار على بضعة أسئلة وانتظار لعبة ناجحة ، والتي سيجيب فيها الروبوت في النهاية على كل شيء بشكل صحيح. لم تحدث معجزة ، لم أكن أريد حقًا تعديل النص بعد ذلك ، وبعد أن توقفت عن الأمل في تحقيق نصر سهل ، تخلى عن اللعبة.
مع مرور الوقت ، بدأت فكرتي تتسلل إلى رؤوس المطورين الشباب الآخرين. بحلول غروب 2018 ، كان هناك ما لا يقل عن 10 روبوتات ومواقع تعرض تخميناتهم بشأن المشكلات في Clover. المهمة ليست صعبة للغاية. لكن الأمر المثير للدهشة هو أنه لم يسبق لأي منهم أن عبَّر عن أسئلة من 9 إلى 10 أسئلة في كل لعبة ، ثم تراجع جميعها إلى 7-8 على الإطلاق ، مثل روبوتي. من الواضح أن مجمعي الأسئلة أوضحوا كيفية إعداد الأسئلة بحيث يكون عمل محركات البحث غير ذي صلة.
لسوء الحظ ، لم يعد بالإمكان الانتهاء من برنامج الروبوت ، لأنه في 31 كانون الأول (ديسمبر) قضى كلوفر البث الأخير ، ولم يكن لدي أي أسئلة. ومع ذلك ، كانت تجربة رائعة للمبرمج المبتدئ. وبالتأكيد سيكون هناك تحد كبير للمتقدمين - فقط تخيل كلمة 2vec و text2vec duo ، طلبات غير متزامنة إلى Yandex و Google و Wikipedia في نفس الوقت ، مصنّف متقدم للأسئلة وخوارزمية لإعادة صياغة السؤال في حالة الفشل ... Eh! ربما ، لمثل هذه الفرص ، أحببت هذه اللعبة أكثر من اللعب نفسه.