Laissez un commentaire

16

Tâche:

Faites un programme qui laisse un commentaire sur cette question. Le contenu devrait être 1234567890123456.

Modifications:

  1. Vous pouvez laisser vos noms d'utilisateur et mots de passe au fur Uet à mesure Pque vous utilisez un nom d'utilisateur et un mot de passe. (le cas échéant)

  2. Pas de raccourcisseurs d'URL (le cas échéant)

  3. Vous ne pouvez pas utiliser la console du navigateur.

Meinkraft
la source
27
Veuillez poster une capture d'écran de votre boîte de réception à la fin de ce défi ...
Martin Ender
1
Aux personnes qui testent leur code: veuillez supprimer vos commentaires après les avoir soumis, pour éviter que les commentaires sur ce défi ne deviennent inutilement longs et spammés, et pour faciliter le travail des mods.
Mego
1
Personne d'autre ne pense que cela est sous-spécifié? Genre, comment diable dois-je faire ça? Les questions ne sont-elles pas censées être autonomes? Où est le lien vers les documents de l'API?
chat
4
@cat Bien que je convienne que les spécifications sont plutôt clairsemées, je pense que c'est parce qu'il n'y a tout simplement pas un tout à dire. Notez également que l'utilisation de l'API Stack Exchange n'est pas requise par la question, donc inclure des documents API dans la question serait plutôt superflu.
Alex A.
3
Voter pour clôturer n'est pas clair car en regardant les réponses et commentaires existants, il me semble que cela nécessite a) de lister explicitement les entrées autorisées (sur une lecture simple, les réponses peuvent ne prendre aucune entrée, mais certaines semblent prendre l'auth les détails et en contournant l'exigence implicite d'utiliser un nom d'utilisateur et un mot de passe pour se connecter); b) pour clarifier ce que l'on entend par " Vous pouvez laisser vos noms d'utilisateur et mots de passe respectivement U et P " (ce que j'interpréterais comme nous disant de coder en dur "U" et "P", mais que d'autres ont clairement interprété différemment).
Peter Taylor

Réponses:

11

Javascript avec jQuery, 127 octets

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

Merci à Ismael Miguel et nicael pour quelques octets.

Le fkeyparamètre est unique à votre compte et peut être trouvé en examinant le contenu de stockage local de votre navigateur avec une page StackExchange ouverte. Ce code doit être exécuté dans un navigateur avec une session StackExchange ouverte présente. Il charge automatiquement le fkeyparamètre à partir de la mémoire locale du navigateur (les versions précédentes de cette soumission exigeaient qu'il soit entré manuellement).

Malheureusement, l' ppcg.lolURL ne peut pas être utilisée, car elle ne transmet pas les demandes POST.

Fait amusant: si vous essayez d'exécuter ce code sans la fkeyvaleur appropriée , vous obtenez une réponse HTTP 418 :

teapot

Exemple de recherche de la fkeyvaleur dans Chrome:

fkey

Apparemment, les trucs de Winterbash sont toujours stockés. Soigné.

Pour référence, la même chose en vanilla Javascript serait de 314 octets (merci encore à Ismael Miguel et nicael pour quelques octets éteints):

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
la source
J'étais sur le point d'écrire ceci. Veuillez ajouter un extrait de pile.
NoOneIsHere
J'aime la façon dont vous utilisez la demande pour accéder au site au lieu d'utiliser du sélénium!
Meinkraft
1
@NoOneIsHere Un extrait de pile n'est pas possible, car ils s'exécutent en bac à sable, sans accès aux cookies / données de session du navigateur. De plus, je ne suis pas certain que les extraits de pile autorisent même les requêtes POST.
Mego
3
@IsmaelMiguel Downvoting pour avoir accidentellement manqué la capitalisation d'une lettre dans le code semble un peu ridicule, mais c'est votre appel. C'est réparé maintenant.
Mego
2
@IsmaelMiguel Downvoting en raison d'une légère faute de frappe.
Mego
14

AppleScript avec Safari, 269 287 octets

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

Pour l'utiliser, vous devez activer les paramètres du développeur Safari, puis l'activer Allow JavaScript from Apple Events. Je ne suis pas sûr que ce soit de la triche ou de ne pas utiliser le trousseau + cookies existants, mais bon.

J'ai également réussi à le faire dans Automator d'OSX en automatisant simplement les clics et les frappes mais je ne pensais pas que cela restait fidèle à l'idée du défi

Sirènes
la source
2
Bonjour et bienvenue chez PPCG! C'est bien! Ce n'est pas de la triche. Vous devez également activer JS pour toutes les réponses JavaScript.
NoOneIsHere
Bienvenue chez PPCG! Bien que ce soit certainement une réponse créative, elle n'est pas autonome, car elle ne prend pas le nom d'utilisateur et le mot de passe en entrée.
Patrick Roberts
1
@Sirens Merci pour la réponse. Je viens de modifier la question, vous ne pouvez donc pas utiliser de raccourcisseurs d'URL?
Meinkraft
1
Cela ne semble pas fonctionner ... Je veux dire, il clique sur le lien indicateur, pas sur le lien de commentaire.
nicael
1
L'OP a modifié le défi pour interdire les raccourcisseurs d'URL, ce qui invalide cette réponse jusqu'à ce que vous échangiez ppcg.lol pour codegolf.stackexchange.com.
Alex A.
7

Python 3.5 avec Selenium Webdriver, 485 427 469 461 449 414 403 octets:

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 programme complet utilisant une simple solution de pilote Web Python selenium. Fonctionne dans Chrome, même si ChromeDriver doit être installé pour fonctionner. Fonctionne en renommant Uet Pen utilisant le courrier électronique et le mot de passe Stack Exchange de l'utilisateur, respectivement. Cependant, s'il y a des problèmes pour installer ChromeDriver, voici une solution FireFox qui est exécutée exactement de la même manière que la solution ci-dessus et n'a pas besoin de pilotes, bien qu'elle soit actuellement 1 octet de plus à 414404 octets :

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

De plus, si une fonction est souhaitée, voici une solution utilisant une fonction lambda anonyme, actuellement de 513 455 497 489 477 449 431 octets et utilisant Chrome comme navigateur.

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

Cependant, s'il y a, encore une fois, des problèmes concernant ChromeDriver, voici le même type de solution mais cette fois en utilisant Firefox, actuellement à 442 432 octets :

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

Vous appelez ces fonctions lambda en renommant simplement la fonction comme quelque chose de valide, puis en appelant avec votre e-mail et votre mot de passe comme une fonction normale. Par exemple, si la fonction était nommée H, vous l'appelleriez comme H(Email, Password).

R. Kap
la source
Merci beaucoup de m'avoir présenté Selenium Webdriver.
Maltysen
@Maltysen Aucun problème. :)
R. Kap
Chromeest plus court que Firefox?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Eh bien, je ne pouvais pas le faire fonctionner avec Webdriver auparavant. J'ai enfin réussi, et ma solution est maintenant 11 octets plus courte! : D
R. Kap
2

Swift 2.2 sur iOS, 380 octets

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

Suppose que l'utilisateur est connecté à Code Golf avec Safari et que les cookies sont activés. Suppose également qu'UIKit est implicitement importé et disponible. La sérialisation JSON est tellement verbeuse dans Cocoa ... Pourrait la mettre à jour avec une solution Swift 3 et éventuellement des réponses testables macOS / Linux.

JAL
la source
6
stringByEvaluatingJavaScriptFromStringbrilliant
cat
1
@cat ça va mieux .
JAL
2
Je suis en colère maintenant. Je ne pensais pas qu'il était possible de détester Obejctive-C plus que moi ...
cat
0

Java 8 avec Selenium Webdriver, 684 octets:

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

Une adaptation directe en Java 8 de ma deuxième réponse complète du programme en Python . Fonctionne parfaitement dans Firefox et demande une entrée de courrier électronique et de mot de passe séparés par un espace immédiatement au démarrage du programme. En d'autres termes, l'entrée est dans le format Email Passwordoù l'espace entre les deux est nécessaire.

R. Kap
la source
Le code que vous avez ici est plus long que 684, haha
Poke