
Cuando pagamos diariamente por los servicios, es una compra de servicios.
Cuando pagamos diariamente por nada (a veces sin siquiera saberlo), esto es un robo.
Buenas tardes, lectores de Habr!
Como empezó todo
¡Quería robar menos y luchemos! Pero manualmente fue muy agotador, largo e ineficaz, luego surgió la idea de automatizar de alguna manera este negocio.
¿Sobre cuál de los "robos" I? Acerca de dónde, caminando por Internet, hacemos clic en el botón "ver video", algunas páginas se cargan, por alguna razón el video no se reproduce, nos vamos y caminamos más, pero de hecho nos conectamos "voluntariamente" con el servicio para recibir lo que algo que nadie ha visto nunca por una tarifa nominal de 30 rublos por día desde su cuenta móvil. En las personas, esto se llama wap-click o suscripciones móviles, y los operadores móviles presentan una variedad de hermosos nombres. Aún así, no incluya el robo de botones de video en la lista de servicios.
Aquí
hay un poco más de detalle. Y
aquí hay una historia sobre una buena manera de "ganar dinero".
Hay muchos casos descritos de suscripciones no totalmente voluntarias,
esta , por ejemplo. No escrito, mucho más.
Los luchadores también tienen:
Qué y por qué se automatizó
Busque y bloquee anuncios en el panel de editores de Google AdSense.
El objetivo es aumentar la eficiencia del bloqueo y liberar el tiempo dedicado a la limpieza manual.
La esencia del problema y las soluciones disponibles.Durante muchos años (la
primera mención de algo similar que encontré fue en el verano de 2014), los editores captaron manualmente las corrientes de "muertes de Yakubovich", "elevadores de piedra", "ver video, hacer clic" y otros espíritus malignos (
comienzo ,
continuación ), este proceso casi no hay automatización
1 y parecía casi imposible.
1 Hay (al menos una vez) dos soluciones, pero tienen requisitos bastante serios que no todos pueden pagar.
Estas mismas soluciones:
- AdSense Cleaner . Se necesita mucho extra. Software
- AdsAutomation . El script para controlar el navegador Google Chrome (según tengo entendido, en ZennoPoster). Se requiere una PC separada. Y en este momento, el proyecto ha sido eliminado de GitHub.
Si crea un software que reemplaza a la persona que bloquea el anuncio, debe hacerlo teniendo en cuenta una serie de requisitos:
- debería funcionar en el hardware y software que tienen casi todos los propietarios de sitios;
- No requiera software adicional y cambie la configuración existente;
- Fácil de instalar y configurar para que el usuario promedio pueda entregar.
.
En general, php (con cURL) tendrá lo que se necesita. Puede cargar directamente a su sitio web y trabajar sin computadoras adicionales y otras dificultades.
Y un refinamiento a los requisitos.Dado que la solución estaba destinada a ser automatizada en php, por lo tanto, el lanzamiento a través de cron, el almacenamiento de la configuración del usuario y los datos temporales deben estar en el disco (no en una cookie). Solo la clave para acceder al panel de control se almacenará en las cookies. Para la élite que no tiene la capacidad de configurar cron, pero puede mantener una pestaña abierta en una PC / tableta / teléfono inteligente, se agregará la capacidad de ejecutar periódicamente un temporizador en Javascript.
Lo que el comienzo o la API de Google anunciaron
Y para AdSense hay una API, de alguna manera la vi por el rabillo del ojo y no profundicé. Ahora es el momento de profundizar. Hay muchas posibilidades, pero resultó que tampoco
aquí , bueno, no se ha descrito nada sobre la API para la
CPU . Desea ver los anuncios que giran en el sitio, por favor, manualmente.
Inicio
La interfaz de Google AdSense está construida en AngularDart, todo parece hermoso y bastante complicado desde el punto de vista del dispositivo.
En primer lugar, miré las herramientas para desarrolladores de Google Chrome en la pestaña "Red" para "escuchar" sobre cómo esta interfaz sofisticada se comunica con el servidor. Hubo muchas solicitudes allí, las más interesantes para mí fueron en la sección "XHR and Fetch", y allí encontré algo que parecía bastante adivinable, si lo piensas con cuidado. Por ejemplo, una de las solicitudes de publicación:
La cadena transmitida.{"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"}
En la solicitud, el identificador del editor es inmediatamente visible, bajo el segundo párrafo, un conjunto de parámetros, cuya esencia se puede determinar experimentalmente y el token XSRF.
Y en respuesta, recibe información detallada sobre el anuncio, pero no todo sin el anuncio en sí (en adelante, las imágenes alargadas en base64 se recortaron).
Una hoja de varias páginas. {"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"}
Después de json_decode, se ve más o menos así:
Un objeto de una cadena json (precaución, 175 líneas).
object (stdClass) # 19 (2) {
["resultado"] =>
object (stdClass) # 18 (8) {
["1"] =>
matriz (1) {
[0] =>
object (stdClass) # 1 (8) {
["1"] =>
int (0)
["3"] =>
int (0)
["4"] =>
object (stdClass) # 2 (1) {
["1"] =>
HABITACIÓN
}
["5"] =>
object (stdClass) # 3 (17) {
["1"] =>
int (82)
["2"] =>
int (0)
["3"] =>
int (0)
["4"] =>
cadena (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </div>"
["5"] =>
cadena (102) "<div id =" ad-parent-id-6A2DE3D206234468F53C743C0EEACD67A59E6C5B62C0371F770419826258CB1AD9591F60 "> </div>"
["6"] =>
string (355) "<div> Multi-formato <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"] =>
string (1066) "<div class = 'arc-one-by-one-legend'> Tipo de anuncio </div> <div class = 'arc-one-by-one-data'> Multi-formato <span id = 'multi -format-tooltip '> </span> </div> <div class =' arc-one-by-one-legend '> URL de destino </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'> Dominios del editor </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'> Anunciante detectado <span id = 'adx- Advertiser-tooltip '> </span> </div> <div class =' arc-one-by-one-data '> Tienda DNS </div> "
["8"] =>
string (98) "<div> <span class = 'arc-impression-score high'> HIGH </span> impresiones </div>"
["9"] =>
object (stdClass) # 4 (3) {
["1"] =>
cadena (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"] =>
cadena (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"] =>
cadena (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"] =>
cadena (69) "https://www.dns-shop.ru/actions/c09a061b-a048-11e8-9547-00155d03330d/"
["15"] =>
cadena (0) ""
["17"] =>
cadena (0) ""
["18"] =>
cadena (8) "Tienda DNS"
["20"] =>
cadena (20) "adv-5594449542310820"
["21"] =>
matriz (4) {
[0] =>
cadena (8) "site1.ru"
[1] =>
cadena (9) "site2.com"
[2] =>
cadena (9) "site3.com"
[3] =>
cadena (8) "site4.ru"
}
}
["6"] =>
object (stdClass) # 5 (3) {
["5"] =>
cadena (20) "-6668648012302470727"
["7"] =>
matriz (1) {
[0] =>
cadena (3) "DNS"
}
["9"] =>
int (0)
}
["7"] =>
int (1)
["9"] =>
object (stdClass) # 16 (1) {
["3"] =>
matriz (5) {
[0] =>
object (stdClass) # 7 (3) {
["1"] =>
object (stdClass) # 6 (1) {
["1"] =>
cadena (56) "AClZvXLE9HJbFYq9TrAsXFgV4YkXsQt9lXp1xWjSB5aT5bFBpe4VNgo ="
}
["2"] =>
cadena (52) "Internet y telecomunicaciones"
["3"] =>
cadena (217) "Productos y servicios relacionados con telecomunicaciones, incluidos servicios de cable y satélite y acceso a Internet".
}
[1] =>
object (stdClass) # 9 (3) {
["1"] =>
object (stdClass) # 8 (1) {
["1"] =>
cadena (56) "AClZvXKrUJJ3kKBen2scP56BynOtGhf160i1F1LLmtBj3b / oh2dUFg8 ="
}
["2"] =>
cadena (35) "Teléfonos móviles"
["3"] =>
cadena (359) "Teléfonos móviles y celulares, así como información relacionada, como especificaciones técnicas y análisis comparativo de productos. Esta categoría no incluye accesorios para teléfonos móviles".
}
[2] =>
object (stdClass) # 11 (3) {
["1"] =>
object (stdClass) # 10 (1) {
["1"] =>
cadena (56) "AClZvXL4W + khZ4O9SJiu97cTbTs2 + 0Wecf1IVNju8ffd4ysIT9PJ7XY ="
}
["2"] =>
cadena (73) "Teléfonos móviles y accesorios para ellos"
["3"] =>
string (283) "Teléfonos móviles, así como accesorios y hardware relacionados, como estuches, monopie para selfies, pantallas de seguridad y cargadores".
}
[3] =>
object (stdClass) # 13 (3) {
["1"] =>
object (stdClass) # 12 (1) {
["1"] =>
cadena (56) "AClZvXLQ3gPoVwjQbokDpB3 + nni4xURwH5 + YlnwkqjYtUowjhiKvk8Q ="
}
["2"] =>
cadena (45) "PC y electrónica de consumo"
["3"] =>
cadena (142) "Productos, servicios e información relacionados con las computadoras y la electrónica de consumo".
}
[4] =>
object (stdClass) # 15 (3) {
["1"] =>
object (stdClass) # 14 (1) {
["1"] =>
cadena (56) "AClZvXLKYOGgOROaa32IUxU15jP89AtTM4dV24WKS + daMhqJMTNmeSY ="
}
["2"] =>
cuerda (18) "Telefonía"
["3"] =>
cadena (181) "Productos, servicios, así como información y otros recursos relacionados con telefonía y comunicaciones de voz".
}
}
}
["10"] =>
object (stdClass) # 17 (1) {
["1"] =>
cadena (76) "AClZvXLdGOShgJo + BM3apOUAFzQkE41z1 / hiZhIY8eUlC7p7xXPm82P3dq7yXhbEI + tN / YHgdH4P"
}
}
}
["2"] =>
flotador (0)
["3"] =>
cuerda (5) "60609"
["4"] =>
int (1)
["5"] =>
cadena (0) ""
["6"] =>
string (168) "ClD3Z2nP2P ///// 1 / ff99fXV98nMyMrJz8rH9fHV883Hx8bMz83Oz8vOzv8A / v / + 9f33 / fX11ffJzMjKyc / Kx / Xx1fPNx8fGzM / NZS / Lzs7 // hABIWxUk293Pm + qOQAAAAAnMJaYSAFQAFoLCS8wxxaTatL1EAJgp7737gY ="
["7"] =>
cuerda (4) "3639"
["9"] =>
int (0)
}
["xsrf"] =>
cadena (48) "ABOvogKaRsVZECZZJU-gDWrOqoP0CSqf7Q: 1535467886413"
}
Esta fue una respuesta de ejemplo que contenía solo una declaración. Comprende lo que es posible.
Y para otras consultas, los métodos se llaman humanamente. Algunos ejemplos
- getWebPropertyMetricsToken
- getAdDisplayLanguages
- getArcSettings
- getAdNetworkApprovals
- getPubControlsCapabilities
Teóricamente posible. A la batalla?
De acuerdo, es posible resolver su comunicación (teóricamente), pero todo esto será inútil, y la teoría permanecerá si no autorizas en Google.
Autorización O cómo ingresar a Google en php + cURL
Una vez más, las herramientas de desarrollador salen de la cuenta y miran el intercambio de datos. No recuerdo en detalle, porque no podía entender nada allí. Una gran cantidad de JS, parece que algún tipo de cálculos se realizan directamente en el cliente, los resultados se envían al servidor. En general, es casi imposible que una persona ingrese.
Pensamos más allá. Un montón de JS. ¿Y si deshabilita JS? ¿Pero Google no privará a los usuarios sin JS de la capacidad de iniciar sesión? Bueno, inténtalo sin JS. Externamente, la ventana de autorización ya parece mucho más fácil. Como antes, ingrese primero el inicio de sesión y la contraseña en la página siguiente. Lo más importante, en términos de HTML, ¡también es mucho más fácil! La etiqueta de "formulario" habitual con los campos de "entrada" habituales, aunque no sin un montón de campos ocultos protectores o del sistema. Pero los campos ocultos no son un problema, porque lo que recibieron en la entrada se pasa al siguiente script. Y entonces resultó que inicie sesión en Google. ¿Y autorización de dos pasos? Más sobre esto más tarde. Primero, debe asegurarse de que puede extraer los anuncios para su inspección, de lo contrario, todo no tiene sentido.
¿Es teórico posible en la práctica?
Google ha entrado: es hora de probar la teoría de desentrañar protocolos de comunicación en la práctica. Tuve que jugar con experimentos y observaciones, observar cuidadosamente y registrar qué acciones del usuario conducen a qué consultas, identificar elementos de consulta comunes y cambiantes, comparar valores largos incomprensibles recibidos del servidor con los mismos valores largos enviados en la próxima solicitud. Era un bosque denso, que con el tiempo se hizo más claro y más transparente.
¿Qué se tuvo que hacer para entender que la continuación tiene sentido?
- Inicie sesión en el CPO .
- Obtenga una lista de anuncios.
- Obtenga un anuncio específico (texto primero).
Iniciar sesión en el CPO es lo más simple, en términos generales, solo siga el enlace. Resultó
DetallesSimplemente seguimos el enlace, obtenemos la respuesta (que no usamos en este caso). También necesitamos solicitar y guardar un token digital para futuras solicitudes.
Al momento de escribir este artículo, AdSense tiene dos centros de servicio público. Los nombraré condicionalmente viejos y nuevos.
Para el antiguo CPO.
Sin solicitud de carga posterior:
https://www.google.com/adsense/gwt-properties?pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964&ov=3&hl=en
La respuesta es:
<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">
Necesitamos la cuarta línea, a saber, "syn.token.pb". Mantenemos este valor para una mayor generación de consultas.
Para el nuevo CPO.
Sin solicitud de carga posterior:
https://www.google.com/ads-publisher-controls/acx/5/darc/loader?onearcClient=adsense&pc=ca-pub-8958890276790964&tpid=pub-8958890276790964&hl=en
La respuesta es:
(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 secuencia que necesitamos está aquí:
'token': 'ABiMD8TT9vzK99SFB7iaI0ssBySxT9jjrQ:1535116725529'
Obtener una lista es una tarea interesante, porque necesita pasar un montón de configuraciones: díganos qué queremos recibir (tipo de anuncios, verificado / nuevo / bloqueado, número de anuncios, etc.). Además de un token XSRF digital por solicitud. Resultó En respuesta, entró una gran cantidad de datos, que incluso contenían miniaturas de imágenes de aquellos sitios a los que conducían los anuncios. Y, por supuesto, enlaces a anuncios.
DetallesSe han conservado borradores de mis intentos para averiguar qué parámetro es responsable de qué. Los ennoblecí un poco,
corté todos los tapetes y emoticones y los publiqué aquí. Primero habrá una secuencia para el antiguo CPO, y luego para el nuevo.
Además, llamaré a los nombres de los métodos, las
solicitudes (solo para la nueva CPU, para el método anterior se indica en el cuerpo de la solicitud) y la cadena json, ya que son los "portadores" de información, todo lo demás (dirección, encabezados, tokens digitales, otros parámetros) - "envoltorio ", No son fundamentales, te contaré todo esto más adelante.
Para la CPU anterior (variable de parámetros de solicitud 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" //, }
El descifrado es, formamos una solicitud y recibimos la respuesta.
Para el antiguo CPO, primero debe obtener un token: haga otra solicitud antes de solicitar anuncios:
{"method":"getWebPropertyMetricsToken","params":"{\"1\":\"ca-pub-8958890276790964\"}","xsrf":"ABOvogKJ6-xmsNWK4Mbe_H5bT1xXhyj8SQ:1535115071772"}
La respuesta es:
{"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"}
Este gran token ("1": "AClZ ...") necesitaremos solicitar anuncios.
Solicitar anuncios:
{"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"}
Estoy traduciendo la sección 2 de la variable params:
Google, , :
("1":0),
24 ("2":24),
("3":0),
: AClZvX....
Se pueden omitir varios parámetros, toman valores predeterminados:
- tipo de anuncios: todos;
- período: todos disponibles;
- bloqueo predicho: no;
- mostrar solo sin verificar: no.
Decenas o cientos de kilobytes responden, dependiendo de la cantidad de anuncios solicitados. Lo más difícil son los gráficos "extendidos" en el texto (datos: imagen / gif; base64 ....). Y si no hay no verificados, la respuesta es simple:
{"result":{"4":1,"5":"","8":"0","9":0},"xsrf":"ABOvogLWqmyC7KH1zfvmPxk-Y69-Jzj5XQ:1535115074392"}
Si hubiera anuncios, estarían contenidos aquí: resultado -> {5}.
Para el nuevo 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 // . . }
No es necesario realizar solicitudes preliminares, puede solicitar anuncios de inmediato.
SearchApprovals (este es un método)
{"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":"")
Parámetros opcionales y valores predeterminados:
- número de serie del primer anuncio solicitado: 0;
- período: todos disponibles;
En respuesta, obtenemos casi lo mismo que en el caso del antiguo CPO. Difiere en una sola palabra: el nombre del contenedor de datos. En el antiguo es "resultado", en el nuevo es "predeterminado".
Obtener un anuncio específico es simple, tome el enlace de la respuesta anterior y descargue el anuncio. Aquí no hay protección, el acceso es gratuito para todos.
DetallesEnlace al anuncio. Lo buscaremos en la respuesta anterior, donde recibimos muchos, muchos kilobytes de texto en respuesta a una solicitud de anuncios.
Para que no haya demasiado código incomprensible, doy la respuesta a la solicitud de un anuncio (e incluso entonces se cortó sin piedad, fue 10 veces más, solo quedaba lo más importante en este momento):
{"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"}
Desde el parámetro {13} puede obtener el enlace al anuncio:
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 .
Durante algún tiempo (días, tal vez semanas) el enlace se activará y cualquiera puede recibir un anuncio a través de él. Hay alrededor de 100 a 150 kilobytes y en la parte inferior (y no solo) puede encontrar extractos del texto del anuncio.
Además, este es un parámetro importante: este es el identificador interno del anuncio, que usaremos para administrarlo aún más (bloquear / desbloquear el anuncio, bloquear / desbloquear la cuenta de AdWords que desenrosca este anuncio, solicitar estadísticas de impresión, configurar el marcado como "verificado", enviar un mensaje sobre la violación de las reglas) . Se almacena aquí:
resultado -> {1} -> {4} -> {1}.
Se ve así:
AClZvXJ2t4wiEZ/VZ0i54m0Qtqpi2DTqkI1kaPMTRi4LnsQn0iR5K1xBlFpS1xmJV7ko4a6qx5RcTkp7CzVjwoy5UDSWZ5jOCPLGRcoQdDt+wOk46bdr0yA=
Su longitud es de 120 caracteres (con raras excepciones).
Hay mucha información en esta secuencia de datos:
- Tipo de anuncio.
- URL de destino
- Dominios en los que se desenroscó.
- Información sobre el anunciante (nombre, si lo hay, e identificador).
- Característica cualitativa del número de impresiones, por ejemplo, "alto".
- Tres miniaturas de página de destino en forma de datos: imagen.
- La categoría a la que pertenece el anuncio, por ejemplo, Telefonía.
El resultado se obtiene: se presta a la automatización. Luego, se estableció el orden en las funciones, porque el prototipo de trabajo era terrible, solo quería entender rápidamente si el proceso sería automatizado. Se ofreció la primera versión a las personas y comenzó la finalización y corrección de errores. El primer problema es que la "dos etapas" no pudo iniciar sesión.
Autorización de 2 pasos
Si va a verificar cómo se ve cuando JS está apagado, puede ver muchas opciones de autorización: contraseña de SMS, contraseñas de un solo papel, a través de la aplicación ...
Automatice cada opción para que todos se sientan cómodos: puede volverse loco.
Rescate de desarrolladores
Cuando sin JS en Chrome miré el mecanismo de autorización de dos etapas, vi una referencia a la elección de otro método, me enganché a esto. Cualquiera que sea el método seleccionado por defecto, siempre hay una opción para ir a la selección y seleccionar SMS. Esta fue una verdadera salvación. Por supuesto, tuve que verificar el método seleccionado por defecto, y en el caso de un método "incorrecto", "presione" el botón de cambio y seleccione "contraseña de un solo uso por SMS".
Para la autorización en sí, acabo de guardar los datos intermedios del formulario en el archivo (el mismo grupo de todos los campos ocultos) y el formulario de ingreso de contraseña de un solo uso. Eso es todo, "dos etapas" también pudieron ingresar.
Finalización del proceso de creación.
La tarea principal se completó: cualquiera podía instalar y usar una solución automatizada para filtrar periódicamente anuncios en sus sitios.
Luego vinieron las mejoras, mejoras, corrección de deficiencias ...... identificado tanto por los usuarios como de forma independiente, el refinamiento del diseño externo (intuitivo para el autor era incomprensible para casi todos los demás).
También se completaron y agregaron varias funciones y filtros para buscar anuncios objetables. Por ejemplo, para detectar automáticamente un hash de letras cirílicas y latinas. Los anunciantes normales no hacen anuncios como este, pero a veces hay errores en la forma de mezclar palabras rusas de un carácter latino (también se tienen en cuenta los errores populares en el filtro).
Complementos agregados para mayor comodidad:
- Lista de anunciantes bloqueados.
- Lista de dominios bloqueados.
- Etiqueta de ingreso.
- Enlaces de AdSense.
La lista de anunciantes bloqueados es una oportunidad para mirar y editar, ¡y es más conveniente (pero no más bonita en apariencia) que en la interfaz normal! Además, existe la posibilidad de desbloquear "en masa", que no está en AdSense normal.
La lista de dominios bloqueados es similar a la lista anterior.
Capacidad para trabajar con AdX (a través de AdManager, donde AdX se mudó recientemente).
Hay muchas mejoras, las más interesantes en mi opinión se enumeran arriba.
Funciones de enviar una solicitud y recibir un resultado
Anteriormente, escribí sobre solicitudes en forma de cadenas json, y prometí abrirlo con más detalle más adelante.
Cuando todo esto fue hecho por el nuevo CPO, todavía no se había hecho, por lo tanto, todo se hizo por el viejo, comenzaremos desde allí.
Comunicación con el antiguo CPO
Con la ayuda de observaciones, fue posible descubrir que el intercambio principal de solicitudes va a una dirección:
https://www.google.com/adsense/gp/creativeReview?ov=3&pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964(&hl=en)
Lo que no siempre está entre paréntesis es solo un parámetro que indica el idioma de la respuesta; se puede aplicar a casi todos los productos de Google. Esto es importante, ya que uso inglés en todas partes y el software reconoce algunos parámetros, esperando una respuesta en inglés.
Además de la dirección, hay una forma estándar de datos posteriores transmitidos (en las herramientas del desarrollador están visibles en la sección "Solicitar carga útil"): esta es una cadena json con el método, parámetros y variables xsrf:
{"method":"getArcSettings","params":"{\"1\":[\"ca-pub-8958890276790964\"]}","xsrf":"ABOvogJlvXKkBQUbPYEsM04recgCsukFMg:1535467881599"}
método: todo parece estar claro aquí.
params: según el método, su propio formato estándar para la cadena json transmitida.
xsrf: el recibo inicial del token digital que usamos para la solicitud se describe arriba, y en la respuesta recibimos un nuevo token XSRF para la próxima solicitud.
La respuesta también viene en forma de una cadena json de las partes del resultado (información solicitada) y xsrf:
{"result":{"1":[{"1":"ca-pub-8958890276790964","2":{"1":"ca-pub-8958890276790964","2":0},"3":{"1":"ca-pub-8958890276790964","2":0}}]},"xsrf":"ABOvogIH7wJjD8t1xmuu8WbGplQowqjjJA:1535467883406"}
código de función php function creative_review($method, $params) { $xsrftoken = file_get_contents($GLOBALS['xsrftoken_file']); $creativeReview = new stdClass();
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 , .
Comunicación con el nuevo CPO
Aquí con la dirección de la solicitud es más complicado: cambia. Solo existe la parte común inicial. El esquema es el siguiente:Parte general + método + '?' + Parámetros GET + rpcTrackingId = <repetir parámetros GET anteriores en codificación URL> + ':' + <solicitar el número de serie utilizando el mismo método dentro de ... en general, hasta que el usuario actualice la página>.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
El token XSRF aquí se pasa en el encabezado 'x-framework-xsrf-token' y es reutilizable, por lo tanto, no viene en las respuestas y no es necesario actualizarlo constantemente.código de función 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);
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-»). , .
Consulta de lista de dominios y función de administración
Es casi lo mismo que la función de comunicarse con el antiguo CPO, solo difiere en la dirección de la apelación.código de función php function blocking_controls($method, $params) { $xsrftoken = file_get_contents($GLOBALS['xsrftoken_file']); $creativeReview = new stdClass();
$GLOBALS['blocking_controls_req_string']:
https://www.google.com/adsense/gp/blockingControls?ov=3&pid=pub-8958890276790964&authuser=0&tpid=pub-8958890276790964
.
Los tokens XSRF se guardan en el disco en un archivo, es necesario que las solicitudes para bloquear / desbloquear anuncios, cuentas de AdWords y otras acciones funcionen directamente desde el panel de control sin la necesidad de solicitar una nueva.Procesando respuestas recibidas
Los datos vienen en forma de cadenas json (las respuestas recibidas por las tres funciones anteriores) y en forma de un código JS (declaraciones solicitadas), donde una serie de caracteres está "encriptada" con codificación hexadecimal (\ x <código de caracteres de dos caracteres>).Extracto del anuncio mencionado anteriormente:target \ x3d_blank title \ x3d \ x22 \ x22 \ x3e \ x3cspan \ x3e Compre Xiaomi Redmi S2 y obtenga Redmi 5 \ x3cbr \ x3e como regalo. Del 24 al 26 de agosto. \ x3cbr \ x3eMás información en el sitio.
Para json, hay una función en php que producirá al menos un objeto, al menos una matriz.Para los "Kosoiks" en algún lugar de la red, encontré una pequeña función que trae los datos a la forma humana.código de función php function hex_repl($html) { $i = 256; while ($i >= 0) { $hex = dechex($i); $html = str_ireplace("\x$hex", chr($i), $html); $i--; } return $html; }
Resultado de descifrado:target = _blank title = ""> <span> Compre Xiaomi Redmi S2 y obtenga Redmi 5 <br> como regalo. Del 24 al 26 de agosto. <br> Más información en el sitio.
Reconocimiento de anuncios
Texto . Empecé con ellos. Eran más importantes y, como resultó, todo fue mucho más fácil con ellos. Solo hay dos tipos: antiguo, con un encabezado (que casi ha desaparecido) y nuevo, con dos encabezados.El anuncio ya viene en forma de código HTML, pero además del anuncio, la respuesta contiene una gran cantidad de datos que no necesitamos: el código Javascript (ni siquiera entró en la esencia de este código).El reconocimiento finalmente se redujo a los siguientes pasos:- recortar el "gran comienzo", dejando solo la "cola", que contiene el texto del anuncio;
- Crear un objeto usando la clase DOMDocument
- busque en el bucle los valores deseados: encabezados, texto del anuncio, texto del enlace.
Los encabezados, el texto y un enlace contienen ciertas clases, y el reconocedor se "aferró" a ellas.Qué es dónde y la función de procesar anuncios de textorhtitleline1 — 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; }
— . .
$fulltext — .
utf8_decode . DOMDocument . .
Gráfico . Solo verifican la URL de destino. No hay reconocimiento de imágenes, guardando imágenes para inspección también (porque las imágenes, si se desea, también se pueden ver en el CPO). No veo ninguna razón aquí para reinventar la rueda (muy probablemente una curva y nadie la necesita).Multimedia . Bajo este nombre común se esconden varios anuncios diferentes:- Multi-formato
- Media (Rich Media).
- Plantilla personalizada (HTML5).
Para el formato múltiple, se crearon 3 funciones de reconocimiento según el tipo de anuncio.Para los medios, se han creado 2 funciones.Para HTML5, se han creado 3 funciones.Filtrado
Después de reconocer los anuncios, comienza el proceso de determinación objetable por diferentes criterios (se incluyen todos los filtros, algunos son personalizables):- La presencia en el dominio "blogspot.com".
- La presencia en palabras de una mezcla de letras cirílicas y latinas.
- La presencia de palabras "malas" (el usuario puede personalizar una lista de palabras "malas").
- Tener un usuario redirigido a un dominio que no sea el original.
Informe de trabajo
Basado en los resultados de la filtración, se compila un informe de progreso.Está construido en forma de una lista de anuncios para cada filtro en su columna, más un gráfico para anuncios "buenos", la siguiente información se incluye en el informe:- El identificador y el nombre textual del anunciante, si corresponde.
- Motivo del bloqueo (solo para bloqueado).
- Encabezados y texto del anuncio.
- Destino y URL visible.
- Fecha y hora de verificación.
- El número total de vistas que lograron obtener un anuncio (solo para bloqueadas).
- Enlaces para bloquear / desbloquear anuncios y cuentas de anunciantes.
- Enlaces para bloquear la URL o dominio de destino.
- Enlace para presentar una queja sobre el anuncio (disponible en el nuevo CPO).
- Enlaces para agregar diferentes partes del anuncio a la lista blanca.
- Enlace para eliminar un anuncio del informe.
La apariencia se basa en la base del antiguo CPO (y el único en el momento del diseño).
Se puede hacer cliccuando se ve desde un dispositivo móvil, cada columna ocupa todo el ancho de la pantalla y aparecen botones para seleccionar la columna que está viendo.Un poco sobre seguridad
Puede hacer un acceso limitado al panel de control (para controlarse desde un lugar) o "en todo el mundo" para que pueda controlar desde cualquier lugar.El primer caso es seguro: nadie encajará si no se sienta en una PC que funciona. En el segundo caso, la dirección donde se encuentra el software debe mantenerse en secreto, además de proporcionar la contraseña para ingresar al panel de control. Para evitar que su dirección secreta se filtre al seguir enlaces a sitios de terceros (desde anuncios), se hizo lo siguiente:Resultado de la automatización
Las 24 horas, los 7 días de la semana, todos los anuncios que aparecen recientemente en el CPO se examinan a intervalos de un par de minutos. Como resultado, los objetables (según los criterios especificados por el usuario) se envían a la sección "bloqueada". Nunca lo conté con seguridad, pero de alrededor de 100 piezas bloqueadas, 90 - 95 fueron bloqueadas por una buena razón. De un centenar de software "limpio", en promedio, menos de uno "malo".¿Qué llamo "anuncios malos"? Todo lo que conduce a suscripciones móviles, todo lo que ofrece "descargar", simplemente descargar o "descargar un archivo" sin ningún tipo de detalles, todo lo que ofrece "mirar un video", nuevamente sin ningún detalle, todo lo que no conduce a nada , como se indica en el título y el texto del anuncio, cualquier mención de casinos en países donde la ley lo prohíba.Como resultado, prácticamente no paso mi tiempo buscando y bloqueando anuncios, y los anuncios de casino y varias tiendas de abarrotes distribuidos a través de mis sitios se han vuelto diez veces menos (desafortunadamente, el problema no se ha resuelto por completo, no dejo de pensar en esto).¡El robo en forma de suscripciones inconscientes se ha vuelto aún menos sin una tarjeta MegaFon!¿Y dónde entra la tarjeta MegaFon? Pero no todos los usuarios de nuestros sitios tienen MegaFoncards y análogos de otros PPSOS.Por lo tanto, caballeros, ¡protejan a sus visitantes de cargos no deseados por ustedes mismos!El proyecto de código abierto está en GitHub .