Wie ich gegen Diebstahl gekämpft habe ... mit PHP


Wenn wir täglich für Dienstleistungen bezahlen, handelt es sich um einen Kauf von Dienstleistungen.
Wenn wir täglich für nichts bezahlen (manchmal ohne es zu wissen), ist das Diebstahl.

Guten Tag, Leser von Habr!

Wie alles begann


Ich wollte weniger stehlen und lass uns dagegen ankämpfen! Aber manuell war es sehr anstrengend, lang und ineffektiv, dann kam die Idee auf, dieses Geschäft irgendwie zu automatisieren.

Über welchen "Diebstahl" habe ich? Über wo wir im Internet gehen, klicken Sie auf die Schaltfläche "Video ansehen", eine Seite wird geladen, aus irgendeinem Grund wird das Video nicht abgespielt, wir gehen und gehen weiter, aber tatsächlich haben wir "freiwillig" den Dienst aktiviert, um was zu erhalten etwas, das noch niemand für eine Schutzgebühr von 30 Rubel pro Tag von seinem Mobilkonto aus gesehen hat. Bei Menschen wird dies als Wap-Click- oder Mobilabonnement bezeichnet, und Mobilfunkbetreiber haben eine Vielzahl schöner Namen. Nehmen Sie den Diebstahl von Videotasten dennoch nicht in die Liste der Dienste auf.

Hier ist ein bisschen mehr Detail. Und hier ist eine Geschichte über einen guten Weg, um "Geld zu verdienen".

Es gibt viele beschriebene Fälle von nicht ganz freiwilligen Abonnements, zum Beispiel diesen. Ungeschrieben - viel mehr.

Wrestler haben auch:


Was und warum wurde automatisiert


Suchen und blockieren Sie Anzeigen im Google AdSense-Publisher-Bereich.
Ziel ist es, die Effizienz des Blockierens zu erhöhen und die für die manuelle Reinigung aufgewendete Zeit freizugeben.

Das Wesentliche des Problems und die verfügbaren Lösungen
Viele Jahre lang (die erste Erwähnung einer ähnlichen Sache, die ich fand, war im Sommer 2014) haben Verlage die Ströme von „Jakubowitschs Tod“, „Steinaufstehern“, „Video ansehen, klicken“ und anderen bösen Geistern ( Anfang , Fortsetzung ) manuell erfasst fast keine Automatisierung 1 und es schien fast unmöglich.

1 Es gibt (mindestens einmal) zwei Lösungen, aber sie haben ziemlich ernsthafte Anforderungen, die sich nicht jeder leisten kann.
Diese Lösungen:

  1. AdSense-Reiniger . Es braucht viel extra. Software.
  2. AdsAutomation . Das Skript zur Steuerung des Google Chrome-Browsers (so wie ich es verstehe, auf ZennoPoster). Ein separater PC ist erforderlich. Und im Moment wurde das Projekt von GitHub gelöscht.

Wenn Sie eine Software erstellen, die die Person ersetzt, die die Anzeige blockiert, muss dies unter Berücksichtigung einer Reihe von Anforderungen erfolgen:

  • sollte an der Hardware und Software arbeiten, die fast alle Websitebesitzer haben;
  • Benötigen Sie keine zusätzliche Software und ändern Sie die vorhandenen Einstellungen.
  • Einfach zu installieren und zu konfigurieren, damit der durchschnittliche Benutzer liefern kann.
.

Im Allgemeinen hat PHP (mit CURL) das Zeug dazu. Sie können direkt auf Ihre Website hochladen und ohne zusätzliche Computer und andere Schwierigkeiten arbeiten.

Und eine Verfeinerung der Anforderungen.
Da die Lösung in PHP automatisiert und daher über Cron ausgeführt werden sollte, sollte die Speicherung von Benutzereinstellungen und temporären Daten auf der Festplatte erfolgen (nicht in einem Cookie). In Cookies wird nur der Schlüssel für den Zugriff auf das Control Panel gespeichert. Für die Elite, die nicht in der Lage ist, cron zu konfigurieren, aber einen Tab auf einem PC / Tablet / Smartphone offen halten kann, wird die Möglichkeit hinzugefügt, regelmäßig einen Timer auf Javascript auszuführen.

Was der Anfang oder die Google-API vorausgesehen hat


Und für AdSense gibt es eine API, die ich irgendwie aus den Augenwinkeln gesehen habe und nicht tief gegangen bin. Jetzt ist die Zeit zum Eintauchen. Es gibt viele Möglichkeiten, aber es stellte sich heraus, dass auch hier nichts über die API für die CPU beschrieben wurde . Möchten Sie Anzeigen sehen, die sich auf der Website drehen, bitte - manuell.

Starten Sie


Die Google AdSense-Oberfläche basiert auf AngularDart. Alles scheint aus Sicht des Geräts schön und recht kompliziert zu sein.

Zunächst habe ich mir die Google Chrome-Entwicklertools auf der Registerkarte "Netzwerk" angesehen, um zu "belauschen", wie diese ausgefeilte Benutzeroberfläche mit dem Server kommuniziert. Es gab dort viele Anfragen, die interessantesten für mich waren im Abschnitt „XHR and Fetch“, und dort fand ich etwas, das ziemlich erraten aussah, wenn Sie sorgfältig überlegen. Zum Beispiel eine der Post-Anfragen:

Die übertragene Zeichenfolge.
{"method":"searchArcApprovals","params":"{\"1\":\"ca-pub-8958890276790964\",\"2\":{\"1\":0,\"2\":1,\"3\":0,\"4\":{\"1\":{\"1\":\"AClZvXKL6S3HChRty5YBa81BLWDBQkb3FYDsifZ9V/mBTKbOGlj3gMWVpzTtXggA1880Le9NyVZIicNm/4pz724e/MO8fyLfjOReF205cyjLV9C8OCCeKe7VvZHyvyKpXh8x9smTQ0n8qIIqzuIXle5UK0hD4VBkZDvy//qoSPRCr94UtWYqqi//Rot22LJ2JFNjWEGb4n1YQbAw0cKWPR3LAugPBajInWXEFGWJRTnmY2TkI5VzUzIkcXpJ/bkajn3c8GnecCfFNvNhGLS10VXdRwiykngG3xfoMTRhQOR5GXbm4kwdIhzQUM/d6xP0Xda3FOIZGGk9bymneg+9oDY+rMFiRfDFCb66g50t9J9r++oHXjek09Ci1rqC7LOw2pvkqp3hjG6RyVmsiT/eWGq+OsfjE7CgRk43QIRMSa+jlZBQhARUPlpUXzyZyoTiIPTRZ5ND/4MnIMqaUWSRoDGffiE/XkHJPEkNZtLX2XR5gZ3x5/K+ejU/fqxfZIjI6A3kueJybNA46wSLbmflhDCGDJEE2aeYemLFGqNzFG43B80LzU3yuwgZhrLu/jaMvBJozi0nq+gXEz6r+8tic4fvsQ9lWDA+IXzXw6MKzamgfWV0ORGDW0+966KIY6IkjtIlNRKGyp3pSAd2Po+br4Dl4WNwSkMdmuV60wOrkb5BpnKZKIhDtpjWF7q6ly3FFhwo8Ktdq5ddVJ8ijJ9Y9tQhs2O0idA9N0yV86khV1IQ72OgbMv15qAswnbqF9WCo3qpfJNjJqMCHBRTohPCxhRp0cWz2thszZTmDDADPxU46sclnurd/JxHFO7lJZVdrsFB4vdLIx9kObV3bP1gOpU66kdcmom2tiedknugj7s0jLcgf1EfXnp+SUUAQyoqwS+kdhhQtGqSXgI2TopsuaLVzj+EtAuPwWeLvtI9CFPSe4o2x+gjCRPl8wVvWKV5FIrZavUVOAHZIL4nKyJjHxZi3jPfVnAia/hq1gW6XKoCg1eWGg/cAWZY4mZYQ6W4XnC0MY0uMC6fhPQdXnIS5iLZNhan80jbr/leBr4fO22+tXc6oZpZsDkXd0r3ilBJFPS2I/zAhotuzZgNA+nF2N86pyiSrdeEYFDhKWKadcKAVc3BMxxlrqZYcAXnlus9GW7R9F/ImXQ/fjRfSjVRUaJuQ0EnFejNAwdGcS6STYMa1G0wnNMAKcZ52xcHgil1SZ6N9BQ7A27z6eViOxw0LHBqNJIRZwQml2KjPd5b00D9XvohDr6jBqYXLGS/HMVvpGDJZLDI2LRlmkqBqx7YEgDZqvspeoMLHIJP22SkQDnaJtsOLGVBSi20ZD5nRyjAgS6MmcgFCvfJVWjCIL1RPHqmUU90eK4WXve0ayH9cJnpbtWrkXYCibhVPCMmYowMROw7rI4bPir0\"}}}}","xsrf":"ABOvogKvrE9fIqAKh0w02RIsB4OJ4hsB_g:1535467885347"} 

In der Anfrage ist die Kennung des Herausgebers sofort sichtbar, unter dem zweiten Absatz eine Reihe von Parametern, deren Wesen experimentell bestimmt werden kann, und das XSRF-Token.

Als Antwort erhält er detaillierte Informationen über die Ankündigung, jedoch nicht alle ohne die Ankündigung selbst (im Folgenden wurden die in base64 verlängerten Bilder zugeschnitten).

Ein Blatt mit mehreren Seiten.
 {"result":{"1":[{"1":0,"3":0,"4":{"1":"AClZvXJ2t4wiEZ/VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLGRcoQdDt+wOk46bdr0yA\u003d"},"5":{"1":82,"2":0,"3":0,"4":"\u003cdiv id\u003d\"ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60\"\u003e\u003c/div\u003e","5":"\u003cdiv id\u003d\"ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60\"\u003e\u003c/div\u003e","6":"\u003cdiv\u003e\u041c\u043d\u043e\u0433\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0435\u003cspan id\u003d'multi-format-tooltip'\u003e\u003c/span\u003e\u003c/div\u003e\u003ca class\u003d'arc-url-link-ellipsis' target\u003d'_blank' href\u003d'https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/' title\u003d'https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/'\u003ehttps://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\u003c/a\u003e","7":"\u003cdiv class\u003d'arc-one-by-one-legend'\u003e\u0422\u0438\u043f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003e\u041c\u043d\u043e\u0433\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0435\u003cspan id\u003d'multi-format-tooltip'\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-legend'\u003e\u0426\u0435\u043b\u0435\u0432\u043e\u0439 URL\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003e\u003ca class\u003d'arc-url-link-ellipsis' target\u003d'_blank' href\u003d'https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/' title\u003d'https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/'\u003ehttps://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\u003c/a\u003e\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-legend'\u003e\u0414\u043e\u043c\u0435\u043d\u044b \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003e4aynikam.ru\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003eandroidphone.su\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003eandroidphones.ru\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003efull-repair.com\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003ehowgadget.com\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-legend'\u003e\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u043a\u043b\u0430\u043c\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u003cspan id\u003d'adx-advertiser-tooltip'\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv class\u003d'arc-one-by-one-data'\u003eDNS Shop\u003c/div\u003e","8":"\u003cdiv\u003e\u003cspan class\u003d'arc-impression-score high'\u003e\u0412\u042b\u0421\u041e\u041a\u041e\u0415\u003c/span\u003e \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u043e\u0432\u003c/div\u003e","9":{"1":"\u003ca href\u003d\"https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\" target\u003d\"_blank\"\u003e\u003cimg onerror\u003d\"this.src\u003d'data:image/gif;base64,RA7'\" src\u003d\"https://www.google.com/webpagethumbnail?c\u003d58\u0026s\u003d400:400\u0026r\u003d4\u0026d\u003dhttps://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\u0026a\u003dAIYkKU9ZGGjFTOWtm771MQwgDYxqtlBLCw\" border\u003d0 alt\u003d\"\"\u003e\u003c/a\u003e","2":"\u003ca href\u003d\"https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\" target\u003d\"_blank\"\u003e\u003cimg onerror\u003d\"this.src\u003d'data:image/gif;base64,R0AA7'\" src\u003d\"https://www.google.com/webpagethumbnail?c\u003d58\u0026s\u003d400:400\u0026r\u003d3\u0026d\u003dhttps://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\u0026a\u003dAIYkKU_CQ2K6v5f11Nk1RXtc87FtmG2B1w\" border\u003d0 alt\u003d\"\"\u003e\u003c/a\u003e","3":"\u003ca href\u003d\"https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\" target\u003d\"_blank\"\u003e\u003cimg onerror\u003d\"this.src\u003d'data:image/gif;base64,R0lAA7'\" src\u003d\"https://www.google.com/webpagethumbnail?c\u003d58\u0026s\u003d400:400\u0026r\u003d6\u0026d\u003dhttps://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/\u0026a\u003dAIYkKU_My0a48LAsW-ZKpQX-ATXkMoPEVg\" border\u003d0 alt\u003d\"\"\u003e\u003c/a\u003e"},"10":"https://adwords-displayads.googleusercontent.com/da/b/preview.js?client\u003dasfe-arc-external-preview\u0026obfuscatedCustomerId\u003d5240877441\u0026creativeId\u003d288930210411\u0026htmlParentId\u003dad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60\u0026sig\u003dACiVB_yMUjLwDjRO2T-0VAaVuRPt8uLHGQ","13":"https://adwords-displayads.googleusercontent.com/da/b/preview.js?client\u003dasfe-arc-external-preview\u0026obfuscatedCustomerId\u003d5240877441\u0026creativeId\u003d288930210411\u0026htmlParentId\u003dad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60\u0026showVariations\u003dtrue\u0026sig\u003dACiVB_yMUjLwDjRO2T-0VAaVuRPt8uLHGQ","14":"https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/","15":"","17":"","18":"DNS Shop","20":"adv-5594449542310820","21":["site1.ru","site2.com","site3.com","site4.ru"]},"6":{"5":"-6668648012302470727","7":["DNS"],"9":0},"7":1,"9":{"3":[{"1":{"1":"AClZvXLE9HJbFYq9TrAsXFgV4YkXsQt9lXp1xWjSB5aT5bFBpe4VNgo\u003d"},"2":"\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438","3":"\u0422\u043e\u0432\u0430\u0440\u044b \u0438 \u0443\u0441\u043b\u0443\u0433\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},{"1":{"1":"AClZvXKrUJJ3kKBen2scP56BynOtGhf160i1F1LLmtBj3b/oh2dUFg8\u003d"},"2":"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b","3":"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u043e\u0442\u043e\u0432\u044b\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u043e\u0432\u0430\u0440\u043e\u0432. \u0412 \u044d\u0442\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0430\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440\u044b \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432."},{"1":{"1":"AClZvXL4W+khZ4O9SJiu97cTbTs2+0Wecf1IVNju8ffd4ysIT9PJ7XY\u003d"},"2":"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b \u0438 \u0430\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440\u044b \u0434\u043b\u044f \u043d\u0438\u0445","3":"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440\u044b \u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0435\u0445\u043b\u044b, \u043c\u043e\u043d\u043e\u043f\u043e\u0434\u044b \u0434\u043b\u044f \u0441\u0435\u043b\u0444\u0438, \u0437\u0430\u0449\u0438\u0442\u043d\u044b\u0435 \u044d\u043a\u0440\u0430\u043d\u044b \u0438 \u0437\u0430\u0440\u044f\u0434\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430."},{"1":{"1":"AClZvXLQ3gPoVwjQbokDpB3+nni4xURwH5+YlnwkqjYtUowjhiKvk8Q\u003d"},"2":"\u041f\u041a \u0438 \u0431\u044b\u0442\u043e\u0432\u0430\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0430","3":"\u0422\u043e\u0432\u0430\u0440\u044b, \u0443\u0441\u043b\u0443\u0433\u0438 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0431\u044b\u0442\u043e\u0432\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u043e\u0439."},{"1":{"1":"AClZvXLKYOGgOROaa32IUxU15jP89AtTM4dV24WKS+daMhqJMTNmeSY\u003d"},"2":"\u0422\u0435\u043b\u0435\u0444\u043e\u043d\u0438\u044f","3":"\u0422\u043e\u0432\u0430\u0440\u044b, \u0443\u0441\u043b\u0443\u0433\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0438\u0435\u0439 \u0438 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e."}]},"10":{"1":"AClZvXLdGOShgJo+BM3apOUAFzQkE41z1/hiZhIY8eUlC7p7xXPm82P3dq7yXhbEI+tN/YHgdH4P"}}],"2":0.0,"3":"60609","4":1,"5":"","6":"ClD3Z2nP2P/////1/ff99fXV98nMyMrJz8rH9fHV883Hx8bMz83Oz8vOzv8A/v/+9f33/fX11ffJzMjKyc/Kx/Xx1fPNx8fGzM/Nzs/Lzs7//hABIWxUk293Pm+qOQAAAAAnMJaYSAFQAFoLCS8wxxaTatL1EAJgp7737gY\u003d","7":"3639","9":0},"xsrf":"ABOvogKaRsVZECZZJU-gDWrOqoP0CSqf7Q:1535467886413"} 

Nach json_decode sieht es ungefähr so ​​aus:

Ein Objekt aus einer JSON-Zeichenfolge (Vorsicht, 175 Zeilen).
 Objekt (stdClass) # 19 (2) {
   ["Ergebnis"] =>
   Objekt (stdClass) # 18 (8) {
     ["1"] =>
     Array (1) {
       [0] =>
       Objekt (stdClass) # 1 (8) {
         ["1"] =>
         int (0)
         ["3"] =>
         int (0)
         ["4"] =>
         Objekt (stdClass) # 2 (1) {
           ["1"] =>
           Zeichenfolge (120)
         }}
         ["5"] =>
         Objekt (stdClass) # 3 (17) {
           ["1"] =>
           int (82)
           ["2"] =>
           int (0)
           ["3"] =>
           int (0)
           ["4"] =>
           Zeichenfolge (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </ div>"
           ["5"] =>
           Zeichenfolge (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </ div>"
           ["6"] =>
           string (355) "<div> Multi-Format <span id = 'Multi-Format-Tooltip'> </ span> </ div> <a class = 'Bogen-URL-Link-Auslassungspunkte' target = '_ blank' href = ' https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/ 'title =' https: //www.dns-shop.ru/actions/c09a061b-a048-11e8-9547- 00155d03330d / '> https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/ </a> "
           ["7"] =>
           string (1066) "<div class = 'arc-one-by-one-legend'> Anzeigentyp </ div> <div class = 'arc-one-by-one-data'> Multi-Format <span id = 'multi -format-tooltip '> </ span> </ div> <div class =' ​​arc-one-by-one-legend '> Ziel-URL </ div> <div class =' ​​arc-one-by-one-data '> <a class =' ​​arc-url-link-ellipsis 'target =' _ blank 'href =' https: //www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/ 'title = 'https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/'>https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d / </a> </ div> <div class = 'arc-one-by-one-legend'> Publisher-Domains </ div> <div class = 'arc-one-by-one-data'> 4aynikam.ru </ div> <div class = 'arc-one-by-one-data'> androidphone.su </ div> <div class = 'arc-one-by-one-data'> androidphones.ru </ div> <div class = 'arc-one-by-one-data'> full-repair.com </ div> <div class = 'arc-one-by-one-data'> howgadget.com </ div> <div class = 'arc-one-by-one-legend'> Erkannter Werbetreibender <span id = 'adx-  Advertiser-Tooltip '> </ span> </ div> <div class =' ​​arc-one-by-one-data '> DNS-Shop </ div> "
           ["8"] =>
           string (98) "<div> <span class = 'arc-impression-score high'> HIGH </ span> Impressionen </ div>"
           ["9"] =>
           Objekt (stdClass) # 4 (3) {
             ["1"] =>
             Zeichenfolge (4191) "<a href="https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/" target="_blank"> <img onerror =" this.src = 'data: image / gif; base64, RCw "border = 0 alt =" "> </a>"
             ["2"] =>
             Zeichenfolge (4191) "<a href="https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/" target="_blank"> <img onerror =" this.src = 'data: image / gif; base64, R1w "border = 0 alt =" "> </a>"
             ["3"] =>
             Zeichenfolge (4191) "<a href="https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/" target="_blank"> <img onerror =" this.src = 'data: image / gif; base64, Rg "border = 0 alt =" "> </a>"
           }}
           ["10"] =>
           string (291) „https://adwords-displayads.googleusercontent.com/da/b/preview.js?client=asfe-arc-external-preview&obfuscatedCustomerId=5240877441&creativeId=288930210411&htmlParentId=ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60&sig=ACiVB_yMUjLwDjRO2T-0VAaVuRPt8uLHGQ ""
           ["13"] =>
           string (311) „https://adwords-displayads.googleusercontent.com/da/b/preview.js?client=asfe-arc-external-preview&obfuscatedCustomerId=5240877441&creativeId=288930210411&htmlParentId=ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60&showVariations=true&sig=ACiVB_yMUjLwDjRO2T -0VAaVuRPt8uLHGQ
           ["14"] =>
           Zeichenfolge (69) "https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/"
           ["15"] =>
           Zeichenfolge (0) ""
           ["17"] =>
           Zeichenfolge (0) ""
           ["18"] =>
           Zeichenfolge (8) "DNS Shop"
           ["20"] =>
           Zeichenfolge (20) adv-5594449542310820
           ["21"] =>
           Array (4) {
             [0] =>
             Zeichenfolge (8) "site1.ru"
             [1] =>
             Zeichenfolge (9) "site2.com"
             [2] =>
             Zeichenfolge (9) "site3.com"
             [3] =>
             Zeichenfolge (8) "site4.ru"
           }}
         }}
         ["6"] =>
         Objekt (stdClass) # 5 (3) {
           ["5"] =>
           Zeichenfolge (20) -6668648012302470727
           ["7"] =>
           Array (1) {
             [0] =>
             Zeichenfolge (3) "DNS"
           }}
           ["9"] =>
           int (0)
         }}
         ["7"] =>
         int (1)
         ["9"] =>
         Objekt (stdClass) # 16 (1) {
           ["3"] =>
           Array (5) {
             [0] =>
             Objekt (stdClass) # 7 (3) {
               ["1"] =>
               Objekt (stdClass) # 6 (1) {
                 ["1"] =>
                 Zeichenfolge (56) "AClZvXLE9HJbFYq9TrAsXFgV4YkXsQt9lXp1xWjSB5aT5bFBpe4VNgo ="
               }}
               ["2"] =>
               Zeichenfolge (52) "Internet und Telekommunikation"
               ["3"] =>
               string (217) "Produkte und Dienstleistungen im Zusammenhang mit Telekommunikation, einschließlich Kabel- und Satellitendiensten und Internetzugang."
             }}
             [1] =>
             Objekt (stdClass) # 9 (3) {
               ["1"] =>
               Objekt (stdClass) # 8 (1) {
                 ["1"] =>
                 Zeichenfolge (56) "AClZvXKrUJJ3kKBen2scP56BynOtGhf160i1F1LLmtBj3b / oh2dUFg8 ="
               }}
               ["2"] =>
               Zeichenfolge (35) "Mobiltelefone"
               ["3"] =>
               Zeichenfolge (359) "Mobiltelefone und Mobiltelefone sowie zugehörige Informationen wie technische Spezifikationen und vergleichende Analyse von Produkten. Diese Kategorie enthält kein Mobiltelefonzubehör."
             }}
             [2] =>
             Objekt (stdClass) # 11 (3) {
               ["1"] =>
               Objekt (stdClass) # 10 (1) {
                 ["1"] =>
                 Zeichenfolge (56) "AClZvXL4W + khZ4O9SJiu97cTbTs2 + 0Wecf1IVNju8ffd4ysIT9PJ7XY ="
               }}
               ["2"] =>
               string (73) "Handys und Zubehör für sie"
               ["3"] =>
               string (283) "Mobiltelefone sowie zugehöriges Zubehör und Hardware wie Taschen, Einbeinstative für Selfies, Sicherheitsbildschirme und Ladegeräte."
             }}
             [3] =>
             Objekt (stdClass) # 13 (3) {
               ["1"] =>
               Objekt (stdClass) # 12 (1) {
                 ["1"] =>
                 Zeichenfolge (56) "AClZvXLQ3gPoVwjQbokDpB3 + nni4xURwH5 + YlnwkqjYtUowjhiKvk8Q ="
               }}
               ["2"] =>
               Zeichenfolge (45) "PC und Unterhaltungselektronik"
               ["3"] =>
               Zeichenfolge (142) "Produkte, Dienstleistungen und Informationen in Bezug auf Computer und Unterhaltungselektronik."
             }}
             [4] =>
             Objekt (stdClass) # 15 (3) {
               ["1"] =>
               Objekt (stdClass) # 14 (1) {
                 ["1"] =>
                 Zeichenfolge (56) "AClZvXLKYOGgOROaa32IUxU15jP89AtTM4dV24WKS + daMhqJMTNmeSY ="
               }}
               ["2"] =>
               Zeichenfolge (18) "Telefonie"
               ["3"] =>
               string (181) "Produkte, Dienstleistungen sowie Informationen und andere Ressourcen im Zusammenhang mit Telefonie und Sprachkommunikation."
             }}
           }}
         }}
         ["10"] =>
         Objekt (stdClass) # 17 (1) {
           ["1"] =>
           Zeichenfolge (76) "AClZvXLdGOShgJo + BM3apOUAFzQkE41z1 / hiZhIY8eUlC7p7xXPm82P3dq7yXhbEI + tN / YHgdH4P"
         }}
       }}
     }}
     ["2"] =>
     float (0)
     ["3"] =>
     Zeichenfolge (5) "60609"
     ["4"] =>
     int (1)
     ["5"] =>
     Zeichenfolge (0) ""
     ["6"] =>
     string (168) "ClD3Z2nP2P ///// 1 / ff99fXV98nMyMrJz8rH9fHV883Hx8bMz83Oz8vOzv8A / v / + 9f33 / fX11ffJzMjKyc / Kx / Xx1fPNx8fGzM / NZS / Lzs7 // hABIWxUk293Pm + qOQAAAAAnMJaYSAFQAFoLCS8wxxaTatL1EAJgp7737gY ="
     ["7"] =>
     Zeichenfolge (4) 3639
     ["9"] =>
     int (0)
   }}
   ["xsrf"] =>
   Zeichenfolge (48) ABOvogKaRsVZECZZJU-gDWrOqoP0CSqf7Q: 1535467886413
 }}


Dies war eine Beispielantwort, die nur eine Deklaration enthielt. Verstehe, was möglich ist.
Und für andere Abfragen werden Methoden ganz menschlich genannt. Einige Beispiele:

  • getWebPropertyMetricsToken
  • getAdDisplayLanguages
  • getArcSettings
  • getAdNetworkApprovals
  • getPubControlsCapabilities

Theoretisch möglich. Zu kämpfen?


Okay, es ist möglich, ihre Kommunikation (theoretisch) zu lösen, aber all dies ist nutzlos und die Theorie bleibt bestehen, wenn Sie nicht bei Google autorisieren.

Autorisierung Oder wie man Google auf PHP + CURL eingibt


Wieder die Entwicklertools, beenden Sie das Konto und sehen Sie sich den Datenaustausch an. Ich erinnere mich nicht im Detail, weil ich dort nichts verstehen konnte. Eine große Menge von JS, es scheint, dass eine Art von Berechnungen direkt auf dem Client durchgeführt werden, die Ergebnisse werden an den Server gesendet. Im Allgemeinen ist es für eine Person fast unmöglich einzutreten.

Wir denken weiter. Ein Haufen JS. Und wenn Sie JS deaktivieren? Aber Google wird Nutzern ohne JS nicht die Möglichkeit nehmen, sich anzumelden? Versuchen Sie es ohne JS. Extern sieht das Autorisierungsfenster schon viel einfacher aus. Geben Sie wie zuvor zuerst den Login und das Passwort auf der nächsten Seite ein. Vor allem in Bezug auf HTML ist es auch viel einfacher! Das übliche "Formular" -Tag mit den üblichen "Eingabe" -Feldern, jedoch nicht ohne eine Reihe von Schutz- oder System-versteckten Feldern. Versteckte Felder sind jedoch kein Problem, da das, was sie bei der Eingabe erhalten haben, an das nächste Skript übergeben wird. Und so stellte sich heraus, dass man sich bei Google anmeldete. Und zweistufige Autorisierung? Dazu später mehr. Zuerst müssen Sie sicherstellen, dass Sie Anzeigen zur Überprüfung herausziehen können, sonst macht alles keinen Sinn.

Ist theoretisch in der Praxis möglich?


Google ist eingetreten - es ist Zeit, die Theorie der Entschlüsselung von Kommunikationsprotokollen in der Praxis zu testen. Ich musste an Experimenten und Beobachtungen basteln, sorgfältig beobachten und aufzeichnen, welche Benutzeraktionen zu welchen Abfragen führen, gemeinsame und sich ändernde Abfrageelemente identifizieren, lange unverständliche Werte, die vom Server empfangen wurden, mit denselben langen vergleichen, die bei der nächsten Anfrage zurückgesendet wurden. Es war ein dichter Wald, der im Laufe der Zeit klarer und transparenter wurde.

Was musste getan werden, um zu verstehen, dass Fortsetzung Sinn macht?

  1. Melden Sie sich beim CPO an .
  2. Holen Sie sich eine Liste der Anzeigen.
  3. Holen Sie sich eine bestimmte Anzeige (Text zuerst).

Die Anmeldung beim CPO ist am einfachsten. Folgen Sie einfach dem Link. Es stellte sich heraus.

Details
Wir folgen einfach dem Link, wir bekommen die Antwort (die wir in diesem Fall nicht verwenden). Wir müssen auch ein digitales Token für zukünftige Anfragen anfordern und speichern.

Zum Zeitpunkt des Schreibens verfügt AdSense über zwei öffentliche Dienstleistungszentren. Ich werde sie bedingt alt und neu nennen.

Für den alten CPO.

Keine Ladepostanforderung:

https://www.google.com/adsense/gwt-properties?pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964&ov=3&hl=en

Die Antwort lautet:

 <meta name="gwt:property" content="usePropertyService=true"> <meta name="gwt:property" content="applicationType=ASFE3"> <meta name="gwt:property" content="syn.token=ABOvogJ1yQyL9pgHcGYM-J3OLj_9VSh31w:1535115071772"> <meta name="gwt:property" content="syn.token.pb=ABOvogKJ6-xmsNWK4Mbe_H5bT1xXhyj8SQ:1535115071772"> <meta name="gwt:property" content="syn.login=XXXXXX@gmail.com"> <meta name="gwt:property" content="syn.csi.backendUrl="> <meta name="gwt:property" content="syn.helpCenterUrl=//support.google.com/adsense/"> <meta name="gwt:property" content="syn.helpHost=//support.google.com"> <meta name="gwt:property" content="syn.helpCenterUri=/adsense"> <meta name="gwt:property" content="syn.newHelpHost=https://clients6.google.com"> <meta name="gwt:property" content="syn.newHelpCenterUri=/adsense"> <meta name="gwt:property" content="syn.helpCenterGaiaAuthDisabled=false"> <meta name="gwt:property" content="syn.billing3BaseUri=https://bpui0.google.com"> <meta name="gwt:property" content="syn.contextPath=/adsense"> <meta name="gwt:property" content="syn.userLanguage=en-US"> <meta name="gwt:property" content="syn.bruschettaContextPath=/adsense/new"> <meta name="gwt:property" content="userProfileImageUrl=https://lh5.googleusercontent.com/-v7nuoAI4eEQ/AAAAAAAAAAI/AAAAAAAAAAA/AT3-yjmKyg8/s96/photo.jpg"> <meta name="gwt:property" content="userDisplayName=" "> <meta name="gwt:property" content="userSettingsUrl=https://www.google.com/settings"> <meta name="gwt:property" content="googlePlusProfileUrl=https://plus.google.com/me"> <meta name="gwt:property" content="googlePrivacyUrl=http://www.google.com/intl/en_US/policies/privacy/"> <meta name="gwt:property" content="syn.features=562,465,612,604,616,618"> <meta name="gwt:property" content="analyticsHomePageUrl=https://www.google.com/analytics/web/"> <meta name="gwt:property" content="disableDebugIds=true"> <meta name="gwt:property" content="syn.pubControlsCapabilitiesLoadTimeout=5000"> <meta name="gwt:property" content="pid=pub-8958890276790964"> <meta name="gwt:property" content="tpid=pub-8958890276790964"> <meta name="gwt:property" content="syn.asfeGtmCampaignId=GTM-K7WZ"> 

Wir brauchen die vierte Zeile, nämlich "syn.token.pb". Wir behalten diesen Wert für die weitere Generierung von Abfragen.

Für den neuen CPO.

Keine Ladepostanforderung:

https://www.google.com/ads-publisher-controls/acx/5/darc/loader?onearcClient=adsense&pc=ca-pub-8958890276790964&tpid=pub-8958890276790964&hl=en

Die Antwort lautet:

 (function() {function loadAsyncOrDefer() {var scriptElement = document.createElement('script'); scriptElement.src = 'https:\/\/ssl.gstatic.com\/ads-publisher-controls\/onearc_20180822-12_RC00\/darc\/arc_app.dart.js';scriptElement.type = 'application\/javascript';scriptElement.defer = true;scriptElement.nonce = window['acxCspNonce'];scriptElement = document.head.appendChild(scriptElement); if ('_resourceTimingBuffer' in window) {_resourceTimingBuffer.add(scriptElement.src);}};loadAsyncOrDefer();})();window['__darc_app_params'] = {'onearcClient': 'ADSENSE','hl': 'ru','pc': 'ca-pub-8958890276790964','tpid': 'pub-8958890276790964',};window['__app_metadata'] = {'token': 'ABiMD8TT9vzK99SFB7iaI0ssBySxT9jjrQ:1535116725529','pre': '\/ads-publisher-controls\/acx','scs': 'https:\/\/ssl.gstatic.com\/ads-publisher-controls\/onearc_20180822-12_RC00','oacf': '\x7b\x221\x22:\x5b5,25,22,8,27,32,43,44,45,48,49,5,25,22,8,27,32,43,44,45,48,49,29,46\x5d\x7d','hats': 'ibhswcm2x2iztju5i6jbbzlkma',}; 

Die Reihenfolge, die wir brauchen, ist hier:

'token': 'ABiMD8TT9vzK99SFB7iaI0ssBySxT9jjrQ:1535116725529'


Das Abrufen einer Liste ist eine interessante Aufgabe, da Sie eine Reihe von Einstellungen übergeben müssen. Sagen Sie uns, was wir erhalten möchten (Art der Anzeigen, aktiviert / neu / blockiert, Anzahl der Anzeigen usw.). Plus ein digitales XSRF-Token pro Anfrage. Es stellte sich heraus. Als Reaktion darauf gingen eine große Datenmenge ein, die sogar Miniaturansichten von Bildern der Websites enthielt, auf denen die Anzeigen geschaltet wurden. Und natürlich Links zu Ankündigungen.

Details
Entwürfe meiner Versuche wurden beibehalten, um herauszufinden, welcher Parameter für was verantwortlich ist. Ich habe sie ein bisschen geadelt , alle Matten und Emoticons ausgeschnitten und sie hier gepostet. Zuerst gibt es eine Sequenz für den alten CPO und dann für den neuen.

Außerdem werde ich die Namen der Methoden, die Anforderungen (nur für die neue CPU, für die alte Methode, die im Anforderungshauptteil angegeben ist) und die JSON-Zeichenfolge aufrufen, da sie die "Träger" von Informationen sind, alles andere (Adresse, Header, digitale Token, andere Parameter) - "Wrapper" ", Sie sind nicht grundlegend, ich werde Ihnen später alles darüber erzählen.

Für die alte CPU (Variable json request params):

 { "1":"ca-pub-8958890276790964", "2":{ "1":0, //  ,          "2":32, // -   "3":0, // 0 - , 1-  "4":{ "1":{"1":"-    "} //    }, "5":{ "1":"video" //   "2":1, //  ,     "3":1, //       "6":7, //      "16":[0], // 0 - ; 1 - ; 2 - .      . "17":0 //       } }, "3":"-3945261286198141534" //,    } 

Entschlüsselung ist, wir bilden eine Anfrage und wir erhalten die Antwort.

Für den alten CPO benötigen Sie zunächst ein Token. Stellen Sie eine weitere Anfrage, bevor Sie Anzeigen anfordern:

 {"method":"getWebPropertyMetricsToken","params":"{\"1\":\"ca-pub-8958890276790964\"}","xsrf":"ABOvogKJ6-xmsNWK4Mbe_H5bT1xXhyj8SQ:1535115071772"} 

Die Antwort lautet:

 {"result":{"1":{"1":{"1":"AClZvXKte+4mEwsFB7kw20LrbWQ6jOMxmK8j4At4Vxqc7w+5dDDYWIx2k1ldCvvGbAT59UClLSkQty6zyZZQSmgxKvpKhq22bKRfGy8ywt0B5L8WE53vo+YtI8ixM8Xe0RPixTjPtOLQA8sCZod+hvHxqU5Depi3I9XUV6JMn8uCOg67m+5oe5TT1L0OytnUBDIsjAaQ+kcldN23yGoppKKCs2Zf5XI6i7nk5QHehS8wvsDlugvkKSU3fUo3J+ZHJvoUXyCGLP3lP9Gh+6fOMir/SLrOJx8udRbtjTJhLsvXTXUN2QbjcEfFFAIaWfgMr5euHtYwYYWuMoI5ofZTc9L8sCY5pA0Q/CWyZ6QLH85XI70vxH6cBZtsnfrPLRh18cxSxFgzXuAwPHW8+CueCznqiHcY7gOhxQc2YWmSgwMIP9Cpgr089dWoB58wulcK0g+EqnTJiQdI9MMUj4zzLpu5DYja5ftP7lF3jeCSuKT9q70B9OqMDvlGlruZd2hhHe3k5S+LoyWo/4WZDUTvWpCMmnPzCP3R4OIQnrhS0s5ffOVxjyNHrXJXtrNhppap3BY4iByIn1cowMfVFfx3hNep0JW59db9fVuXKaSy/mqHZKC1ToRM/UyCoSZ9ZjY/Ot091ptURLRYoTFal5TBbMKISgxn5UCz4vSoxVe1fC64dwXHatSzCCg9AjJOpKR4p/9smxOaKg73pmMHsEY98I6TJhvaeJ9o6lcHsG8PZnB6xNS4ZJHBtN1baHkrCHOfqaepMVyRCF2kPNhr9SgujjTTbiKGMUO3UVamOQQ5/EckTgFMr0PIda7PPw7op8qFEhxZmkoo9KgERcYLGHxzGePjfo0IiNbf7k50lgDipwk5ag3CI0tw3CtDicQn6isHwKOmlfSctrEGv/Fjlmcgjhl1sTAL/rTWxDCABKN7/OhdysBAOq0j6viFgzjM8WI0ZuYPIVIm19CQ+YGcOx77oiyxev+3sAj7uSJoYFslmgiZV4jrF5P+b+U/5fknRf2Ho8plAUh4AHweXMeaPFYZAYooe6jC79EzgizqXvx1H/HrKKQcaXdDZ1ivoOM/7DtzJbawzO7ALUnHkqR1ZYmw3+3E/pmsDXedYgzERWYWvJltS+P46iWYOS43SUVw+whDWZnjJOwVOFFLDWcg4ykfzNmbq4B/vUibrV1dCiRpTIXSP92xk1I8MCfQGiptqo5MiKttqJ9Orj7nrGXEDz5pJBTTem919nz5rNIjI/sus3GZ+G4rBE+9i1sJN0jxszvpRD2AKsl1KSOrPCuOBhpNbD2HnFgQd+EUw8CpH2MLZlrZ8l3cqzDVc5aeCQ1eiUKlONlZpIxZi5wE5HyKZRxC8ljtX5xe+Fpg8R8/yDarvAkjeb0yKzN/e893nEVz3CmF68pphNp71kjJtvwBS2JtSWhFc81Ys51GEw\u003d\u003d"}}},"xsrf":"ABOvogJLbcTkcBxU_TCJddIrW4L-mVwPcw:1535115072920"} 

Für dieses riesige Token ("1": "AClZ ...") müssen wir Anzeigen anfordern.

Anzeigen anfordern:

 {"method":"searchArcApprovals","params":"{"1":"ca-pub-8958890276790964","2":{"1":0,"2":24,"3":0,"4":{"1":{"1":"AClZvXKte+4mEwsFB7kw20LrbWQ6jOMxmK8j4At4Vxqc7w+5dDDYWIx2k1ldCvvGbAT59UClLSkQty6zyZZQSmgxKvpKhq22bKRfGy8ywt0B5L8WE53vo+YtI8ixM8Xe0RPixTjPtOLQA8sCZod+hvHxqU5Depi3I9XUV6JMn8uCOg67m+5oe5TT1L0OytnUBDIsjAaQ+kcldN23yGoppKKCs2Zf5XI6i7nk5QHehS8wvsDlugvkKSU3fUo3J+ZHJvoUXyCGLP3lP9Gh+6fOMir/SLrOJx8udRbtjTJhLsvXTXUN2QbjcEfFFAIaWfgMr5euHtYwYYWuMoI5ofZTc9L8sCY5pA0Q/CWyZ6QLH85XI70vxH6cBZtsnfrPLRh18cxSxFgzXuAwPHW8+CueCznqiHcY7gOhxQc2YWmSgwMIP9Cpgr089dWoB58wulcK0g+EqnTJiQdI9MMUj4zzLpu5DYja5ftP7lF3jeCSuKT9q70B9OqMDvlGlruZd2hhHe3k5S+LoyWo/4WZDUTvWpCMmnPzCP3R4OIQnrhS0s5ffOVxjyNHrXJXtrNhppap3BY4iByIn1cowMfVFfx3hNep0JW59db9fVuXKaSy/mqHZKC1ToRM/UyCoSZ9ZjY/Ot091ptURLRYoTFal5TBbMKISgxn5UCz4vSoxVe1fC64dwXHatSzCCg9AjJOpKR4p/9smxOaKg73pmMHsEY98I6TJhvaeJ9o6lcHsG8PZnB6xNS4ZJHBtN1baHkrCHOfqaepMVyRCF2kPNhr9SgujjTTbiKGMUO3UVamOQQ5/EckTgFMr0PIda7PPw7op8qFEhxZmkoo9KgERcYLGHxzGePjfo0IiNbf7k50lgDipwk5ag3CI0tw3CtDicQn6isHwKOmlfSctrEGv/Fjlmcgjhl1sTAL/rTWxDCABKN7/OhdysBAOq0j6viFgzjM8WI0ZuYPIVIm19CQ+YGcOx77oiyxev+3sAj7uSJoYFslmgiZV4jrF5P+b+U/5fknRf2Ho8plAUh4AHweXMeaPFYZAYooe6jC79EzgizqXvx1H/HrKKQcaXdDZ1ivoOM/7DtzJbawzO7ALUnHkqR1ZYmw3+3E/pmsDXedYgzERWYWvJltS+P46iWYOS43SUVw+whDWZnjJOwVOFFLDWcg4ykfzNmbq4B/vUibrV1dCiRpTIXSP92xk1I8MCfQGiptqo5MiKttqJ9Orj7nrGXEDz5pJBTTem919nz5rNIjI/sus3GZ+G4rBE+9i1sJN0jxszvpRD2AKsl1KSOrPCuOBhpNbD2HnFgQd+EUw8CpH2MLZlrZ8l3cqzDVc5aeCQ1eiUKlONlZpIxZi5wE5HyKZRxC8ljtX5xe+Fpg8R8/yDarvAkjeb0yKzN/e893nEVz3CmF68pphNp71kjJtvwBS2JtSWhFc81Ys51GEw\u003d\u003d"}}},"3":""}","xsrf":"ABOvogI3FCm29t4pdIded8L-Q98R0Voy-Q:1535121289188"} 

Ich übersetze Abschnitt 2 der params-Variablen:
Google, , :
("1":0),
24 ("2":24),
("3":0),
: AClZvX....


Eine Reihe von Parametern kann weggelassen werden, sie nehmen Standardwerte an:

  • Art der Anzeigen: alle;
  • Zeitraum: alle verfügbar;
  • vorhergesagte Sperre: nein;
  • Nur unbestätigt anzeigen: Nein.

Je nach Anzahl der angeforderten Anzeigen antworten Dutzende oder Hunderte von Kilobyte. Am schwierigsten ist es, wenn die Grafiken im Text „ausgestreckt“ sind (Daten: image / gif; base64 ....). Und wenn es keine unbestätigten gibt, ist die Antwort einfach:

 {"result":{"4":1,"5":"","8":"0","9":0},"xsrf":"ABOvogLWqmyC7KH1zfvmPxk-Y69-Jzj5XQ:1535115074392"} 

Wenn es Anzeigen gäbe, wären sie hier enthalten: Ergebnis -> {5}.

Für den neuen CPO:

 { "1":"ca-pub-8958890276790964", "2":{ "1":10, //  ,          "2":7, // -   "3":11, //  - 10;  - 1;  - 11; "5":{ "6":3 //      "7":3534 //    "14":"en" //  "16":[0] // 0 - ; 1 - ; 2 - . "18":"dfd.com" //   "24":"video" //   }, "7":""}, //          "3":"-2876348936240321457", //          "5":true //    . . } 

Vorläufige Anfragen müssen nicht gestellt werden, Sie können sofort Anzeigen anfordern.
SearchApprovals (dies ist eine Methode)

 {"1":"ca-pub-8958890276790964","2":{"2":100,"3":11,"5":{"16":[0]},"7":""},"5":true} 

Google, , :
100 ("2":100),
("3":11),
("5":{"16":[0]},
("7":"")


Optionale Parameter und Standardeinstellungen:

  • Seriennummer der ersten angeforderten Ansage: 0;
  • Zeitraum: alle verfügbar;

Als Antwort erhalten wir fast das gleiche wie im Fall des alten CPO. Es unterscheidet sich nur in einem Wort - dem Namen des Datencontainers. Im alten ist es "Ergebnis", im neuen ist es "Standard".


Das Abrufen einer bestimmten Anzeige ist einfach. Nehmen Sie den Link aus der vorherigen Antwort und laden Sie die Anzeige herunter. Hier gibt es keinen Schutz, der Zugang ist für alle kostenlos.

Details
Link zur Anzeige. Wir werden in der vorherigen Antwort danach suchen, wo wir als Antwort auf eine Anfrage nach Anzeigen viele, viele Kilobyte Text erhalten haben.

Damit es nicht zu viel unverständlichen Code gibt, gebe ich die Antwort auf die Anfrage einer Anzeige (und selbst dann wurde es gnadenlos geschnitten, es war zehnmal mehr, nur das Wichtigste war im Moment noch übrig):

 {"result":{"1":[{"1":0,"3":0,"4":{"1":"AClZvXJ2t4wiEZ/VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLGRcoQdDt+wOk46bdr0yA\u003d"},"5":{"1":82,"2":0,"3":0,"4":"\u00GQ","13":"https://adwords-displayads.googleusercontent.com/da/b/preview.js?client\u003dasfe-arc-external-preview\u0026obfuscatedCustomerId\u003d5240877441\u0026creativeId\u003d288930210411\u0026htmlParentId\u003dad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60\u0026showVariations\u003dtrue\u0026sig\u003dACiVB_yMUjLwDjRO2T-0VAaVuRPt8uLHGQ","14":"https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/","15":"","17":"","18":"","20":"adv-5594449542310820","21":["domain1.com","domain2.com"]},"6":{"5":"-6668648012302470727","9":0},"7":1,"9":{"3":[{"1":{"1":"AClZvXLE9HJbFYq9TrAsXFgV4YkXsQt9lXp1xWjSB5aT5bFBpe4VNgo\u003d"},"2":"\u041/YHgdH4P"}}],"2":0.0,"3":"59917","4":1,"5":"","6":"ClD3Z2nP2P/////1/ff9oPjm7gU\u003d","7":"5751","9":0},"xsrf":"ABOvogJJJuNM1d0i22yN48ibBAY8vpvC_A:1535125743731"} 

Über Parameter {13} erhalten Sie den Link zur Anzeige:

https://adwords-displayads.googleusercontent.com/da/b/preview.js?client=asfe-arc-external-preview&obfuscatedCustomerId=5240877441&creativeId=288930210411&htmlParentId=ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60&showVariations=true&sig=ACiVB_yMUjLwDjRO2T-0VAaVuRPt8uLHGQ .

Für einige Zeit (Tage, vielleicht Wochen) wird der Link aktiv bleiben und jeder kann eine Ankündigung über ihn erhalten. Es gibt ungefähr 100 - 150 Kilobyte und ganz unten (und nicht nur) finden Sie Auszüge aus dem Anzeigentext.

Darüber hinaus ist dies ein wichtiger Parameter - dies ist die interne Kennung der Anzeige, mit der wir sie weiter verwalten (Blockieren / Entsperren der Anzeige, Blockieren / Entsperren des AdWords-Kontos, das diese Anzeige abschraubt, Anforderungsstatistiken anfordern, das als "markiert" gekennzeichnete Zeichen setzen, eine Nachricht über Verstöße gegen die Regeln senden). . Es ist hier gespeichert:
Ergebnis -> {1} -> {4} -> {1}.

Es sieht so aus:

AClZvXJ2t4wiEZ/VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLGRcoQdDt+wOk46bdr0yA=

Seine Länge beträgt 120 Zeichen (mit seltenen Ausnahmen).

Dieser Datenstrom enthält viele Informationen:

  • Art der Anzeige.
  • Ziel-URL
  • Domänen, auf denen es abgeschraubt wurde.
  • Informationen zum Werbetreibenden (Name, falls vorhanden, und Kennung).
  • Qualitatives Merkmal der Anzahl der Impressionen, zum Beispiel „hoch“.
  • Drei Zielseiten-Miniaturansichten in Form von Daten: Bild.
  • Die Kategorie, zu der die Anzeige gehört, z. B. Telefonie.

Das Ergebnis wird erhalten - es eignet sich für die Automatisierung. Als nächstes wurde die Reihenfolge in den Funktionen festgelegt, da der funktionierende Prototyp schrecklich war. Ich wollte nur schnell verstehen, ob der Prozess automatisiert werden würde. Die erste Version wurde den Menschen angeboten und die Vervollständigung und Korrektur von Fehlern begann. Das erste Problem ist, dass sich die "zweistufige" nicht anmelden konnte.

2-stufige Autorisierung


Wenn Sie überprüfen, wie es aussieht, wenn JS deaktiviert ist, sehen Sie viele Autorisierungsoptionen: SMS-Passwort, Einmalpasswörter von einem Blatt Papier, über die Anwendung ...
Automatisieren Sie jede Option, damit sich jeder wohlfühlt - Sie können verrückt werden.

Entwicklerrettung


Als ich mir ohne JS in Chrome den zweistufigen Autorisierungsmechanismus ansah, sah ich einen Hinweis auf die Wahl einer anderen Methode. Ich war begeistert davon. Unabhängig davon, welche Methode standardmäßig ausgewählt ist, besteht immer die Möglichkeit, zur Auswahl zu wechseln und SMS auszuwählen. Dies war eine echte Erlösung. Natürlich musste ich die standardmäßig ausgewählte Methode überprüfen und im Falle einer „falschen“ Methode die Änderungstaste „drücken“ und „Einmalkennwort per SMS“ auswählen.

Für die Autorisierung selbst habe ich nur die Zwischendaten aus dem Formular in der Datei (dieselbe Gruppe aller versteckten Felder) und im Formular zur einmaligen Passworteingabe gespeichert. Das ist alles, "zweistufig" konnten auch eintreten.

Abschluss des Erstellungsprozesses


Die Hauptaufgabe war erledigt: Jeder konnte eine automatisierte Lösung zum regelmäßigen Filtern von Anzeigen auf seinen Websites installieren und verwenden.

Als nächstes kamen Verbesserungen, Verbesserungen, Korrekturen von Mängeln ...
... sowohl vom Benutzer als auch unabhängig identifiziert, Verfeinerung des externen Designs (intuitiv für den Autor war für fast alle anderen unverständlich).
Verschiedene Funktionen und Filter wurden ebenfalls vervollständigt und hinzugefügt, um nach unerwünschten Anzeigen zu suchen. Zum Beispiel, um automatisch einen Hash aus kyrillischen und lateinischen Buchstaben zu erkennen. Normale Werbetreibende machen keine Anzeigen wie diese, aber manchmal gibt es Fehler in Form des Einmischens russischer Wörter eines lateinischen Zeichens (beliebte Fehler im Filter werden ebenfalls berücksichtigt).

Zur Vereinfachung hinzugefügte Add-Ons:

  • Liste der blockierten Werbetreibenden.
  • Liste der blockierten Domains.
  • Einkommensbezeichnung.
  • AdSense-Links.

Die Liste der blockierten Werbetreibenden bietet die Möglichkeit, sie anzusehen und zu bearbeiten. Sie ist bequemer (aber nicht hübscher im Erscheinungsbild) als die reguläre Benutzeroberfläche! Außerdem gibt es die Möglichkeit, "in großen Mengen" freizuschalten, was in AdSense nicht der Fall ist.

Die Liste der blockierten Domains ähnelt der vorherigen Liste.

Möglichkeit zur Arbeit mit AdX (über AdManager, wo AdX kürzlich umgezogen ist).

Es gibt viele Verbesserungen, die meiner Meinung nach interessantesten sind oben aufgeführt.


Funktionen zum Senden einer Anfrage und zum Empfangen eines Ergebnisses


Zuvor schrieb ich über Anfragen in Form von JSON-Strings, versprach aber, später mehr Details zu enthüllen.

Als dies alles vom neuen CPO erledigt wurde, gab es noch keine, daher wurde alles für den alten erledigt, wir werden damit beginnen.

Kommunikation mit dem alten CPO


Mit Hilfe von Beobachtungen konnte festgestellt werden, dass der Hauptaustausch von Anfragen an eine Adresse geht:

  https://www.google.com/adsense/gp/creativeReview?ov=3&pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964(&hl=de) 


Was nicht immer in Klammern steht, ist nur ein Parameter, der die Sprache der Antwort angibt. Er kann auf fast alle Google-Produkte angewendet werden. Dies ist wichtig, da ich überall Englisch verwende und die Software einige Parameter erkennt und auf eine Antwort auf Englisch wartet.

Zusätzlich zur Adresse gibt es eine Standardform der übertragenen Postdaten (in den Entwicklertools sind sie im Abschnitt "Payload anfordern" sichtbar) - dies ist eine JSON-Zeichenfolge mit den Variablen method, params und xsrf:

 {"method":"getArcSettings","params":"{\"1\":[\"ca-pub-8958890276790964\"]}","xsrf":"ABOvogJlvXKkBQUbPYEsM04recgCsukFMg:1535467881599"} 

Methode - hier scheint alles klar zu sein.
params - abhängig von der Methode ein eigenes Standardformat für die übertragene JSON-Zeichenfolge.
xsrf - Der erste Empfang des digitalen Tokens, den wir für die Anfrage verwenden, ist oben beschrieben. In der Antwort erhalten wir ein neues XSRF-Token für die nächste Anfrage.

Die Antwort kommt auch in Form einer JSON-Zeichenfolge aus den Teilen des Ergebnisses (angeforderte Informationen) und xsrf:

 {"result":{"1":[{"1":"ca-pub-8958890276790964","2":{"1":"ca-pub-8958890276790964","2":0},"3":{"1":"ca-pub-8958890276790964","2":0}}]},"xsrf":"ABOvogIH7wJjD8t1xmuu8WbGplQowqjjJA:1535467883406"} 

PHP-Funktionscode
 function creative_review($method, $params) { $xsrftoken = file_get_contents($GLOBALS['xsrftoken_file']); $creativeReview = new stdClass(); //to make json request string $creativeReview->method = $method; $creativeReview->params = $params; $creativeReview->xsrf = $xsrftoken; $creativeReview_post_request = json_encode($creativeReview); unset($creativeReview); $result = curl_post($GLOBALS['creative_review_req_string'], $creativeReview_post_request, $GLOBALS['arc_tab_req_string'], $GLOBALS['myheaders']); $result = json_decode($result); // decode result string if ($result->xsrf) file_put_contents($GLOBALS['xsrftoken_file'], $result->xsrf); // Renew standard XSRF token return $result; } 

post- — curl_post($url, $postfields, $referer, $myheaders).

.
$myheaders :

 accept-language:en-US;q=1,en;q=0.4
content-type:application/javascript; charset=UTF-8 


$GLOBALS['creative_review_req_string']:

 https://www.google.com/adsense/gp/creativeReview?ov=3&pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964&hl=en 


, .

$GLOBALS['arc_tab_req_string']:

 https://www.google.com/adsense/new/u/0/pub-8958890276790964/main/allowAndBlockAds?webPropertyCode=ca-pub-8958890276790964&tab=arcTab 

referer , .

Kommunikation mit dem neuen CPO


Hier ist die Adresse für die Anfrage komplizierter - sie ändert sich. Es gibt nur den ersten gemeinsamen Teil. Das Schema ist wie folgt:

Allgemeiner Teil + Methode + '?' + GET-Parameter + rpcTrackingId = <Wiederholung vorheriger GET-Parameter in der URL-Codierung> + ':' + <Sequenznummer der Anforderung mit derselben Methode innerhalb von ... im Allgemeinen, bis der Benutzer die Seite aktualisiert>.

https://www.google.com/ads-publisher-controls/acx/5/proto/creativereview/GetArcSettings?hl=ru&pc=ca-pub-8958890276790964&onearcClient=adsense&rpcTrackingId=%2Fads-publisher-controls%2Facx%2F5%2Fproto%2Fcreativereview%2FGetArcSettings%3Fhl%3Dru%26pc%3Dca-pub-8958890276790964%26onearcClient%3Dadsense%3A1

Das XSRF-Token wird hier im Header 'x-framework-xsrf-token' übergeben und ist wiederverwendbar. Daher ist es nicht in den Antworten enthalten und muss nicht ständig aktualisiert werden.

PHP-Funktionscode
 function creative_review_new($method, $params) { if (!isset($GLOBALS['xsrftoken_new'])) $GLOBALS['xsrftoken_new'] = file_get_contents($GLOBALS['temp_folder'] . 'xsrftoken_new.txt'); $myheaders = $GLOBALS['myheaders_new']; $myheaders[] = 'x-framework-xsrf-token:' . $GLOBALS['xsrftoken_new']; $query['pc'] = 'ca-' . $GLOBALS['pub_id']; $query['onearcClient'] = 'adsense'; $query['hl'] = 'en_US'; foreach ($query as $index => $value) $rpc[] = $index . '=' . $value; if(!isset($GLOBALS[$method_count])) { $GLOBALS[$method_count]=1; } else { $GLOBALS[$method_count]++; } $append = ':'.$GLOBALS[$method_count]; $query['rpcTrackingId'] = $GLOBALS['creative_review_new_string'] . $method . '?' . implode('&', $rpc) . $append; $query = http_build_query($query); $url = 'https://www.google.com' . $GLOBALS['creative_review_new_string'] . $method . '?' . $query; $result = curl_post($url, $params, $GLOBALS['new_arc_tab_req_string'], $myheaders); if (mb_strpos($result, 'Error 400 (Not Found)', 0, 'UTF-8') !== false) { return '-32000 XSRF token validation'; } $list = explode("\n", $result, 2); $result = $list[1]; $result = json_decode($result); // decode result string if (@$result->default->{5}) file_put_contents($GLOBALS['temp_folder'] . 'some_digi_token.txt', $result->default->{5}); // Renew token if (@$result->default->{6}) file_put_contents($GLOBALS['temp_folder'] . 'some_long_token.txt', $result->default->{6}); // Renew token 

post- — curl_post($url, $postfields, $referer, $myheaders).

$myheaders (javascript → json):

 accept-language:en-US;q=1,en;q=0.4
content-type:application/json; charset=UTF-8 


$GLOBALS['creative_review_new_string']:

 /ads-publisher-controls/acx/5/proto/creativereview/ 
.

$GLOBALS['new_arc_tab_req_string']:

 https://www.google.com/adsense/new/u/0/pub-8958890276790964/arc/ca-pub-8958890276790964 
referer , .

. «» . (« 10 , 30-»). , .


Abfrage- und Verwaltungsfunktion für Domänenlisten


Es ist fast die gleiche Funktion wie die Kommunikation mit dem alten CPO, es unterscheidet sich nur in der Adresse der Beschwerde.

PHP-Funktionscode
 function blocking_controls($method, $params) { $xsrftoken = file_get_contents($GLOBALS['xsrftoken_file']); $creativeReview = new stdClass(); //to make json request string $creativeReview->method = $method; $creativeReview->params = $params; $creativeReview->xsrf = $xsrftoken; $creativeReview_post_request = json_encode($creativeReview); unset($creativeReview); $result = curl_post($GLOBALS['blocking_controls_req_string'], $creativeReview_post_request, $GLOBALS['arc_tab_req_string'], $GLOBALS['myheaders']); $result = json_decode($result); // decode result string if ($result->xsrf) file_put_contents($GLOBALS['xsrftoken_file'], $result->xsrf); // Renew standard XSRF token return $result; } 

$GLOBALS['blocking_controls_req_string']:
 https://www.google.com/adsense/gp/blockingControls?ov=3&pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964 
.

XSRF- , / , AdWords .


json- ( ) JS- ( ), «» (\x< >).

, :
target\x3d_blank title\x3d\x22\x22\x3e\x3cspan\x3e Xiaomi Redmi S2 Redmi 5 \x3cbr\x3e . 24 26 . \x3cbr\x3e .

Für json gibt es eine Funktion in PHP, die mindestens ein Objekt, mindestens ein Array ergibt.
Für die „Kosoiks“ irgendwo im Netzwerk habe ich eine kleine Funktion gefunden, die die Daten in die menschliche Form bringt.

PHP-Funktionscode
 function hex_repl($html) { $i = 256; while ($i >= 0) { $hex = dechex($i); $html = str_ireplace("\x$hex", chr($i), $html); $i--; } return $html; } 

Entschlüsselungsergebnis:
target = _blank title = ""> <span> Kaufen Sie Xiaomi Redmi S2 und erhalten Sie Redmi 5 <br> als Geschenk. Vom 24. bis 26. August. <br> Weitere Informationen auf der Website.

Anzeigenerkennung


Text . Ich habe mit ihnen angefangen. Sie waren wichtiger und wie sich herausstellte, war mit ihnen alles viel einfacher. Es gibt nur zwei Arten: alte mit einer Überschrift (die fast verschwunden ist) und neue mit zwei Überschriften.

Die Ankündigung erfolgt bereits in Form von HTML-Code, aber zusätzlich zur Ankündigung enthält die Antwort viele Daten, die wir nicht benötigen - den Javascript-Code (er hat nicht einmal die Essenz dieses Codes erfasst).

Die Erkennung bestand schließlich aus den folgenden Schritten:

  • Trimmen des „großen Anfangs“, wobei nur der „Schwanz“ übrig bleibt, der den Text der Ankündigung enthält;
  • Erstellen eines Objekts mit der DOMDocument-Klasse
  • Suchen Sie in der Schleife nach den gewünschten Werten: Überschriften, Anzeigentext, Linktext.

Überschriften, Text und ein Link enthalten bestimmte Klassen, an denen der Erkenner „festhielt“.

Was ist wo und welche Funktion hat die Verarbeitung von Textanzeigen?
rhtitleline1 — 1;
rhtitleline2 — 2;
rhtitle — ( );
rhbody — ;
rhurl — URL.

 function text_ad($html) { $list = explode('</head>', $html); $ad_html = array_pop($list); unset($list, $html); $dom = new DOMDocument('1.0', 'UTF-8'); @$dom->loadHTML($ad_html); unset($ad_html); foreach ($dom->getElementsByTagName('a') as $a_node) { if (stripos($a_node->getAttribute('class'), 'rhtitleline1') !== false) { $ad['header1'] = $a_node->textContent; continue; } if (stripos($a_node->getAttribute('class'), 'rhtitleline2') !== false) { $ad['header2'] = $a_node->textContent; continue; } if (stripos($a_node->getAttribute('class'), 'rhbody') !== false) { $ad['body'] = $a_node->textContent; continue; } //Old ads (with just 1 header) support if (stripos($a_node->getAttribute('class'), 'rhtitle ') !== false || stripos($a_node->getAttribute('class'), 'rhtitle"') !== false) { $ad['header1'] = $a_node->textContent; continue; } if (stripos($a_node->getAttribute('class'), 'rhurl ') !== false || stripos($a_node->getAttribute('class'), 'rhurl"') !== false) { $ad['displayUrl'] = $a_node->textContent; continue; } } $fulltext = implode(' ', $ad); $ad['fulltext'] = $fulltext; if (!isset($GLOBALS['set_gl']['utf8_off'])) foreach ($ad as $index => $value) $ad[$index] = utf8_decode($value); return $ad; } 

— . .

$fulltext — .

utf8_decode . DOMDocument . .


Grafik . Sie überprüfen nur die Ziel-URL. Es werden keine Bilder erkannt, und Bilder werden auch zur Überprüfung gespeichert (da Bilder auf Wunsch auch im CPO angezeigt werden können). Ich sehe hier keinen Grund, das Rad neu zu erfinden (höchstwahrscheinlich eine Kurve und niemand braucht sie).

Multimedia . Unter diesem gemeinsamen Namen werden verschiedene Anzeigen versteckt:

  • Multi-Format.
  • Medien (Rich Media).
  • Benutzerdefinierte Vorlage (HTML5).

Für Multi-Format 3 wurden je nach Art der Ansage Erkennungsfunktionen erstellt.
Für Medien wurden 2 Funktionen erstellt.

Für HTML5 wurden 3 Funktionen erstellt.

Filtern


Nach dem Erkennen der Anzeigen beginnt der Prozess der Feststellung, dass nach verschiedenen Kriterien zu beanstanden ist (alle Filter sind enthalten, einige sind anpassbar):

  • Die Präsenz in der Domain "blogspot.com".
  • Das Vorhandensein einer Mischung aus kyrillischen und lateinischen Buchstaben in Worten.
  • Das Vorhandensein von "schlechten" Wörtern (eine Liste von "schlechten" Wörtern kann vom Benutzer angepasst werden).
  • Einen Benutzer zu einer anderen Domain als dem Original umleiten lassen.

Arbeitsbericht


Basierend auf den Filtrationsergebnissen wird ein Fortschrittsbericht erstellt.
Es besteht aus einer Liste von Anzeigen für jeden Filter in seiner Spalte sowie einer Grafik für „gute“ Anzeigen. Die folgenden Informationen sind im Bericht enthalten:

  • Die Kennung und der Textname des Werbetreibenden, falls vorhanden.
  • Grund für die Sperrung (nur für die Sperrung).
  • Überschriften und Anzeigentext.
  • Ziel und URL anzeigen.
  • Datum und Uhrzeit der Überprüfung.
  • Die Gesamtzahl der Aufrufe, die eine Anzeige erhalten haben (nur für blockierte).
  • Links zum Blockieren / Entsperren von Werbung und Werbekonten.
  • Links zum Blockieren der Ziel-URL oder -Domäne.
  • Link zum Einreichen einer Beschwerde über die Ankündigung (verfügbar im neuen CPO).
  • Links zum Hinzufügen verschiedener Teile der Anzeige zur Whitelist.
  • Link zum Löschen einer Anzeige aus dem Bericht.

Das Erscheinungsbild basiert auf dem alten CPO (und dem einzigen zum Zeitpunkt des Entwurfs).


Klickbar


Bei der Anzeige von einem Mobiltelefon aus nimmt jede Spalte die gesamte Bildschirmbreite ein, und es werden Schaltflächen angezeigt, mit denen Sie die angezeigte Spalte auswählen können.

Ein bisschen über Sicherheit


Sie können nur eingeschränkt auf das Bedienfeld zugreifen (um sich von einem Ort aus zu steuern) oder „weltweit“, sodass Sie von überall aus steuern können.

Der erste Fall ist sicher - niemand passt, wenn er nicht an einem funktionierenden PC sitzt. Im zweiten Fall muss die Adresse, an der sich die Software befindet, geheim gehalten werden, und das Passwort für die Eingabe des Bedienfelds wird angegeben. Um zu verhindern, dass Ihre geheime Adresse beim Verfolgen von Links zu Websites von Drittanbietern (aus Anzeigen) "leckt", wurde Folgendes getan:

  • Jeder externe Link hat ein solches Attribut
     rel = "noreferrer" 
  • Ein Referer, der nur innerhalb derselben Domain im Kopf übergeben wird, ist ein Tag:
     <meta name = "referrer" content = "same-origin"> 
  • Alle externen Links durchlaufen den Referer Cleaner:
     http: //nullrefer.com/? http: //free.da ... 

Automatisierungsergebnis


24 Stunden, 7 Tage die Woche werden alle neu in den CPO-Ankündigungen enthaltenen Informationen in Abständen von einigen Minuten überprüft. Infolgedessen werden anstößige (gemäß den vom Benutzer festgelegten Kriterien) an den Abschnitt "blockiert" gesendet. Ich habe es nie sicher gezählt, aber von ungefähr 100 blockierten Teilen waren 90 - 95 aus gutem Grund gesperrt. Von hundert "sauberen" Software durchschnittlich weniger als eine "schlechte".

Wie nenne ich "schlechte Werbung"? Alles, was zu mobilen Abonnements führt, alles, was "Download" bietet, einfach herunterladen oder "eine Datei herunterladen", ohne irgendwelche Einzelheiten, alles, was "Video ansehen" bietet, wieder ohne Details, alles, was überhaupt zu nichts führt , wie im Titel und im Text der Ankündigung angegeben, jede Erwähnung von Casinos in Ländern, in denen dies gesetzlich verboten ist.

Infolgedessen verbringe ich praktisch keine Zeit damit, Anzeigen zu suchen und zu blockieren, und Casino-Anzeigen und verschiedene Lebensmittelgeschäfte, die über meine Websites verteilt werden, sind zehnmal weniger geworden (leider wurde das Problem nicht vollständig gelöst - ich höre nicht auf, darüber nachzudenken).

Diebstahl in Form von unbewussten Abonnements ist ohne MegaFon-Karte noch geringer geworden !

Und woher kommt die MegaFon-Karte?
« » « » « »:
«» , . , .

Aber nicht alle Benutzer unserer Websites haben MegaFoncards und Analoga anderer PPSOS.
Deshalb, meine Herren, schützen Sie Ihre Besucher selbst vor unerwünschten Anklagen!

Das Open Source Projekt ist auf GitHub .

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


All Articles