Tinggalkan komentar

16

Tugas:

Buat program yang meninggalkan komentar pada pertanyaan ini. Konten seharusnya1234567890123456 .

Suntingan:

  1. Anda dapat meninggalkan nama pengguna dan kata sandi Anda seperti Udan Pjika Anda menggunakan nama pengguna dan kata sandi. (jika ada)

  2. Tidak ada Penyingkat URL (jika ada)

  3. Anda tidak boleh menggunakan konsol browser.

Meinkraft
sumber
27
Silakan kirim tangkapan layar kotak masuk Anda di akhir tantangan ini ...
Martin Ender
1
Bagi orang-orang yang menguji kode mereka: harap hapus komentar Anda setelah Anda mengirimkannya, untuk menjaga agar komentar tentang tantangan ini tidak terlalu panjang dan bersifat spam, dan untuk membuat pekerjaan mod lebih mudah.
Mego
1
Apakah tidak ada orang lain yang berpikir ini tidak ditentukan? Seperti, bagaimana saya melakukan itu? Bukankah pertanyaan dimaksudkan untuk mandiri? Di mana tautan ke dokumen API?
kucing
4
@ kucing Sementara saya setuju bahwa spesifikasinya agak jarang, saya pikir itu karena tidak ada keseluruhan yang perlu dikatakan. Perhatikan juga bahwa menggunakan Stack Exchange API tidak diperlukan oleh pertanyaan, jadi termasuk dokumen API dalam pertanyaan akan agak berlebihan.
Alex A.
3
Memilih untuk menutup sebagai tidak jelas karena melihat jawaban dan komentar yang ada, bagi saya tampaknya perlu a) untuk secara eksplisit daftar putih input yang diizinkan (pada jawaban bacaan sederhana mungkin tidak mengambil input, tetapi beberapa dari mereka tampaknya mengambil auth rincian dan melewati persyaratan tersirat untuk menggunakan nama pengguna dan kata sandi untuk masuk); b) untuk mengklarifikasi apa yang dimaksud dengan " Anda dapat meninggalkan nama pengguna dan kata sandi Anda masing-masing sebagai U dan P " (yang akan saya tafsirkan sebagai memberi tahu kami ke hardcode "U" dan "P", tetapi yang orang lain telah dengan jelas mengartikannya secara berbeda).
Peter Taylor,

Jawaban:

11

Javascript dengan jQuery, 127 byte

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

Terima kasih kepada Ismael Miguel dan nicael untuk beberapa byte.

The fkeyparameter unik untuk akun Anda, dan dapat ditemukan dengan memeriksa isi penyimpanan lokal dari browser Anda dengan halaman terbuka StackExchange. Kode ini harus dijalankan di browser dengan hadir sesi StackExchange terbuka. Secara otomatis memuat fkeyparameter dari penyimpanan lokal browser (versi sebelumnya dari pengiriman ini mengharuskannya untuk dimasukkan secara manual).

Sayangnya, ppcg.lolURL tidak dapat digunakan, karena tidak melewati permintaan POST.

Fakta menyenangkan: jika Anda mencoba menjalankan kode ini tanpa nilai yang tepat fkey, Anda mendapatkan respons HTTP 418 :

teko

Contoh cara menemukan fkeynilai di Chrome:

kawan

Rupanya barang-barang Winterbash masih disimpan. Rapi.

Untuk referensi, hal yang sama dalam vanilla Javascript akan menjadi 314 byte (terima kasih lagi kepada Ismael Miguel dan nicael untuk beberapa byte mati):

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
sumber
Saya baru saja akan menulis ini. Silakan tambahkan Cuplikan Stack.
NoOneIsHere
Saya suka bagaimana Anda menggunakan permintaan untuk mengakses situs daripada menggunakan selenium!
Meinkraft
1
@NoOneIsHere A Stack Snippet tidak dimungkinkan, karena mereka menjalankan kotak pasir, tanpa akses ke data cookie / sesi browser. Selain itu, saya tidak yakin apakah Cuplikan Stack bahkan mengizinkan permintaan POST sama sekali.
Mego
3
@IsmaelMiguel Downvoting karena secara tidak sengaja melewatkan huruf besar pada satu huruf dalam kode tampaknya agak konyol, tapi itu panggilan Anda. Sudah diperbaiki sekarang.
Mego
2
@IsmaelMiguel Downvoting karena kesalahan ketik sedikit.
Mego
14

AppleScript dengan 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

Untuk menggunakan ini, Anda perlu mengaktifkan Pengaturan Pengembang Safari dan kemudian mengaktifkan Allow JavaScript from Apple Events. Saya tidak yakin apakah itu curang atau tidak menggunakan gantungan kunci + cookie yang ada tapi oh well.

Saya juga berhasil melakukan ini di Automator OSX dengan hanya mengotomatiskan klik dan penekanan tombol tetapi saya tidak berpikir itu tetap setia pada gagasan tantangan

Sirene
sumber
2
Halo, dan selamat datang di PPCG! Ini bagus! Itu tidak curang. Anda juga harus mengaktifkan JS untuk semua jawaban JavaScript.
NoOneIsHere
Selamat datang di PPCG! Walaupun ini merupakan jawaban yang kreatif, ini tidak mandiri, karena tidak menggunakan nama pengguna dan kata sandi sebagai input.
Patrick Roberts
1
@ Sirens Terima kasih atas jawabannya. Saya baru saja mengedit pertanyaan sehingga Anda tidak dapat menggunakan Penyingkat URL?
Meinkraft
1
Tampaknya tidak berfungsi ... Maksudku, itu mengklik tautan bendera, bukan tautan komentar.
nicael
1
OP memodifikasi tantangan untuk melarang penyingkat URL, yang membatalkan jawaban ini sampai Anda menukar ppcg.lol dengan codegolf.stackexchange.com.
Alex A.
7

Python 3.5 dengan 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()

Program lengkap yang memanfaatkan solusi driver web selenium Python sederhana. Bekerja di Chrome, meskipun ChromeDriver perlu diinstal agar berfungsi. Bekerja dengan mengganti nama Udan Pmasing-masing untuk email dan kata sandi Stack Exchange pengguna. Namun, jika ada masalah menginstal ChromeDriver, berikut ini adalah solusi FireFox yang dijalankan dengan cara yang sama persis dengan solusi di atas dan tidak memerlukan driver apa pun, meskipun saat ini 1 byte lebih panjang pada 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()

Juga, jika suatu fungsi diinginkan, berikut adalah solusi menggunakan fungsi lambda anonim, saat ini berdiri di 513 455 497 489 477 449 431 byte dan menggunakan Chrome sebagai 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())

Namun, jika ada, sekali lagi, masalah apa pun tentang ChromeDriver, berikut adalah jenis solusi yang sama tetapi kali ini menggunakan Firefox, saat ini berada pada 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())

Anda memanggil fungsi-fungsi lambda ini dengan hanya mengubah nama fungsi tersebut sebagai sesuatu yang valid dan kemudian memanggil dengan email dan kata sandi Anda seperti fungsi normal. Misalnya, jika fungsi itu dinamai H, Anda akan menyebutnya seperti H(Email, Password).

R. Kap
sumber
Terima kasih banyak telah memperkenalkan saya ke Selenium Webdriver.
Maltysen
@Maltysen Tidak masalah. :)
R. Kap
Chromelebih pendek dari Firefox?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Yah, saya tidak bisa membuatnya bekerja dengan Webdriver sebelumnya. Saya akhirnya memiliki, dan solusi saya sekarang lebih pendek 11 byte! : D
R. Kap
2

Swift 2.2 di 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()

Mengasumsikan pengguna masuk ke Code Golf dengan Safari dan mengaktifkan cookie. Juga berasumsi bahwa UIKit secara implisit diimpor dan tersedia. Serialisasi JSON sangat verbose dalam Cocoa ... Mungkin perbarui ini dengan solusi Swift 3 dan secara opsional jawaban yang dapat diuji macOS / Linux.

JAL
sumber
6
stringByEvaluatingJavaScriptFromStringbrilian
kucing
1
@cat jadi lebih baik .
JAL
2
Saya marah sekarang. Saya tidak berpikir itu mungkin untuk membenci Obejctive-C lebih dari yang saya lakukan ...
kucing
0

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

Adaptasi langsung di Java 8 jawaban program penuh kedua saya di Python . Berfungsi sempurna di Firefox dan meminta input email dan kata sandi yang dipisahkan ruang segera ketika program dimulai. Dengan kata lain, input berada dalam format di Email Passwordmana ruang di antara keduanya diperlukan.

R. Kap
sumber
Kode yang Anda miliki di sini lebih dari 684, haha
Poke