Non riesco a pubblicare un Post su Facebook con JavaScript

di il
9 risposte

Non riesco a pubblicare un Post su Facebook con JavaScript

Ciao a tutti,
ho fatto un applicazione che scrive Post nei gruppi Facebook, funziona tutto, solo che con il metodo ed il linguaggio che ho usato non posso inserire "Emoji", per ovviare utilizzo JavaScript.

Il tag dove si crea il nuovo post è uno <span></span>

Il suo XPath è: //div[@class='rq0escxv datstx6m k4urcfbm a8c37x1j']/div/div/div/div/div/div/span

per potere scrivere all'interno dello span utilizzo: arguments[0].textContent=' Ciao! '

Mi scrive lo "Ciao!" ma non si abilita il pulsante "Pubblica" e se provo ad aggiungere con la tastiera anche un solo carattere per fare si che si abiliti il pulsante, mi pubblica solo quel carattere, lo "Ciao!" sembra non esistere, eppure ho Ispezionato il codice html con lo "Ciao!" e lo vedo scritto nella giusta posizione.

Non capisco perche non lo vede e perché non si abilita il Pulsante

9 Risposte

  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Bentornato race

    E' probabile che Facebook utilizzi qualche framework frontend che, per via del suo funzionamento, non riconosce il testo che è stato inserito da codice.
    Per esempio, so che Facebook usa React in diversi posti (dopotutto l'hanno inventato loro). Se quella sezione fosse gestita da React, allora il problema diventa evidente: il testo del post viene registrato nello "stato" del componente. Per farlo, il codice si mette in ascolto di un evento sullo span (o dove è più comodo per loro). Dato che inserisci il testo direttamente da codice, nessun evento viene generato e lo stato del componente non viene aggiornato. Questo spiegherebbe perché quando poi hai inserito del testo manualmente il post conteneva solo quella parte di testo.

    Quella sopra è solo una supposizione, ma diversi framework funzionano in questo modo, quindi è probabile che il problema sia quello.

    Per risolvere il problema potresti valutare alcune cose:
    - Tu hai detto di avere già del codice che crea post, ma che non riesci ad inserire le emoji. Hai provato a controllare se inserendo direttamente il carattere unicode in qualche modo sei in grado di inserirle?
    - L'API di facebook potrebbe consentirti di creare post da javascript, e penso accetti le emoji senza problemi (questa pagina sembra fare al caso tuo). Comunque, potresti aver già provato questa soluzione
    - Se il codice javascript gira su Node, potresti provare ad usare puppeteer, che ti permette di aprire un browser (chromium) senza interfaccia grafica e ti consente di fare in questo browser qualsiasi cosa tu sia in grado di fare manualmente.

    Buona fortuna col tuo progetto
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    andreadev ha scritto:


    Quella sopra è solo una supposizione, ma diversi framework funzionano in questo modo, quindi è probabile che il problema sia quello.
    Sto usando C# + Selenium + ChromeDriver, se non utilizzo JavaScript per inviare le emoji tutto funziona benissimo.
    Nel caso utilizzassi C# + Selenium + FirefoxDriver, potrei postare pure le emoji ma non mi riconosce più lo <span> come elemento per interagire, non so per quale motivo, eppure è tutto identico...

    andreadev ha scritto:


    Per risolvere il problema potresti valutare alcune cose:
    - Tu hai detto di avere già del codice che crea post, ma che non riesci ad inserire le emoji. Hai provato a controllare se inserendo direttamente il carattere unicode in qualche modo sei in grado di inserirle?
    Fatto, non funziona, non lo accetta.

    andreadev ha scritto:


    - L'API di facebook potrebbe consentirti di creare post da javascript, e penso accetti le emoji senza problemi
    Sarei costretto a creare una App su Fascebook Developer ed installarla nei gruppi che voglio gestire, io lo posso fare ma poi non posso distribuire questo programmino.

    andreadev ha scritto:


    - Se il codice javascript gira su Node, potresti provare ad usare puppeteer, che ti permette di aprire un browser (chromium) senza interfaccia grafica e ti consente di fare in questo browser qualsiasi cosa tu sia in grado di fare manualmente.
    Lo faccio già con C# e Selenium, mi sa che poi ritorniamo al problema solito di partenza.
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Ok, adesso è un po' più chiara la situazione...

    Ho fatto delle ricerche al riguardo e sì, sembra che con selenium sul Chrome Driver ci sia questo bug.
    Anche sul progetto di puppeteer si trova una issue simile, ma sembrerebbe che sia stata risolta (link).

    Un'altra soluzione potrebbe essere questa:
    Utilizzando javascript, creare nella pagina un input che include il messaggio che vuoi inserire nello span. Poi, sempre con javascript, seleziona il contenuto. Infine, con selenium fai un "copia/incolla" nello span.

    Per creare e selezionare l'input:
    
    let input = document.createElement("input");
    input.value = "Messaggio con emoji ??";
    document.body.appendChild(input);
    input.select();
    
    Dopo aver ignettato questo codice nella pagina, aspetti un attimo e poi esegui la combinazione CTRL+C (tramite selenium).
    Dopodiché, selezioni lo span con selenium e fai la combinazione CTRL+V.

    In teoria questo potrebbe aggirare il bug attualmente presente in selenium.
    Non sono sicuro che funzioni, ma penso valga la pena di provare
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    andreadev ha scritto:


    Un'altra soluzione potrebbe essere questa:
    Utilizzando javascript, creare nella pagina un input che include il messaggio che vuoi inserire nello span. Poi, sempre con javascript, seleziona il contenuto. Infine, con selenium fai un "copia/incolla" nello span.

    Per creare e selezionare l'input:
    
    let input = document.createElement("input");
    input.value = "Messaggio con emoji ??";
    document.body.appendChild(input);
    input.select();
    
    Dopo aver ignettato questo codice nella pagina, aspetti un attimo e poi esegui la combinazione CTRL+C (tramite selenium).
    Dopodiché, selezioni lo span con selenium e fai la combinazione CTRL+V.
    Ti ringrazio per l'esempio, ma non riesco a ignettare il codice nello span, non so come fare.
    driver.FindElement(By.XPath("/html/body/div[1]/div/div[1]/div[1]/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div/div/div/div/span")).SendKeys(" ...qui quello che devo ignettare...  ");
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Non è necessario inserirlo direttamente nello span, basta eseguirlo nel contesto della pagina.
    Cercando su stackoverflow ho trovato questa risposta che propone il seguente codice:
    
    IWebDriver driver; // assume assigned elsewhere
    ...
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    js.ExecuteScript("let input = document.createElement('input'); ..."); // Il codice javascript va qui 
    
    Dopo aver lanciato queste righe di codice, puoi fare il copia incolla come mostrato in di stackoverflow.

    P.S. so che esistono due versioni di Selenium. Questa cosa mi risulta sia possibile in entrambe, ma non so quale è stata usata in questo codice o nel tuo
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Ho fatto un test ma Selenium non vede il campo creato.

    Creo il campo:
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    string result = (string)js.ExecuteScript(
                                                            "let input=document.createElement('input');" +
                                                            "input.id='my_input_id'; " +
                                                            "input.class='my_input_class'; " +
                                                            "input.value='Messaggio con emoji ??'; " +
                                                            "document.body.appendChild(input);" +
                                                            "input.select();"
                                                            );
    Faccio un test per vedere se esiste e se ha il valore dovuto:
    IJavaScriptExecutor js2 = (IJavaScriptExecutor)driver;
    string result2 = (string)js2.ExecuteScript("return document.getElementById('my_input_id').value");
    Tutto ok, il cmpo è creato e il valore è corretto.

    Solo che con Selenium non riesco a contattarlo, dice che non esiste:
    string s = driver.FindElement(By.XPath("//input[@class='my_input_class']")).Text;
    La stringa "s" è vuota e mi fa questo errore:
    OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: {"method":"xpath","selector":"//input[@class='my_input_class']"}
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Probabilmente il problema è che la classe non viene assegnata.
    Per aggiungere una classe ad un elemento in javascript devi usare questa sintassi:
    
    input.className = "nome-classe";
    // oppure
    input.classList.add("nome-classe");
    
    Dato che all'elemento non veniva assegnata nessuna classe il percorso risulta invalido.
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    andreadev ha scritto:


    Dato che all'elemento non veniva assegnata nessuna classe il percorso risulta invalido.
    Ho provato sia con la "classe" e sia con "id"

    Questo è l'esempio con "id":
    
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    string result = (string)js.ExecuteScript(
                                                            "let input=document.createElement('input');" +
                                                            "input.id='my_input_id'; " +
                                                            "input.value='Messaggio con emoji ??'; " +
                                                            "document.body.appendChild(input);" +
                                                            "input.select();"
                                                            );
    
    Con questo JavaScript verifico l'esistenza del nuovo campo "input", estraendo il suo valore, ed è corretto!!
    
    IJavaScriptExecutor js2 = (IJavaScriptExecutor)driver;
    string result2 = (string)js2.ExecuteScript("return document.getElementById('my_input_id').value");
    
    Con questo codice C# + Selenium, faccio la solita identica azione che fa il secondo JavaScript, cioè: verifico l'esistenza del campo estraendo il valore, ma non trova il campo.
    
    string s = driver.FindElement(By.XPath("//input[@id='my_input_id']")).Text;
    string ss = driver.FindElement(By.Id("my_input_id")).Text;
    
    Ba!! Non so più cosa cercare per capire il perchè non vede il campo....
  • Re: Non riesco a pubblicare un Post su Facebook con JavaScript

    Ciao race,
    Ora che ci penso in teoria non hai necessità di prendere quell'elemento. Il suo contenuto è già selezionato, quindi ti basta inviare il codice CTRL+C per copiarlo (puoi utilizzare il metodo sendKeys dalle actions di selenium piuttosto che dall'elemento direttamente). Dopo devi selezionare lo span nel quale lo dovrai incollare e lì premere CTRL+V.

    In alternativa, potresti persino provare a fare questo:
    
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    
    // Ritorna direttamente l'elemento input (vedi anche l'ultima riga del javascript)
    WebElement elemento = (WebElement)js.ExecuteScript(
                                                            "let input=document.createElement('input');" +
                                                            "input.id='my_input_id'; " +
                                                            "input.value='Messaggio con emoji ??'; " +
                                                            "document.body.appendChild(input);" +
                                                            "input.select();" + 
                                                            "return input;"
                                                            );
    
    Comunque, ho trovato questo codice online e non ho avuto modo di provarlo. Ti consiglierei prima di tutto di inviare l'input da tastiera tramite le Actions.
Devi accedere o registrarti per scrivere nel forum
9 risposte