Deja un comentario

16

Tarea:

Haga un programa que deje un comentario sobre esta pregunta. El contenido debería ser 1234567890123456.

Ediciones:

  1. Puede dejar sus nombres de usuario y contraseñas como Uy Psi está utilizando nombre de usuario y contraseña. (si es aplicable)

  2. Sin acortadores de URL (si corresponde)

  3. No puede usar la consola del navegador.

Meinkraft
fuente
27
Publique una captura de pantalla de su bandeja de entrada al final de este desafío ...
Martin Ender
1
Para las personas que prueban su código: elimine sus comentarios después de enviarlos, para evitar que los comentarios sobre este desafío se vuelvan innecesariamente largos y spam, y para facilitar los trabajos de los mods.
Mego
1
¿Nadie más piensa que esto está poco especificado? ¿Cómo demonios hago eso? ¿No son las preguntas destinadas a ser independientes? ¿Dónde está el enlace a los documentos de la API?
gato
44
@cat Si bien estoy de acuerdo en que las especificaciones son bastante escasas, creo que es porque simplemente no hay un todo que deba decirse. También tenga en cuenta que la pregunta no requiere el uso de la API de Stack Exchange, por lo que incluir documentos de API en la pregunta sería bastante superfluo.
Alex A.
3
La votación para cerrar no está clara porque al observar las respuestas y comentarios existentes, me parece que esto necesita a) incluir explícitamente en la lista blanca las entradas permitidas (en una lectura simple, las respuestas pueden no tener entrada, pero algunas de ellas parecen estar tomando autenticación detalles y omitiendo el requisito implícito de usar nombre de usuario y contraseña para iniciar sesión); b) para aclarar qué se entiende por " Puede dejar sus nombres de usuario y contraseñas como U y P, respectivamente " (lo que interpretaría que nos dice que codifiquemos "U" y "P", pero que otros han interpretado claramente de manera diferente).
Peter Taylor

Respuestas:

11

Javascript con jQuery, 127 bytes

$.post("//codegolf.stackexchange.com/posts/84546/comments",{comment:"12345678901‌​23456",fkey:StackExchange.options.user.fkey})

Gracias a Ismael Miguel y nicael por algunos bytes.

El fkeyparámetro es exclusivo de su cuenta y se puede encontrar examinando el contenido de almacenamiento local de su navegador con una página de StackExchange abierta. Este código debe ejecutarse en un navegador con una sesión abierta de StackExchange presente. Carga automáticamente el fkeyparámetro desde el almacenamiento local del navegador (las versiones anteriores de este envío requerían que se ingresara manualmente).

Desafortunadamente, la ppcg.lolURL no se puede usar porque no pasa las solicitudes POST.

Dato curioso: si intentas ejecutar este código sin el fkeyvalor adecuado , obtienes una respuesta HTTP 418 :

tetera

Ejemplo de cómo encontrar el fkeyvalor en Chrome:

fkey

Al parecer, las cosas de Winterbash todavía se están almacenando. Ordenado.

Como referencia, lo mismo en Javascript vainilla sería 314 bytes (gracias de nuevo a Ismael Miguel y nicael por algunos bytes desactivados):

with(new XMLHttpRequest()){
open("POST","//codegolf.stackexchange.com/posts/84546/comments",1)
setRequestHeader("Content-type","application/x-www-form-urlencoded")
setRequestHeader("Content-length",62)
setRequestHeader("Connection","close")
send("comment=1234567890123456&fkey="+StackExchange.options.user.fkey}))}
Mego
fuente
Estaba a punto de escribir esto. Agregue un fragmento de pila.
NoOneIsHere
¡Me gusta cómo usa la solicitud para acceder al sitio en lugar de usar selenio!
Meinkraft
1
@NoOneIsHere A Stack Snippet no es posible porque se ejecutan en modo sandbox, sin acceso a los datos de sesión / cookie del navegador. Además, no estoy seguro de si los Fragmentos de pila incluso permiten solicitudes POST.
Mego
3
@IsmaelMiguel Downvoting por perder accidentalmente la capitalización de una letra en el código parece un poco ridículo, pero esa es su decisión. Ya está arreglado.
Mego
2
@IsmaelMiguel Downvoting debido a un ligero error tipográfico es.
Mego
14

AppleScript con Safari, 269 287 bytes

tell application "Safari"
activate
tell window 1
set current tab to (make new tab with properties {URL:"http://codegolf.stackexchange.com/q/84546"})
delay 5
do JavaScript "$('a')[66].click();$('textarea')[0].val('1234567890123456');$('input')[5].click()" in current tab
end tell
end tell

Para usar esto, debe habilitar la Configuración de desarrollador de Safari y luego habilitarla Allow JavaScript from Apple Events. No estoy seguro de si es trampa o no usar el llavero existente + cookies, pero bueno.

También logré hacer esto en OSX's Automator simplemente automatizando los clics y las pulsaciones de teclas, sin embargo, no pensé que se mantuviera fiel a la idea del desafío.

Sirenas
fuente
2
Hola y bienvenidos a PPCG! ¡Esto es genial! Eso no es trampa. También debe habilitar JS para todas las respuestas de JavaScript.
NoOneIsHere
Bienvenido a PPCG! Si bien esta es ciertamente una respuesta creativa, no es autónoma, ya que no toma el nombre de usuario y la contraseña como entrada.
Patrick Roberts
1
@ Sirenas Gracias por la respuesta. Acabo de editar la pregunta, así que ¿no puedes usar acortadores de URL?
Meinkraft
1
No parece funcionar ... Quiero decir, hace clic en el enlace de la bandera, no en el enlace de comentarios.
nicael
1
El OP modificó el desafío para no permitir acortadores de URL, lo que invalida esta respuesta hasta que cambie ppcg.lol por codegolf.stackexchange.com.
Alex A.
7

Python 3.5 con Selenium Webdriver, 485 427 469 461 449 414 403 bytes:

from selenium.webdriver import*;import time;D=Chrome();I=lambda k:D.find_element_by_name(k);C='comment';D.get('http://www.codegolf.stackexchange.com/users/login');I('email').send_keys(U);Z=I('password');Z.send_keys(P);Z.submit();D.get('http://www.codegolf.stackexchange.com/questions/84546');D.find_element_by_link_text('add a '+C).click();E=I(C);E.send_keys('1234567890123456');time.sleep(1);E.submit()

Un programa completo que utiliza una solución simple de controlador web Python selenium. Funciona en Chrome, aunque necesita ChromeDriver instalado para funcionar. Funciona cambiando el nombre Uy Pla contraseña y el correo electrónico de Stack Exchange del usuario, respectivamente. Sin embargo, si hay algún problema al instalar ChromeDriver, aquí hay una solución FireFox que se ejecuta exactamente de la misma manera que la solución anterior y no necesita ningún controlador, aunque actualmente es 1 byte más largo en 414 404 bytes :

from selenium.webdriver import*;import time;D=Firefox();I=lambda k:D.find_element_by_name(k);C='comment';D.get('http://www.codegolf.stackexchange.com/users/login');I('email').send_keys(U);Z=I('password');Z.send_keys(P);Z.submit();D.get('http://www.codegolf.stackexchange.com/questions/84546');D.find_element_by_link_text('add a '+C).click();E=I(C);E.send_keys('1234567890123456');time.sleep(1);E.submit()

Además, si se desea una función, aquí hay una solución que utiliza una función lambda anónima, actualmente en 513 455 497 489 477 449 431 bytes y usando Chrome como navegador.

lambda U,P:exec("from selenium.webdriver import*;import time;D=Chrome();I=lambda k:D.find_element_by_name(k);C='comment';D.get('http://www.codegolf.stackexchange.com/users/login');I('email').send_keys(U);Z=I('password');Z.send_keys(P);Z.submit();D.get('http://www.codegolf.stackexchange.com/questions/84546');D.find_element_by_link_text('add a '+C).click();E=I(C);E.send_keys('1234567890123456');time.sleep(1);E.submit()",locals())

Sin embargo, si hay, nuevamente, algún problema con respecto a ChromeDriver, este es el mismo tipo de solución pero esta vez usando Firefox, actualmente en 442 432 bytes :

lambda U,P:exec("from selenium.webdriver import*;import time;D=Firefox();I=lambda k:D.find_element_by_name(k);C='comment';D.get('http://www.codegolf.stackexchange.com/users/login');I('email').send_keys(U);Z=I('password');Z.send_keys(P);Z.submit();D.get('http://www.codegolf.stackexchange.com/questions/84546');D.find_element_by_link_text('add a '+C).click();E=I(C);E.send_keys('1234567890123456');time.sleep(1);E.submit()",locals())

Llame a estas funciones lambda simplemente cambiando el nombre de la función como algo válido y luego llamando con su correo electrónico y contraseña como una función normal. Por ejemplo, si se nombrara la función H, la llamaría así H(Email, Password).

R. Kap
fuente
Muchas gracias por presentarme a Selenium Webdriver.
Maltysen
@Maltysen No hay problema. :)
R. Kap
Chromees más corto que Firefox?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Bueno, antes no podía hacerlo funcionar con Webdriver. Sin embargo, finalmente lo he hecho, ¡y mi solución ahora es 11 bytes más corta! : D
R. Kap
2

Swift 2.2 en iOS, 380 bytes

let r = NSMutableURLRequest(URL:NSURL(string:"http://codegolf.stackexchange.com/posts/84546/comments")!)
r.HTTPMethod = "POST"
r.HTTPBody = try!NSJSONSerialization.dataWithJSONObject(["comment":"1234567890123456","fkey":UIWebView().stringByEvaluatingJavaScriptFromString("localstorage.getItem('se:fkey')")!],options:[])
NSURLSession.sharedSession().dataTaskWithRequest(r).resume()

Asume que el usuario ha iniciado sesión en Code Golf con Safari y tiene las cookies habilitadas. También se supone que UIKit está implícitamente importado y disponible. La serialización JSON es tan detallada en Cocoa ... Podría actualizar esto con una solución Swift 3 y, opcionalmente, respuestas comprobables de macOS / Linux.

JAL
fuente
66
stringByEvaluatingJavaScriptFromStringbrillante
gato
1
@cat se pone mejor .
JAL
2
Estoy enojado ahora. No pensé que fuera posible odiar a Obejctive-C más de lo que lo hice ...
gato
0

Java 8 con Selenium Webdriver, 684 bytes:

import java.util.*;import org.openqa.selenium.*;import org.openqa.selenium.firefox.*;class Leave_a_Comment_PPCG_Challenge_Golfed_Version_1{static void Y(String U,String P){WebDriver D=new FirefoxDriver();D.get("http://www.codegolf.stackexchange.com/users/login");D.findElement(By.name("email")).sendKeys(U);WebElement Z=D.findElement(By.name("password"));Z.sendKeys(P);Z.submit();D.get("http://www.codegolf.stackexchange.com/questions/84546");D.findElement(By.linkText("add a comment")).click();WebElement V=D.findElement(By.name("comment"));V.sendKeys("1234567890123456");D.findElement(By.xpath("//input[@value='Add Comment']")).click();}public static void main(String[]a){Scanner I=new Scanner(System.in);Y(I.next(),I.next());}}

Una adaptación directa en Java 8 de mi segunda respuesta completa del programa en Python . Funciona perfectamente en Firefox y solicita una entrada de correo electrónico y contraseña separadas por espacios inmediatamente cuando se inicia el programa. En otras palabras, la entrada está en el formato Email Passworddonde se necesita el espacio entre los dos.

R. Kap
fuente
El código que tenemos aquí es más de 684, jaja
empuje