Zostaw komentarz

16

Zadanie:

Stwórz program, który pozostawia komentarz do tego pytania. Treść powinna być 1234567890123456.

Edycje:

  1. Możesz pozostawić swoje nazwy użytkownika i hasła jako Ui Pjeśli używasz nazwy użytkownika i hasła. (jeśli dotyczy)

  2. Bez skracaczy adresów URL (jeśli dotyczy)

  3. Nie możesz używać konsoli przeglądarki.

Meinkraft
źródło
27
Proszę zamieścić zrzut ekranu skrzynki odbiorczej na końcu tego wyzwania ...
Martin Ender,
1
Do osób testujących swój kod: usuń swój komentarz (y) po ich przesłaniu, aby komentarze dotyczące tego wyzwania nie stały się niepotrzebnie długie i spamowały oraz aby ułatwić pracę modom.
Mego
1
Czy nikt inny nie uważa, że ​​jest to nieokreślone? Jak do diabła mam to zrobić? Czy pytania nie powinny być samodzielne? Gdzie jest link do dokumentów API?
kot
4
@cat Chociaż zgadzam się, że specyfikacje są raczej rzadkie, myślę, że dzieje się tak, ponieważ po prostu nie ma o czym mówić. Należy również pamiętać, że użycie interfejsu API wymiany stosu nie jest wymagane przez pytanie, więc włączenie dokumentów API do pytania byłoby raczej zbędne.
Alex A.,
3
Głosowanie na zakończenie jest niejasne, ponieważ patrząc na istniejące odpowiedzi i komentarze, wydaje mi się, że wymaga to a) wyraźnego wpisania na białą listę dozwolonych danych wejściowych (w odpowiedziach zwykłego czytania może nie brać żadnych danych wejściowych, ale niektóre z nich wydają się przyjmować dane uwierzytelniające szczegóły i pomijanie dorozumianego wymogu używania nazwy użytkownika i hasła do logowania); b) w celu wyjaśnienia, co należy rozumieć przez „ Możesz pozostawić swoje nazwy użytkownika i hasła odpowiednio jako U i P ” (co zinterpretowałbym jako nakazujące nam zakodowanie „U” i „P”, ale które inni wyraźnie interpretowali inaczej).
Peter Taylor,

Odpowiedzi:

11

JavaScript z jQuery, 127 bajtów

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

Podziękowania dla Ismaela Miguela i Nicica za kilka bajtów.

Ten fkeyparametr jest unikalny dla Twojego konta i można go znaleźć, sprawdzając zawartość pamięci lokalnej przeglądarki przy otwartej stronie StackExchange. Ten kod musi być uruchomiony w przeglądarce z otwartą sesją StackExchange. Automatycznie ładuje fkeyparametr z lokalnego magazynu przeglądarki (poprzednie wersje tego zgłoszenia wymagały ręcznego wprowadzenia).

Niestety ppcg.lolnie można użyć adresu URL, ponieważ nie przekazuje on żądań POST.

Ciekawostka: jeśli spróbujesz uruchomić ten kod bez odpowiedniej fkeywartości, otrzymasz odpowiedź HTTP 418 :

teapot

Przykład znajdowania fkeywartości w Chrome:

fkey

Najwyraźniej rzeczy Winterbash są nadal przechowywane. Schludny.

Dla porównania, ta sama rzecz w waniliowym Javascriptie miałaby 314 bajty (ponownie dzięki Ismael Miguel i nicael za wyłączenie niektórych bajtów):

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
źródło
Właśnie miałem to napisać. Dodaj fragment stosu.
NoOneIsHere
Podoba mi się sposób, w jaki korzystasz z prośby o dostęp do strony zamiast korzystania z selenu!
Meinkraft
1
@NoOneIsHere Urywek stosu nie jest możliwy, ponieważ działają one w trybie piaskownicy bez dostępu do plików cookie / danych sesji przeglądarki. Ponadto nie jestem pewien, czy fragmenty stosu w ogóle zezwalają na żądania POST.
Mego
3
@ IsmaelMiguel Downvoting za przypadkowe pominięcie wielkich liter na jednej literze w kodzie wydaje się nieco niedorzeczny, ale to twoja rozmowa. Teraz jest naprawione.
Mego
2
@ IsmaelMiguel Downvoting z powodu niewielkiej literówki jest.
Mego
14

AppleScript z Safari, 269 287 bajtów

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

Aby tego użyć, musisz włączyć Safari Developer Settings, a następnie włączyć Allow JavaScript from Apple Events. Nie jestem pewien, czy to oszustwo, czy nie używanie istniejącego pęku kluczy + ciasteczek, ale no cóż.

Udało mi się to również zrobić w Automatorze OSX, po prostu automatyzując kliknięcia i naciśnięcia klawiszy, ale nie sądziłem, że pozostało wierne idei wyzwania

Syreny
źródło
2
Witaj i witaj w PPCG! To jest świetne! To nie oszustwo. Musisz także włączyć JS dla wszystkich odpowiedzi JavaScript.
NoOneIsHere
Witamy w PPCG! Chociaż jest to z pewnością twórcza odpowiedź, nie jest samodzielna, ponieważ nie przyjmuje nazwy użytkownika i hasła jako danych wejściowych.
Patrick Roberts,
1
@Sirens Dzięki za odpowiedź. Właśnie edytowałem pytanie, więc nie możesz używać skracaczy URL?
Meinkraft,
1
Wygląda na to, że nie działa ... To znaczy, klika link flagi, a nie link komentowania.
nicael
1
OP zmodyfikował wyzwanie, aby nie zezwalać na skracacze adresów URL, co unieważnia tę odpowiedź do momentu zamiany ppcg.lol na codegolf.stackexchange.com.
Alex A.
7

Python 3.5 z Selenium Webdriver, 485 427 469 461 449 414 403 bajtów:

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

Pełny program wykorzystujący proste rozwiązanie selenium dla sterowników sieci Web Pythona. Działa w Chrome, chociaż do działania wymaga zainstalowanego ChromeDriver . Działa poprzez zmianę nazwy Ui Podpowiednio na adres e-mail użytkownika i hasło Stack Exchange. Jeśli jednak występują problemy z zainstalowaniem ChromeDriver, oto rozwiązanie FireFox, które jest uruchamiane dokładnie w taki sam sposób jak powyższe rozwiązanie i nie wymaga żadnych sterowników, chociaż obecnie jest 1 bajt dłużej przy 414 404 bajtach :

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

Ponadto, jeśli potrzebna jest funkcja, oto rozwiązanie wykorzystujące anonimową funkcję lambda, która obecnie ma 513 455 497 489 477 449 431 bajtów i używa Chrome jako przeglądarki.

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

Jeśli jednak pojawią się jakiekolwiek problemy dotyczące ChromeDriver, oto ten sam typ rozwiązania, ale tym razem przy użyciu przeglądarki Firefox, która obecnie ma 442 432 bajty :

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

Wywołujesz te funkcje lambda, po prostu zmieniając nazwę funkcji na dowolną ważną, a następnie wywołując swój adres e-mail i hasło jak normalną funkcję. Na przykład, gdyby funkcja została nazwana H, wywołałbyś ją tak H(Email, Password).

R. Kap
źródło
Dziękuję bardzo za zapoznanie się z Selenium Webdriver.
Maltysen
@Maltysen Nie ma problemu. :)
R. Kap
Chromejest krótszy niż Firefox?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Cóż, wcześniej nie mogłem go uruchomić z Webdriver. W końcu mam, a moje rozwiązanie jest teraz 11 bajtów krótsze! : D
R.Kap
2

Swift 2.2 na iOS, 380 bajtów

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

Zakłada, że ​​użytkownik jest zalogowany w Code Golf za pomocą Safari i ma włączoną obsługę plików cookie. Zakłada również, że UIKit jest domyślnie importowany i dostępny. Serializacja JSON jest tak złożona w Cocoa ... Może to zaktualizować dzięki rozwiązaniu Swift 3 i opcjonalnie odpowiedziom testowanym w systemie macOS / Linux.

JAL
źródło
6
stringByEvaluatingJavaScriptFromStringgenialny
kot
1
@ kot robi się lepiej .
JAL
2
Jestem teraz zły. Nie sądziłem, że można nienawidzić Obejctive-C bardziej niż ja ...
kot
0

Java 8 z Selenium Webdriver, 684 bajty:

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

Bezpośrednia adaptacja w Javie 8 mojej drugiej pełnej odpowiedzi programu w Pythonie . Działa doskonale w Firefoksie i prosi o podanie oddzielonego spacjami adresu e-mail i hasła natychmiast po uruchomieniu programu. Innymi słowy, dane wejściowe są w formacie, w Email Passwordktórym potrzebna jest przestrzeń między nimi.

R. Kap
źródło
Kod, który tu masz, jest dłuższy niż 684, haha
Poke