Lascia un commento


16

Compito:

Crea un programma che lasci un commento su questa domanda. Il contenuto dovrebbe essere 1234567890123456.

modifiche:

  1. È possibile lasciare i nomi utente e le password come Ue Pse si utilizzano nome utente e password. (se applicabile)

  2. Nessun accorciatore di URL (se applicabile)

  3. Non è possibile utilizzare la console del browser.


27
Pubblica uno screenshot della tua casella di posta alla fine di questa sfida ...
Martin Ender,

1
Alle persone che testano il loro codice: cancella i tuoi commenti dopo averli inviati, per evitare che i commenti su questa sfida diventino inutilmente lunghi e spam, e per semplificare il lavoro delle mod.
Mego

1
Nessun altro pensa che questo sia sottostimato? Come, come diavolo lo faccio? Le domande non sono pensate per essere autosufficienti? Dov'è il link ai documenti API?
cat

4
@cat Mentre sono d'accordo sul fatto che le specifiche sono piuttosto scarse, penso che sia perché non c'è un intero che debba essere detto. Si noti inoltre che l'utilizzo dell'API Stack Exchange non è richiesto dalla domanda, quindi includere i documenti API nella domanda sarebbe piuttosto superfluo.
Alex A.

3
La votazione per chiudere come poco chiara perché guardando le risposte e i commenti esistenti mi sembra che ciò abbia bisogno di a) per elencare esplicitamente nella lista bianca gli input consentiti (su una semplice lettura le risposte potrebbero non avere input, ma alcuni sembrano prendere l'autenticazione dettagli e bypassare il requisito implicito di utilizzare username e password per accedere); b) chiarire cosa si intende per " Puoi lasciare i tuoi nomi utente e password come U e P, rispettivamente " (che interpreterei come dicendoci di scrivere "U" e "P", ma che altri hanno interpretato chiaramente in modo diverso).
Peter Taylor,

Risposte:


11

Javascript con jQuery, 127 byte

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

Grazie a Ismael Miguel e Nicea per alcuni byte.

Il fkeyparametro è univoco per il tuo account e può essere trovato esaminando i contenuti di archiviazione locale del browser con una pagina StackExchange aperta. Questo codice deve essere eseguito in un browser con una sessione StackExchange aperta presente. Carica automaticamente il fkeyparametro dalla memoria locale del browser (le versioni precedenti di questo invio richiedevano che fosse inserito manualmente).

Sfortunatamente, l' ppcg.lolURL non può essere utilizzato, perché non passa le richieste POST.

Curiosità: se si tenta di eseguire questo codice senza il fkeyvalore corretto , si ottiene una risposta HTTP 418 :

teiera

Esempio di come trovare il fkeyvalore in Chrome:

Fkey

Apparentemente roba Winterbash è ancora in fase di conservazione. Neat.

Per riferimento, la stessa cosa in Javascript vaniglia sarebbe 314 byte (grazie ancora a Ismael Miguel e Nicea per alcuni byte di sconto):

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}))}

Stavo per scrivere questo. Aggiungi uno snippet di stack.
NoOneIsHere il

Mi piace come usi la richiesta per accedere al sito invece di usare il selenio!
Meinkraft,

1
@NoOneIsHere Uno snippet di stack non è possibile perché vengono eseguiti in modalità sandbox, senza accesso ai dati del cookie / della sessione del browser. Inoltre, non sono sicuro che Stack Snippet consenta nemmeno le richieste POST.
Mego,

3
@IsmaelMiguel Il downvoting per la perdita accidentale di lettere maiuscole su una lettera nel codice sembra un po 'ridicolo, ma questa è la tua chiamata. Ora è riparato.
Mego

2
@IsmaelMiguel Downvoting a causa di un leggero errore di battitura è.
Mego

14

AppleScript con Safari, 269 287 byte

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

Per utilizzare questo è necessario abilitare Impostazioni sviluppatore Safari e quindi abilitare Allow JavaScript from Apple Events. Non sono sicuro se è barare o non usare il portachiavi + cookie esistente, ma vabbè.

Sono anche riuscito a farlo in Automator di OSX semplicemente automatizzando i clic e le sequenze di tasti, ma non pensavo che rimanesse fedele all'idea della sfida


2
Ciao e benvenuto in PPCG! Questo è fantastico! Non è un imbroglio. È inoltre necessario abilitare JS per tutte le risposte JavaScript.
NoOneIsHere

Benvenuti in PPCG! Sebbene questa sia certamente una risposta creativa, non è autonoma, in quanto non utilizza nome utente e password come input.
Patrick Roberts,

1
@Sirens Grazie per la risposta. Ho appena modificato la domanda in modo da non poter utilizzare gli accorciatori di URL?
Meinkraft,

1
Non sembra funzionare ... Voglio dire, fa clic sul collegamento della bandiera, non sul collegamento dei commenti.
nicael,

1
L'OP ha modificato la sfida per impedire gli accorciatori di URL, che invalida questa risposta fino a quando non si scambia ppcg.lol con codegolf.stackexchange.com.
Alex A.

7

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

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 programma completo che utilizza una semplice soluzione di driver web selenio Python. Funziona in Chrome, anche se ha bisogno di ChromeDriver installato per funzionare. Funziona rinominando Ue Pper e-mail e password Stack Exchange dell'utente, rispettivamente. Tuttavia, se si verificano problemi durante l'installazione di ChromeDriver, ecco una soluzione FireFox che viene eseguita esattamente allo stesso modo della soluzione precedente e non necessita di driver, sebbene al momento sia 1 byte più lungo a 414 404 byte :

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()

Inoltre, se si desidera una funzione, ecco una soluzione che utilizza una funzione lambda anonima, attualmente in piedi a 513 455 497 489 477 449 431 byte e utilizzando Chrome come browser.

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())

Tuttavia, se ci sono, ancora una volta, problemi relativi a ChromeDriver, ecco lo stesso tipo di soluzione, ma questa volta usando Firefox, attualmente in piedi a 442 432 byte :

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())

Chiamate queste funzioni lambda semplicemente rinominando la funzione come qualcosa di valido e quindi chiamando con la vostra e-mail e password come una normale funzione. Ad esempio, se la funzione fosse denominata H, la chiameresti come H(Email, Password).


Grazie mille per avermi fatto conoscere Selenium Webdriver.
Maltysen,

@Maltysen Nessun problema. :)
R. Kap

Chromeè più corto di Firefox?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Beh, non sono riuscito a farlo funzionare con Webdriver prima. Alla fine ce l'ho, e ora la mia soluzione è più corta di 11 byte! : D
R. Kap

2

Swift 2.2 su iOS, 380 byte

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()

Suppone che l'utente abbia effettuato l'accesso a Code Golf con Safari e abbia i cookie abilitati. Presuppone inoltre che UIKit sia importato e disponibile implicitamente. La serializzazione JSON è così dettagliata in Cocoa ... Potrebbe aggiornarlo con una soluzione Swift 3 e facoltativamente risposte testabili macOS / Linux.


6
stringByEvaluatingJavaScriptFromStringbrillante
gatto

1
@cat si migliora .
JAL

2
Sono arrabbiato adesso. Non pensavo fosse possibile odiare Obejctive-C più di quanto facessi io ...
cat

0

Java 8 con Selenium Webdriver, 684 byte:

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());}}

Un adattamento diretto in Java 8 della mia seconda risposta completa al programma in Python . Funziona perfettamente in Firefox e richiede l'immissione di e-mail e password separate da spazio immediatamente all'avvio del programma. In altre parole, l'input è nel formato in Email Passwordcui è necessario lo spazio tra i due.


Il codice che hai qui è più lungo del 684, ahah
Poke
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.