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.


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

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


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


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.


6
stringByEvaluatingJavaScriptFromStringgenialny
kot

1
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.


Kod, który tu masz, jest dłuższy niż 684, haha
Poke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.