Comment j'ai combattu le vol ... en utilisant php


Lorsque nous payons quotidiennement des services, c'est un achat de services.
Quand nous payons quotidiennement pour rien (parfois sans même le savoir) - c'est du vol.

Bonjour, lecteurs de Habr!

Comment tout a commencé


Je voulais moins voler, et combattons-le! Mais manuellement, c'était très fatigant, long et inefficace, puis l'idée est venue d'une manière ou d'une autre d'automatiser cette activité.

A propos de lequel du "vol" je? À propos de l'endroit où nous, en marchant sur Internet, cliquez sur le bouton "regarder la vidéo", une page est chargée, pour une raison quelconque, la vidéo n'est pas lue, nous quittons et marchons plus loin, mais en fait, nous avons activé "volontairement" le service pour recevoir ce que quelque chose que personne n'a jamais vu pour un montant nominal de 30 roubles par jour depuis son compte mobile. Chez les gens, cela s'appelle wap-click ou abonnements mobiles, et les opérateurs mobiles proposent une variété de beaux noms. N'incluez toujours pas le vol de boutons vidéo dans la liste des services.

Voici un peu plus de détails. Et voici une histoire sur un bon moyen de «gagner de l'argent».

Il existe de nombreux cas décrits d'abonnements non entièrement volontaires, celui-ci par exemple. Non écrit - bien plus.

Les lutteurs ont également:


Quoi et pourquoi a été automatisé


Recherchez et bloquez les annonces dans le panneau de l'éditeur Google AdSense.
L'objectif est d'augmenter l'efficacité du blocage et de libérer le temps consacré au nettoyage manuel.

L'essence du problème et les solutions disponibles
Pendant de nombreuses années (la première mention d'une chose similaire que j'ai trouvée remonte à l'été 2014), les éditeurs ont capturé manuellement les flux de "morts de Yakubovich", "élévateurs de pierre", "regarder la vidéo, cliquer sur regarder" et d'autres mauvais esprits ( début , suite ), ce processus presque aucune automatisation 1 et cela semblait presque impossible.

1 Il existe (au moins une fois) deux solutions, mais elles ont des exigences assez sérieuses que tout le monde ne peut pas se permettre.
Ces mêmes solutions:

  1. Nettoyant AdSense . Cela prend beaucoup plus. Logiciel.
  2. AdsAutomation . Le script pour contrôler le navigateur Google Chrome (si je comprends bien, sur ZennoPoster). Un PC séparé est requis. Et pour le moment, le projet a été supprimé de GitHub.

Si vous créez un logiciel qui remplace la personne bloquant l'annonce, cela doit être fait en tenant compte d'un certain nombre d'exigences:

  • devrait travailler sur le matériel et les logiciels que presque tous les propriétaires de sites possèdent;
  • Ne nécessite pas de logiciel supplémentaire et modifiez les paramètres existants;
  • Facile à installer et à configurer pour que l'utilisateur moyen puisse livrer.
.

En général, php (avec cURL) aura ce qu'il faut. Vous pouvez télécharger directement sur votre site Web et travailler sans ordinateurs supplémentaires et autres difficultés.

Et un raffinement des exigences.
Étant donné que la solution était censée être automatisée en php, donc, le lancement via cron, le stockage des paramètres utilisateur et des données temporaires devrait être sur le disque (pas dans un cookie). Seule la clé d'accès au panneau de contrôle sera stockée dans les cookies. Pour l'élite qui n'a pas la possibilité de configurer cron, mais qui peut garder un onglet ouvert sur un PC / tablette / smartphone, la possibilité d'exécuter périodiquement un minuteur sur Javascript sera ajoutée.

Ce que le début ou l'API Google préfigurait


Et pour AdSense, il y a une API, je l'ai vue du coin de l'œil et je ne suis pas allé en profondeur. Il est maintenant temps de se plonger dans. Il existe de nombreuses possibilités, mais il s'est avéré que ni ici , eh bien, rien n'a été décrit sur l'API pour le CPU . Vous voulez regarder des publicités qui tournent sur le site, s'il vous plaît - manuellement.

Commencer


L'interface Google AdSense est construite sur AngularDart, tout semble beau et assez compliqué du point de vue de l'appareil.

Tout d'abord, j'ai regardé les outils de développement de Google Chrome sur l'onglet "Réseau" pour "écouter" comment cette interface sophistiquée communique avec le serveur. Il y avait beaucoup de demandes là-bas, les plus intéressantes pour moi étaient dans la section "XHR et Fetch", et là j'ai trouvé quelque chose qui semblait assez devinable, si vous réfléchissez bien. Par exemple, l'une des demandes de publication:

La chaîne transmise.
{"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"} 

Dans la demande, l'identifiant de l'éditeur est immédiatement visible, sous le deuxième paragraphe un ensemble de paramètres, dont l'essence peut être déterminée expérimentalement et le jeton XSRF.

Et en réponse, il reçoit des informations détaillées sur l'annonce, mais pas toutes sans l'annonce elle-même (ci-après, les images allongées en base64 ont été recadrées).

Une feuille de plusieurs pages.
 {"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"} 

Après json_decode, cela ressemble à ceci:

Un objet d'une chaîne json (attention, 175 lignes).
 objet (stdClass) # 19 (2) {
   ["result"] =>
   objet (stdClass) # 18 (8) {
     ["1"] =>
     tableau (1) {
       [0] =>
       objet (stdClass) # 1 (8) {
         ["1"] =>
         int (0)
         ["3"] =>
         int (0)
         ["4"] =>
         objet (stdClass) # 2 (1) {
           ["1"] =>
           chaîne (120) "AClZvXJ2t4wiEZ / VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLQQQQQQQ0QQQQQOQ
         }
         ["5"] =>
         objet (stdClass) # 3 (17) {
           ["1"] =>
           int (82)
           ["2"] =>
           int (0)
           ["3"] =>
           int (0)
           ["4"] =>
           chaîne (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </div>"
           ["5"] =>
           chaîne (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </div>"
           ["6"] =>
           chaîne (355) "<div> Multi-format <span id = 'multi-format-tooltip'> </span> </div> <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> "
           ["7"] =>
           chaîne (1066) "<div class = 'arc-one-by-one-legend'> Type d'annonce </div> <div class = 'arc-one-by-one-data'> Multi-format <span id = 'multi -format-tooltip '> </span> </div> <div class =' ​​arc-one-by-one-legend '> URL de destination </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'> Domaines de l'éditeur </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'> Annonceur détecté <span id = 'adx-  info-bulle de l'annonceur "> </span> </div> <div class = 'arc-one-by-one-data'> Boutique DNS </div>"
           ["8"] =>
           string (98) "<div> <span class = 'arc-impression-score high'> HIGH </span> impressions </div>"
           ["9"] =>
           objet (stdClass) # 4 (3) {
             ["1"] =>
             chaîne (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"] =>
             chaîne (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"] =>
             chaîne (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"] =>
           chaîne (69) "https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/"
           ["15"] =>
           chaîne (0) ""
           ["17"] =>
           chaîne (0) ""
           ["18"] =>
           string (8) "Boutique DNS"
           ["20"] =>
           chaîne (20) "adv-5594449542310820"
           ["21"] =>
           tableau (4) {
             [0] =>
             string (8) "site1.ru"
             [1] =>
             chaîne (9) "site2.com"
             [2] =>
             chaîne (9) "site3.com"
             [3] =>
             string (8) "site4.ru"
           }
         }
         ["6"] =>
         objet (stdClass) # 5 (3) {
           ["5"] =>
           chaîne (20) "-6668648012302470727"
           ["7"] =>
           tableau (1) {
             [0] =>
             chaîne (3) "DNS"
           }
           ["9"] =>
           int (0)
         }
         ["7"] =>
         int (1)
         ["9"] =>
         objet (stdClass) # 16 (1) {
           ["3"] =>
           tableau (5) {
             [0] =>
             objet (stdClass) # 7 (3) {
               ["1"] =>
               objet (stdClass) # 6 (1) {
                 ["1"] =>
                 chaîne (56) "AClZvXLE9HJbFYq9TrAsXFgV4YkXsQt9lXp1xWjSB5aT5bFBpe4VNgo ="
               }
               ["2"] =>
               chaîne (52) "Internet et télécommunications"
               ["3"] =>
               string (217) "Produits et services liés aux télécommunications, y compris les services par câble et satellite et l'accès à Internet."
             }
             [1] =>
             objet (stdClass) # 9 (3) {
               ["1"] =>
               objet (stdClass) # 8 (1) {
                 ["1"] =>
                 chaîne (56) "AClZvXKrUJJ3kKBen2scP56BynOtGhf160i1F1LLmtBj3b / oh2dUFg8 ="
               }
               ["2"] =>
               string (35) "Téléphones portables"
               ["3"] =>
               string (359) "Téléphones mobiles et cellulaires, ainsi que les informations connexes, telles que les spécifications techniques et l'analyse comparative des produits. Cette catégorie ne comprend pas les accessoires de téléphonie mobile."
             }
             [2] =>
             objet (stdClass) # 11 (3) {
               ["1"] =>
               objet (stdClass) # 10 (1) {
                 ["1"] =>
                 chaîne (56) "AClZvXL4W + khZ4O9SJiu97cTbTs2 + 0Wecf1IVNju8ffd4ysIT9PJ7XY ="
               }
               ["2"] =>
               string (73) "Téléphones portables et accessoires pour eux"
               ["3"] =>
               string (283) "Téléphones portables, ainsi que les accessoires et le matériel connexes, tels que les étuis, les monopodes pour selfies, les écrans de sécurité et les chargeurs."
             }
             [3] =>
             objet (stdClass) # 13 (3) {
               ["1"] =>
               objet (stdClass) # 12 (1) {
                 ["1"] =>
                 chaîne (56) "AClZvXLQ3gPoVwjQbokDpB3 + nni4xURwH5 + YlnwkqjYtUowjhiKvk8Q ="
               }
               ["2"] =>
               string (45) "PC et électronique grand public"
               ["3"] =>
               string (142) "Produits, services et informations liés aux ordinateurs et à l'électronique grand public."
             }
             [4] =>
             objet (stdClass) # 15 (3) {
               ["1"] =>
               objet (stdClass) # 14 (1) {
                 ["1"] =>
                 chaîne (56) "AClZvXLKYOGgOROaa32IUxU15jP89AtTM4dV24WKS + daMhqJMTNmeSY ="
               }
               ["2"] =>
               chaîne (18) "Téléphonie"
               ["3"] =>
               string (181) "Produits, services, ainsi que des informations et autres ressources liées à la téléphonie et aux communications vocales."
             }
           }
         }
         ["10"] =>
         objet (stdClass) # 17 (1) {
           ["1"] =>
           chaîne (76) "AClZvXLdGOShgJo + BM3apOUAFzQkE41z1 / hiZhIY8eUlC7p7xXPm82P3dq7yXhbEI + tN / YHgdH4P"
         }
       }
     }
     ["2"] =>
     flotteur (0)
     ["3"] =>
     chaîne (5) "60609"
     ["4"] =>
     int (1)
     ["5"] =>
     chaîne (0) ""
     ["6"] =>
     string (168) "ClD3Z2nP2P ///// 1 / ff99fXV98nMyMrJz8rH9fHV883Hx8bMz83Oz8vOzv8A / v / + 9f33 / fX11ffJzMjKyc / Kx / Xx1fPNx8fGzM / NZS / Lzs7 // hABIWxUk293Pm + qOQAAAAAnMJaYSAFQAFoLCS8wxxaTatL1EAJgp7737gY ="
     ["7"] =>
     chaîne (4) "3639"
     ["9"] =>
     int (0)
   }
   ["xsrf"] =>
   chaîne (48) "ABOvogKaRsVZECZZJU-gDWrOqoP0CSqf7Q: 1535467886413"
 }


Il s'agit d'un exemple de réponse contenant une seule déclaration. Comprenez ce qui est possible.
Et pour d'autres requêtes, les méthodes sont appelées assez humainement. Quelques exemples:

  • getWebPropertyMetricsToken
  • getAdDisplayLanguages
  • getArcSettings
  • getAdNetworkApprovals
  • getPubControlsCapabilities

Théoriquement possible. Pour combattre?


D'accord, il est possible de résoudre leur communication (théoriquement), mais tout cela sera inutile, et la théorie restera si vous n'autorisez pas sur Google.

Autorisation Ou comment entrer sur Google sur php + cURL


Encore une fois, les outils de développement, quittez le compte et regardez l'échange de données. Je ne me souviens pas en détail, car je n'y comprenais rien. Une énorme quantité de JS, il semble que certains types de calculs soient effectués directement sur le client, les résultats sont envoyés au serveur. En général, il est presque impossible pour une personne d'entrer.

Nous pensons plus loin. Un tas de JS. Et si vous désactivez JS? Mais Google ne privera pas les utilisateurs sans JS de la possibilité de se connecter? Eh bien, essayez sans JS. Extérieurement, la fenêtre d'autorisation semble déjà beaucoup plus facile. Comme précédemment, entrez d'abord le login et le mot de passe sur la page suivante. Plus important encore, en termes de HTML, c'est aussi beaucoup plus facile! La balise "form" habituelle avec les champs "input" habituels, mais pas sans un tas de champs de protection ou masqués par le système. Mais les champs cachés ne sont pas un problème, car ce qu'ils ont reçu à l'entrée est transmis au script suivant. Et il s'est donc avéré de se connecter à Google. Et l'autorisation en deux étapes? Plus d'informations à ce sujet plus tard. Vous devez d'abord vous assurer que vous pouvez retirer des annonces pour inspection, sinon tout cela n'a aucun sens.

La théorie est-elle possible en pratique?


Google est entré - il est temps de tester la théorie de la résolution des protocoles de communication dans la pratique. J'ai dû bricoler des expériences et des observations, observer attentivement et enregistrer quelles actions utilisateur conduisent à quelles requêtes, identifier les éléments de requête communs et changeants, comparer les longues valeurs incompréhensibles reçues du serveur avec les mêmes longues renvoyées dans la prochaine demande. C'était une forêt dense, qui au fil du temps est devenue plus claire et plus transparente.

Que fallait-il faire pour comprendre que la suite a du sens?

  1. Connectez-vous au CPO .
  2. Obtenez une liste d'annonces.
  3. Obtenez une annonce spécifique (texte en premier).

Se connecter au CPO est le plus simple, grosso modo, il suffit de suivre le lien. Cela s'est avéré.

Détails
Nous suivons simplement le lien, nous obtenons la réponse (que nous n'utilisons pas dans ce cas). Nous devons également demander et enregistrer un jeton numérique pour les demandes futures.

Au moment de la rédaction du présent rapport, AdSense possède deux centres de services publics. Je vais les nommer conditionnellement anciens et nouveaux.

Pour l'ancien CPO.

Aucune demande de post charge:

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

La réponse est:

 <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"> 

Nous avons besoin de la quatrième ligne, à savoir "syn.token.pb". Nous conservons cette valeur pour la génération de requêtes supplémentaires.

Pour le nouveau CPO.

Aucune demande de post charge:

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

La réponse est:

 (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',}; 

La séquence dont nous avons besoin est ici:

'token': 'ABiMD8TT9vzK99SFB7iaI0ssBySxT9jjrQ:1535116725529'


Obtenir une liste est une tâche intéressante, car vous devez passer un certain nombre de paramètres - dites-nous ce que nous voulons recevoir (type d'annonces, vérifié / nouveau / bloqué, nombre d'annonces, etc.). Plus un jeton XSRF numérique par demande. Cela s'est avéré. En réponse, une grande quantité de données est arrivée, qui contenait même des miniatures d'images des sites où les annonces étaient diffusées. Et, bien sûr, des liens vers des annonces.

Détails
Les ébauches de mes tentatives ont été conservées pour déterminer quel paramètre est responsable de quoi. Je les ai un peu anobli, j'ai coupé tous les tapis et émoticônes et je les ai postés ici. Il y aura d'abord une séquence pour l'ancien CPO, puis pour le nouveau.

De plus, j'appellerai les noms des méthodes les requêtes (uniquement pour le nouveau CPU, pour l'ancienne méthode, il est indiqué dans le corps de la requête) et la chaîne json, car ils sont les «porteurs» d'informations, tout le reste (adresse, en-têtes, jetons numériques, autres paramètres) - «wrapper ", Ils ne sont pas fondamentaux, je vous en parlerai plus tard.

Pour l'ancien processeur (variable params de requête json):

 { "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" //,    } 

Le déchiffrement est, nous formulons une demande et nous recevons la réponse.

Pour l'ancien CPO, vous devez d'abord obtenir un jeton - faites une autre demande avant de demander des annonces:

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

La réponse est:

 {"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"} 

Cet énorme jeton ("1": "AClZ ..."), nous aurons besoin de demander des annonces.

Demander des annonces:

 {"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"} 

Je traduis la section 2 de la variable params:
Google, , :
("1":0),
24 ("2":24),
("3":0),
: AClZvX....


Un certain nombre de paramètres peuvent être omis, ils prennent des valeurs par défaut:

  • type d'annonces: toutes;
  • période: tous disponibles;
  • verrouillage prévu: non;
  • afficher uniquement non vérifié: non.

Des dizaines ou des centaines de kilo-octets viennent en réponse, selon le nombre d'annonces demandées. Le plus difficile est le graphisme «étiré» dans le texte (données: image / gif; base64 ....). Et s'il n'y en a pas, la réponse est simple:

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

S'il y avait des annonces, elles seraient contenues ici: résultat -> {5}.

Pour le nouveau 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 //    . . } 

Les demandes préliminaires n'ont pas besoin d'être faites, vous pouvez immédiatement demander des annonces.
SearchApprovals (c'est une méthode)

 {"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":"")


Paramètres et valeurs par défaut facultatifs:

  • numéro de série de la première annonce demandée: 0;
  • période: tous disponibles;

En réponse, nous obtenons presque la même chose que dans le cas de l'ancien CPO. Il diffère en un seul mot - le nom du conteneur de données. Dans l'ancien c'est «résultat», dans le nouveau c'est «par défaut».


Obtenir une annonce spécifique est simple, prenez le lien de la réponse précédente et téléchargez l'annonce. Il n'y a pas de protection ici, l'accès est gratuit pour tout le monde.

Détails
Lien vers l'annonce. Nous le rechercherons dans la réponse précédente, où nous avons reçu de très nombreux kilo-octets de texte en réponse à une demande d'annonces.

Pour qu'il n'y ait pas trop de code incompréhensible, je donne la réponse à la demande d'une annonce (et même alors elle a été impitoyablement coupée, c'était 10 fois plus, seule la chose la plus importante restait pour le moment):

 {"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"} 

À partir du paramètre {13}, vous pouvez obtenir le lien vers l'annonce:

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 .

Pendant un certain temps (jours, peut-être des semaines), le lien restera en ligne et tout le monde pourra en obtenir une annonce. Il y a environ 100 à 150 kilo-octets et tout en bas (et pas seulement) vous pouvez trouver des extraits du texte de l'annonce.

De plus, il s'agit d'un paramètre important - il s'agit de l'identifiant interne de l'annonce, que nous utiliserons pour la gérer davantage (blocage / déblocage de l'annonce, blocage / déblocage du compte AdWords qui dévisse cette annonce, demande de statistiques d'impression, définition de l'indicateur comme «vérifié», envoi d'un message sur la violation des règles) . Il est stocké ici:
résultat -> {1} -> {4} -> {1}.

Cela ressemble à ceci:

AClZvXJ2t4wiEZ/VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLGRcoQdDt+wOk46bdr0yA=

Sa longueur est de 120 caractères (à de rares exceptions près).

Il y a beaucoup d'informations dans ce flux de données:

  • Type d'annonce.
  • URL de destination
  • Domaines sur lesquels il a été dévissé.
  • Informations sur l'annonceur (nom, le cas échéant, et identifiant).
  • Caractéristique qualitative du nombre d'impressions, par exemple, «élevée».
  • Trois miniatures de page de destination sous forme de données: image.
  • La catégorie à laquelle appartient l'annonce, par exemple, Téléphonie.

Le résultat est obtenu - il se prête à l'automatisation. Ensuite, l'ordre dans les fonctions a été mis en place, parce que le prototype fonctionnait était terrible, je voulais juste comprendre rapidement si le processus serait automatisé. La première version a été offerte aux gens et l'achèvement et la correction des erreurs ont commencé. Le premier problème est que le "deux étapes" n'a pas pu se connecter.

Autorisation en 2 étapes


Si vous allez vérifier à quoi il ressemble lorsque JS est désactivé, vous pouvez voir de nombreuses options d'autorisation: mot de passe SMS, mots de passe à usage unique à partir d'un morceau de papier, via l'application ...
Automatisez chaque option pour que tout le monde soit à l'aise - vous pouvez devenir fou.

Développeur Rescue


Lorsque sans JS dans Chrome, j'ai regardé le mécanisme d'autorisation en deux étapes, j'ai vu une référence au choix d'une autre méthode, je suis devenu accro. Quelle que soit la méthode sélectionnée par défaut, il y a toujours une option pour aller à la sélection et sélectionner SMS. Ce fut un vrai salut. Bien sûr, j'ai dû vérifier la méthode sélectionnée par défaut, et dans le cas d'une méthode «incorrecte», «appuyer» sur le bouton de modification et sélectionner «mot de passe à usage unique par SMS».

Pour l'autorisation elle-même, je viens d'enregistrer les données intermédiaires du formulaire dans le fichier (le même groupe de tous les champs masqués) et le formulaire de saisie du mot de passe à usage unique. C’est tout, les «deux étapes» ont également pu entrer.

Achèvement du processus de création


La tâche principale était terminée - tout le monde pouvait installer et utiliser une solution automatisée pour filtrer périodiquement les annonces sur leurs sites.

Viennent ensuite les améliorations, les améliorations, la correction des déficiences ...
... identifié à la fois par les utilisateurs et indépendamment, le raffinement du design externe (intuitif pour l'auteur était incompréhensible pour presque tout le monde).
Diverses fonctions et filtres ont également été complétés et ajoutés pour rechercher des publicités répréhensibles. Par exemple, pour détecter automatiquement un hachage de lettres cyrilliques et latines. Les annonceurs normaux ne font pas de publicités comme celle-ci, mais il y a parfois des erreurs sous forme de mélange de mots russes d'un caractère latin (les erreurs populaires dans le filtre sont également prises en compte).

Modules complémentaires ajoutés pour plus de commodité:

  • Liste des annonceurs bloqués.
  • Liste des domaines bloqués.
  • Étiquette de revenu.
  • Liens AdSense.

La liste des annonceurs bloqués est une occasion de regarder et de modifier, et c'est plus pratique (mais pas plus joli en apparence) que dans l'interface régulière! De plus, il est possible de déverrouiller "en masse", ce qui n'est pas dans AdSense normal.

La liste des domaines bloqués est similaire à la liste précédente.

Capacité à travailler avec AdX (via AdManager, où AdX a récemment déménagé).

Il existe de nombreuses améliorations, les plus intéressantes à mon avis sont listées ci-dessus.


Fonctions d'envoi d'une demande et de réception d'un résultat


Auparavant, j'ai écrit sur les demandes sous forme de chaînes json et promis de l'ouvrir plus en détail plus tard.

Quand tout cela a été fait par le nouveau CPO, il n'y en avait pas encore, donc tout a été fait pour l'ancien, on va partir de là.

Communication avec l'ancien CPO


À l'aide d'observations, il a été possible de constater que le principal échange de demandes va à une seule adresse:

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


Ce qui n'est pas toujours entre crochets n'est qu'un paramètre qui indique la langue de la réponse; il peut être appliqué à presque tous les produits Google. C'est important, car j'utilise l'anglais partout et le logiciel reconnaît certains paramètres, en attendant une réponse en anglais.

En plus de l'adresse, il existe une forme standard de post-données transmises (dans les outils du développeur, elles sont visibles dans la section "Request Payload") - il s'agit d'une chaîne json avec les variables method, params et xsrf:

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

méthode - tout semble clair ici.
params - selon la méthode, son propre format standard pour la chaîne json transmise.
xsrf - la réception initiale du jeton numérique que nous utilisons pour la demande est décrite ci-dessus, et dans la réponse, nous recevons un nouveau jeton XSRF pour la prochaine demande.

La réponse se présente également sous la forme d'une chaîne json à partir des parties de result (informations demandées) et xsrf:

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

code de fonction php
 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 , .

Communication avec le nouveau CPO


Ici, l'adresse de la demande est plus compliquée - elle change. Il n'y a que la partie commune initiale. Le schéma est le suivant:

Partie générale + méthode + '?' + Paramètres GET + rpcTrackingId = <répétition des paramètres GET précédents dans le codage URL> + ':' + <numéro de séquence de la demande en utilisant la même méthode dans ... en général, jusqu'à ce que l'utilisateur actualise la page>.

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

Le jeton XSRF ici est passé dans l'en-tête 'x-framework-xsrf-token' et il est réutilisable, par conséquent, il ne vient pas dans les réponses et vous n'avez pas besoin de le mettre à jour en permanence.

code de fonction php
 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-»). , .


Requête de liste de domaines et fonction de gestion


C'est presque la même chose que la fonction de communiquer avec l'ancien CPO, elle ne diffère que par l'adresse de l'appel.

code de fonction php
 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 
.

Les jetons XSRF sont enregistrés sur le disque dans un fichier, il est nécessaire que les demandes de blocage / déblocage des publicités, des comptes AdWords et d'autres actions fonctionnent directement à partir du panneau de configuration sans qu'il soit nécessaire d'en demander un nouveau.

Traitement des réponses reçues


Les données se présentent sous la forme de chaînes json (les réponses reçues par les trois fonctions ci-dessus) et sous la forme d'un code JS (déclarations demandées), où une série de caractères est "cryptée" avec un codage hexadécimal (\ x <code de caractère à deux caractères>).

Extrait de l'annonce référencée ci-dessus:
target \ x3d_blank title \ x3d \ x22 \ x22 \ x3e \ x3cspan \ x3e Achetez Xiaomi Redmi S2 et obtenez Redmi 5 \ x3cbr \ x3e en cadeau. Du 24 août au 26 août. \ x3cbr \ x3eEn savoir plus sur le site.

Pour json, il existe une fonction en php qui donnera au moins un objet, au moins un tableau.
Pour les «Kosoiks» quelque part dans le réseau, j'ai trouvé une petite fonction qui apporte les données à la forme humaine.

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

Résultat de déchiffrement:
target = _blank title = ""> <span> Achetez Xiaomi Redmi S2 et obtenez Redmi 5 <br> en cadeau. Du 24 août au 26 août. <br> Plus d'informations sur le site.

Reconnaissance des annonces


Texte . J'ai commencé avec eux. Ils étaient plus importants et, en fin de compte, tout était beaucoup plus facile avec eux. Il n'y a que deux types: ancien, avec un titre (qui a presque disparu) et nouveau, avec deux titres.

L'annonce se présente déjà sous forme de code HTML, mais en plus de l'annonce, la réponse que nous recevons contient beaucoup de données dont nous n'avons pas besoin - le code Javascript (il n'est même pas entré dans l'essence de ce code).

La reconnaissance s'est finalement résumée aux étapes suivantes:

  • couper le «grand début», ne laissant que la «queue», qui contient le texte de l'annonce;
  • Création d'un objet à l'aide de la classe DOMDocument
  • recherchez dans la boucle les valeurs souhaitées: en-têtes, texte d'annonce, texte de lien.

Les en-têtes, le texte et un lien contiennent certaines classes et le module de reconnaissance s'y accroche.

Où et où est la fonction de traitement des annonces textuelles
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 . .


Graphique . Ils vérifient uniquement l'URL de destination. Il n'y a pas de reconnaissance des images, et enregistrez également les images pour inspection (car les images, si vous le souhaitez, peuvent également être visualisées dans le CPO). Je ne vois aucune raison de réinventer la roue (probablement une courbe et personne n'en a besoin).

Multimédia . Sous ce nom commun se cache un certain nombre d'annonces différentes:

  • Multi-format.
  • Média (Rich Media).
  • Modèle personnalisé (HTML5).

Pour le multi-format, 3 fonctions de reconnaissance ont été créées en fonction du type d'annonce.
Pour les médias, 2 fonctions ont été créées.

Pour HTML5, 3 fonctions ont été créées.

Filtrage


Après avoir reconnu les annonces, le processus de détermination des éléments répréhensibles selon différents critères commence (tous les filtres sont inclus, certains sont personnalisables):

  • La présence dans le domaine "blogspot.com".
  • La présence dans les mots d'un mélange de lettres cyrilliques et latines.
  • La présence de «mauvais» mots (une liste de «mauvais» mots est personnalisable par l'utilisateur).
  • Avoir un utilisateur redirigé vers un domaine autre que l'original.

Rapport de travail


Sur la base des résultats de la filtration, un rapport d'avancement est compilé.
Il est construit sous la forme d'une liste d'annonces pour chaque filtre dans sa colonne, plus un graphique pour les «bonnes» annonces, les informations suivantes sont incluses dans le rapport:

  • L'identifiant et le nom textuel de l'annonceur, le cas échéant.
  • Raison du blocage (uniquement pour bloqué).
  • En-têtes et texte d'annonce.
  • URL de destination et d'affichage.
  • Date et heure de vérification.
  • Nombre total de vues ayant réussi à obtenir une annonce (uniquement pour les bloquées).
  • Liens pour bloquer / débloquer les publicités et les comptes des annonceurs.
  • Liens pour bloquer l'URL ou le domaine de destination.
  • Lien pour déposer une plainte concernant l'annonce (disponible dans le nouveau CPO).
  • Liens pour ajouter différentes parties de l'annonce à la liste blanche.
  • Lien pour supprimer une annonce du rapport.

L'apparence est basée sur l'ancien CPO (et le seul au moment de la conception).


Cliquable


Lorsqu'elle est vue depuis un mobile, chaque colonne occupe toute la largeur de l'écran et des boutons apparaissent pour sélectionner la colonne que vous visualisez.

Un peu de sécurité


Vous pouvez avoir un accès limité au panneau de contrôle (pour vous contrôler à partir d'un seul endroit) ou «partout dans le monde» afin de pouvoir contrôler depuis n'importe où.

Le premier cas est sûr - personne ne conviendra s'il ne s'assoit pas devant un PC en état de marche. Dans le deuxième cas, l'adresse où se trouve le logiciel doit être gardée secrète, plus le mot de passe pour entrer dans le panneau de contrôle est fourni. Pour éviter que votre adresse secrète ne "coule" lorsque vous suivez des liens vers des sites tiers (à partir d'annonces), voici ce qui a été fait:

  • Chaque lien externe a un tel attribut
     rel = "noreferrer" 
  • Pour référencer passé uniquement dans le même domaine dans la tête est une balise:
     <meta name = "referrer" content = "same-origin"> 
  • Tous les liens externes passent par le nettoyeur de référents:
     http: //nullrefer.com/? http: //free.da ... 

Résultat d'automatisation


24 heures 7 jours par semaine, toutes les nouvelles apparitions dans les annonces du CPO sont examinées à des intervalles de quelques minutes. En conséquence, les messages répréhensibles (selon les critères spécifiés par l'utilisateur) sont envoyés à la section "bloqué". Je ne l'ai jamais compté à coup sûr, mais sur environ 100 pièces bloquées, 90 à 95 ont été verrouillées pour une bonne raison. Sur une centaine de logiciels «propres», en moyenne, moins d'un «mauvais».

Qu'est-ce que j'appelle des "mauvaises publicités"? Tout ce qui mène aux abonnements mobiles, tout ce qui propose de "télécharger", juste télécharger ou "télécharger un fichier" sans aucune spécification du tout, tout ce qui offre "regarder une vidéo", encore une fois sans aucun détail, tout ce qui mène au mauvais endroit , comme indiqué dans le titre et le texte de l'annonce, toute mention de casinos dans les pays où cela est interdit par la loi.

En conséquence, je ne passe pratiquement pas mon temps à rechercher et bloquer les publicités, et les publicités de casino et diverses épiceries distribuées sur mes sites sont devenues dix fois moins importantes (malheureusement, le problème n'est pas complètement résolu - je n'arrête pas d'y penser).

Le vol sous forme d' abonnements inconscients est devenu encore moins sans carte MegaFon!

Et d'où vient la carte MegaFon?
« » « » « »:
«» , . , .

Mais tous les utilisateurs de nos sites n'ont pas de MegaFoncards et analogues d'autres PPSOS.
Par conséquent, messieurs, protégez vos visiteurs contre les frais indésirables par vous-même!

Le projet open source est sur GitHub .

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


All Articles