Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
creare template html per instbot phyton
#1
Ciao Mattia,
ho installato un instag*am bot in phyton sul mio server seguendo questa guida.
testato e funzionante, adesso mi cheido se è possibile realizzare una interfaccia web html dalla quale generare altri bot.py in automatico (ovviamente dando il controllo su pochi comandi) e avviarli in totale autonomia.
Come dovrei muovermi a grandi linee?

Grazie pe l'aiuto
Chand
Cita messaggio
#2
Dipende cosa devono poter fare questi bot e se i bot devono essere disponibili in visite successive o solo al momento della visita.
Nel primo caso dovresti salvare i dati del bot in un database, mentre nel secondo ti basterebbe passare i dati allo script in Python.
Mattia!
Cita messaggio
#3
l'ideale sarebbe dare la possibilità ad altre persone di crearsi un proprio bot e poterci accedere anche in un secondo momento.
Il bot di per se ha dei preset (che non renderei customizabili) e delle info che invece potranno essere editabili per customizzare il funzionamento:
- almeno user e psw del proprio account inst*gram
- scelta degli hashtag
- possibilità di seguire utenti
- possibilità di non seguire più utenti
Non se se hai dato un'occhiata a com'è strutturato lo script, nella cartella principale c'è il file example.py (che sarebbe il bot.py sopra citato e modello di file che verrebbe duplicato e customizzato per ogni account che viene aggiunto), dal quale si possono inserire i dati sopra citati e che costituisce lo script dell'account personale, nonchè il file che verrà avviato. Dentro la cartella src, invece, ci sono tutti i singoli componenti dell'intero script che trovi in inst*bot.py (all'interno di questo ci sono dei parametri, che non renderei editabili, in quanto varrebbero per tutti gli "example.py" che verranno creati).
Al momento se avvio il bot sul mio server da terminale, eseguo per esempio:
Citazione:./example.py
e lo script si avvia temporaneamente su temrinale finchè non decido io di chiuderlo (o finchè non spengo il mac)... io invece vorrei fare in modo che da web questi script sia avviino per dei periodi precisi:
- 1 giorno
- 3 giorni
- 1 settimana
- 1 mese
e che, quindi, nn si stoppino nel frattempo.

Dici che ho esagerato coi dettagli? smilie

Fammi sapere
Chand
Cita messaggio
#4
Allora potresti creare tanti file come "example.py" personalizzati per ogni utente.
Se dopo il bot deve fare tutto da solo, puoi creare dei cron job che eseguano gli script in Python per i periodi che vuoi.
Mattia!
Cita messaggio
#5
L'ideale sarebbe rendere la creazione degli "example.py" automatica e direttamente da web, nel momento in cui l'utente inserisce le impostazioni (compreso l'accesso al proprio account) nella pagina apposita e clicca su "crea", automaticamente viene generato il file "example.py".
Mentre per rendere l'esecuzione del file.py "indipendetne" anzichè manuale da terminale, non bisogna tipo trasformare lo script in demone che resta avviato? Anche in caso di riavvio inaspettato del server...

Lo scopo sarebbe di fare una interfaccia web (come se fosse un sito) automatizzata.
Cita messaggio
#6
Creare i file copia di "example.py" in PHP o altro linguaggio lato server è abbastanza semplice.
Ecco un esempio in PHP:
Codice PHP:
$fp fopen('cartella/nomefile.py''w');
fwrite($fp'#!/usr/bin/env python ...');
fclose($fp); 

Poi potresti creare un cron job (è un comando eseguito da crontab che, a sua volta, usa il demone crond) che esegue lo script copia di "example.py" ogni X tempo.
Qui c'è una guida che spiega come creare i cron job da PHP.
Mattia!
Cita messaggio
#7
Ottimo, intanto grazie mille fin qui!
Ti aggiorno a breve non appena trovo qualche intoppo smilie

Grazie
Cita messaggio
#8
Ciao Mattia,
se non ho capito male, nella cartella instabot dovrei creare un file.php con un codice tipo questo:
Codice:
<?php
$fp = fopen('instabot/example.py', 'w');
fwrite($fp, '#!/usr/bin/env python ...');
fclose($fp);

01 06 * * * /home/chand/instabot/example.py

?>
in questo caso ho settato un cron che avvia il file example.py ogni mattina alle 06:01... corretto? Oppure ho fatto una cazzata?

attendo tuo riscontro, grazie
Chand
Cita messaggio
#9
Con la prima parte del codice PHP crei i file, poi ha inserito il comando per inserire un cron che darebbe errore perché non è in PHP.
Nella guida di cui ti ho messo il link prima c'è una guida per creare una classe per gestire i cron. Utilizzando quella classe puoi aggiungere i cron con il comando che hai scritto.
Mattia!
Cita messaggio
#10
quindi forse una cosa più di questo tipo:
Codice:
<?php
$fp = fopen('instabot/example.py', 'w');
fwrite($fp, '#!/usr/bin/env python ...');
fclose($fp);

Class Ssh2_crontab_manager {

   private $connection;
   private $path;
   private $handle;
   private $cron_file;

   function __construct() {...}

   public function exec() {...}

   public function write_to_file() {...}

   public function remove_file() {...}

   public function append_cronjob() {...}

   public function remove_cronjob() {...}

   public function remove_crontab() {...}

   private function crontab_file_exists() {...}

   private function error_message() {...}

}

$crontab = new Ssh2_crontab_manager('XX.XX.XXX.XXX', '22', 'my_username', 'my_password');

$crontab->append_cronjob('01 06 * * * /home/chand/instabot/example.py');
$crontab->append_cronjob($new_cronjobs);

?>

dando per scontato che avrò installato sul server ssh2, ma cmq mi sa che avrò scritto un pasticcio smilie

Fammi sapere
Grazie
Cita messaggio
#11
Naturalmente la classe Ssh2_crontab_manager nel tuo codice non è completa perché ci sono i puntini all'interno del codice dei vari metodi (ho visto che ora c'è la traduzione italia della guida).
Ti conviene mettere la classe in un file esterno e includerla con un require per mantenere tutto in ordine.

Nelle prime tre righe di codice crei il file "example.py" che deve avere un contenuto simile a questo con le dovute modifiche (nell'esempio che ti avevo messo io scrive solo la prima riga e tre puntini) e dovrebbe avere ogni volta un nome differente, altrimenti sovrascrive sempre lo stesso file.

Nelle ultime righe di codice utilizzi la classe Ssh2_crontab_manager a cui dovresti naturalmente passare i parametri corretti e poi crei il cron job (l nome del file dovrà corrispondere al nome del file "example.py" che hai creato prima).
L'ultima riga puoi cancellarla, perché la variabile $new_cronjobs non è mai stata creata e hai già creato il cron job nella riga precedente.
Mattia!
Cita messaggio
#12
Allora, proviamo ad abbozzare!
ho creato un file html per inserire i dati che andranno inseriti nel file "example.py":
Codice:
<!DOCTYPE html>
<html lang="it">
<head>
<title></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="resources/css/layout.css">
<script type="text/javascript" src="resources/js/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="resources/js/custom.js"></script>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>

<body>
    <div class="container">
        <header>
            <h2 class="logo">Vincistabot</h2>
            <h1>Vincistabot</h1>
        </header>
        <section>
            <div class="content-wrapper-dark">
                <h2>Compila il tuo instagram Bot</h2>
                <hr class="big-dashed" />
                <h3>login</h3><input class="input-social" type="text" value="username" />
                <h3>password</h3><input class="input-social flt-lft" type="password" value="password" />
                <br class="clearfix" />
                <h3>like per day</h3><input class="input-social" type="text" value="1000" />
                <h3>tag list (separati da una virgola)</h3><input class="input-social" type="text" value="follow4follow" />
                <h3>follow per day</h3><input class="input-social flt-lft" type="text" value="50" /><br class="clearfix" />
                <h3>unfollow per day</h3><input class="input-social flt-lft" type="text" value="50" /><br class="clearfix" />
                <h3>comments (separati da una virgola)</h3><input class="input-social flt-lft" type="text" value="wow, beautiful" />
                <br class="clearfix" />
                <button class="button-go button-go2 flt-lft">VAI</button><br class="clearfix" />
            </div>
            
        </section>
        <footer>
            
        </footer>
    </div>
</body>
</html>
con questo layout.css
Codice:
.flt-lft{
    float:left;
}
.flt-rgt{
    float:right;
}
.container{
    position:relative;
    margin:auto;
    width:640px;
    height:960px;
    background:#999;
}
header{
    position:relative;
    height:188px;
    overflow:hidden;
    background:#2f2f2f;
    box-shadow:0 -2px 7px rgba(0,0,0,.3);
}
h1{
    position:absolute;
    z-index:9;
    width:100%;
    text-transform:uppercase;
    font-size:24px;
    line-height:44px;
    bottom:0;
    font-family:helvetica,arial,sans-serif;
    color:#333;
    text-align:center;
    background:#ffde00;
    /*box-shadow:10px 1px 10px rgba(0,0,0,1);*/
}
section{
    background:#2f2f2f;
    height:606px;
    overflow:auto;
    padding-bottom:100px;
}
.header-item{
    color:#ff8400;
    text-transform:uppercase;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    display:block;
    font-size:24px;
    line-height:18px;
}
.item-img{
    width:96px;
}
.item-img img{
    padding:3px;
    background:#fff;
}
.header-update{
    color:#2f2f2f;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    display:block;
    font-size:17px;
}
.item-content{
    width:80%;
}
.item-drag span{
    display:block;
    width:52px;
    height:12px;
    background:url(../img/drag-item-icon.png) no-repeat;
}
.item-rate span{
    display:block;
    width:41px;
    height:36px;
    background:url(../img/rating-star.png) no-repeat;
}
.item-rate span.on{
    background-position:0 -36px;
}
footer ul{
    position:absolute;
    z-index:9;
    bottom:0;
    display:table;
    table-layout:fixed;
    width:100%;
    height:146px;
    border-top:solid 20px #fff;
    background:#2f2f2f;
    box-shadow:0 2px 7px rgba(0,0,0,.3);
}
footer ul li{
    width:25%;
    display:table-cell;
    text-align:center;
    height:136px;
    text-align:center;
}
footer ul li a{
    background-image:url(../img/footer-menu-icons.png);
    background-repeat:no-repeat;
    display:block;
    height:126px;
    overflow:hidden;
    color:#fff;
    font-family:helvetica,arial,sans-serif;
    font-size:17px;
    line-height:240px;
    text-transform:uppercase;
    text-decoration:none;
    border-top:solid 12px #2f2f2f;
}
footer ul li a.foot-menu-puntate{
    background-position:center 30px;
}
footer ul li a.foot-menu-preferiti{
    background-position:center -170px;
}
footer ul li a.foot-menu-cerca{
    background-position:center -370px;
}
footer ul li a.foot-menu-impostazioni{
    background-position:center -570px;
}
footer ul li a:hover{
    border-top-color:#ff8400;
}
.content-wrapper{
    margin:auto;
    background:#fff;
    width:96%;
}
.content-wrapper-dark{
    margin:auto;
    width:96%;
}
.icon-header{
    font-size:48px;
    color:#ff8400;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    text-align:center;
    height:150px;
    line-height:150px;
}
.icon-h-search{
    padding-left:60px;
    background:url(../img/icon-h-search.png) 16% 50% no-repeat;
}
.search-wrapper{
    width:420px;
    height:108px;
    margin:20px auto 0;
}
.search-wrapper input{
    font-size:24px;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    border:solid 3px #c2c2c2;
    padding:10px;
    margin:0;
    display:block;
    float:left;
    width:284px;
    height:32px;
}
.button-search{
    background:#ff8400;
    color:#fff;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    font-size:36px;
    line-height:60px;
    width:110px;
    border:0;
    height:58px;
    text-transform:uppercase;
    margin-left:-2px;
    float:right;
    cursor:pointer;
}
h2.logo{
    position:absolute;
    left:50%;
    margin-left:-48px;
    display:block;
    width:70px;
    height:98px;
    background:url(../img/logo.png) no-repeat;
    overflow:hidden;
    text-indent:-10000px;
    top:23px;
}
.transparent-wrapper{
    background: transparent;
}
.content-wrapper-dark h2{
    color:#ffde00;
    font-family:helvetica,arial,sans-serif;
    font-size:26px;
    text-align:center;
    line-height:45px;
}
.content-wrapper-dark h3{
    color:#ffde00;
    font-family:Trebuchet,helvetica,arial,sans-serif;
    font-size:20px;
    padding-top:20px;
    line-height:45px;
}
.big-dashed{
    border:0;
    border-top:dashed 2px #fff;
    margin-bottom:20px;
}
.header-social{
    background-image:url(../img/bg-social-share.png);
    background-repeat:no-repeat;
    height:50px;
    color:#fff;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    font-size:36px;
    line-height: 50px;
    margin:15px 0 10px 0;
}

.input-social{
    font-size:20px;
    padding:7px 15px;
    line-height:27px;
    font-family:helvetica,arial,sans-serif;
    border:solid 3px #c2c2c2;
    color:#c2c2c2;
    display:block;
    border-radius:3px;
    margin-bottom:4px;
    width:250px;
}
.button-go{
    float:left;
    font-family:helvetica,arial,sans-serif;
    font-size:36px;
    text-transform: uppercase;
    color:#333;
    height:57px;
    width:180px;
    line-height:65px;
    padding:0 25px;
    margin-top:2px;
    border:0;
    cursor:pointer;
}
.button-go2{
    background:#ffde00;
}
.button-base{
    background:#999;
    float:left;
    font-family:helvetica,arial,sans-serif;
    font-size:36px;
    text-transform: uppercase;
    color:#fff;
    height:17px;
    width:180px;
    line-height:65px;
    padding:0 25px;
    margin-top:2px;
    border:0;
    cursor:pointer;
}
ul.set li{
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    color:#fff;
    font-size:24px;
    line-height:84px;
    height:80px;
}
ul.set li a{
    float:right;
    width:75px;
    height:41px;
    text-indent:-10000px;
    background:url(../img/switch-settings.png) 0 -100px no-repeat;
    margin-top:20px;
}
ul.set li a.on{
    background-position: 0 0;
}
.header-privacy{
    height:50px;
    color:#fff;
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    font-size:36px;
    line-height: 50px;
    margin:15px 0 10px 0;
    text-align:center;
}
ul.privacy li{
    font-family:MyriadPro-BoldCond,helvetica,arial,sans-serif;
    color:#fff;
    font-size:22px;
    line-height:29px;
}
naturalmente i testi che leggi in grigetto dentro i form vengono letti sempre dal file "example.py", quando clicco su VAI
si collega alla pagina.php che ha questo codice:
Codice:
<?php
$fp = fopen('instabot/example.py', 'w');
fwrite($fp, '#!/usr/bin/env python ...');
fclose($fp);

require('class.php');

$crontab = new Ssh2_crontab_manager('host', 'port', 'my_username', 'my_password');

$crontab->append_cronjob('01 06 * * * /home/chand/instabot/example.py');

?>
il codice andrebbe modificato per fare in modo che il file venga duplicato e rinominato (ad es. viene rinominato con l'username inserito nel form, in questo caso "chandler.py") e che i dati vengano memorizzati tramite fwrite (anche se non ho capito come si faccia esattamente). La classe viene richiamata tramite require e sarà invece contenuta nel file class.php
nell'Ssh2_crontab_manager inserisco i dati di accesso al mio server ma non so come far corrispondere il cron al file che è appena stato duplicato e rinominato.

Infine nel file class.php ci va questo codice (anche qui vorrei capire cosa inserire in ogni function):
Codice:
Class Ssh2_crontab_manager {

   private $connection;
   private $path;
   private $handle;
   private $cron_file;

   function __construct() {...}

   public function exec() {...}

   public function write_to_file() {...}

   public function remove_file() {...}

   public function append_cronjob() {...}

   public function remove_cronjob() {...}

   public function remove_crontab() {...}

   private function crontab_file_exists() {...}

   private function error_message() {...}

}
so che le idee sono ancora un pò confuse, ma ho cercato di mettere tutto in ordine... dimmi se il ragionamento è corretto

Grazie
Chand
Cita messaggio
#13
Nel codice HTML dovresti inserire tutti i campi dentro a un form e inoltre dovresti aggiungere ai campi il parametro "name", altrimenti non riuscirai a inviare i dati al file PHP.

Per duplicare il file "example.py", potresti tenere una copia del file, leggerlo quando ti serve e poi creare il nuovo file.
Codice PHP:
// Leggo il contenuto del file "example.py".
$example file_get_contents('instabot/example.py');

// Leggo il valore dell'username ed elimino tutti i caratteri diversi da lettere, numeri, - e _
$username = isset($_POST['username']) && is_string($_POST['username']) ? preg_replace('/(^[a-z0-9-_]+)/i'''trim($_POST['username'])) : '';

// Creo il nuovo file solo se è stato inviato un valore per il campo username
if ($username != '') {
    
$fp fopen('instabot/'.$username.'.py''w');
    
fwrite($fp$example);
    
fclose($fp);
    
    
// Qui andrebbe tutto il resto dello script (inclusione della classe e creazione del cron)


Per creare il cron devi utilizzare il nome del file che hai creato:
Codice PHP:
$crontab->append_cronjob('01 06 * * * /home/chand/instabot/'.$username.'.py'); 

Per quanto riguarda il codice della classe, in questa guida alla fine di ogni sottocapitolo ("Fase") c'è il codice completo di ogni metodo. Ti conviene comunque leggere tutta la guida per capire cosa fa ogni funzione.
Mattia!
Cita messaggio
#14
Ciao Mattia,
nella pagina html intendi sostituire il parametro value col parametro name? Se si, quindi una cosa del genere?
Codice:
<!DOCTYPE html>
<html lang="it">
<head>
<title></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="resources/css/layout.css">
<script type="text/javascript" src="resources/js/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="resources/js/custom.js"></script>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>

<body>
    <div class="container">
        <header>
            <h2 class="logo">Vincistabot</h2>
            <h1>Vincistabot</h1>
        </header>
        <section>
            <div class="content-wrapper-dark">
                <h2>Compila il tuo instagram Bot</h2>
                <hr class="big-dashed" /><form>
                <h3>login</h3><input class="input-social" type="text" name="username" />
                <h3>password</h3><input class="input-social flt-lft" type="password" name="password" />
                <br class="clearfix" />
                <h3>like per day</h3><input class="input-social" type="text" name="1000" />
                <h3>tag list (separati da una virgola)</h3><input class="input-social" type="text" name="follow4follow" />
                <h3>follow per day</h3><input class="input-social flt-lft" type="text" name="50" /><br class="clearfix" />
                <h3>unfollow per day</h3><input class="input-social flt-lft" type="text" name="50" /><br class="clearfix" />
                <h3>comments (separati da una virgola)</h3><input class="input-social flt-lft" type="text" name="wow, beautiful" />
                <br class="clearfix" />
                <button class="button-go button-go2 flt-lft">VAI</button><br class="clearfix" /></form>
            </div>
            
        </section>
        <footer>
            
        </footer>
    </div>
</body>
</html>
Ammesso che sia giusto devo fare in modo che il button porti alla pagina instascript.php chedovrebbe avere questo codice:
Codice:
<?php
// Leggo il contenuto del file "example.py".
$example = file_get_contents('instabot/example.py');

// Leggo il valore dell'username ed elimino tutti i caratteri diversi da lettere, numeri, - e _
$username = isset($_POST['username']) && is_string($_POST['username']) ? preg_replace('/(^[a-z0-9-_]+)/i', '', trim($_POST['username'])) : '';

// Creo il nuovo file solo se è stato inviato un valore per il campo username
if ($username != '') {
    $fp = fopen('instabot/'.$username.'.py', 'w');
    fwrite($fp, $example);
    fclose($fp);
    
// Richiamo il file con la classe
require('class.php');

// Creo il cron con Ssh2_contab_manager
$crontab = new Ssh2_crontab_manager('host', 'port', 'my_username', 'my_password');

$crontab->append_cronjob('01 06 * * * /home/chand/instabot/'.$username.'.py');
}
?>
non so se hai visto che sul file html ho messo che i campi tag e commenti vanno separati con una virgola, mentre sul file.py andranno messi tra apice/apostrofo.

Infine il file class.php
Codice:
<?php
Class Ssh2_crontab_manager {

   private $connection;
   private $path;
   private $handle;
   private $cron_file;

// Creo costruttore per l'istituzione e l'autenticazione della connessione SSH2
   function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
{
    $path_length     = strrpos(__FILE__, "/");      
    $this->path      = substr(__FILE__, 0, $path_length) . '/';
    $this->handle    = 'crontab.txt';        
    $this->cron_file = "{$this->path}{$this->handle}";

    try
    {
        if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!");
        
        $this->connection = @ssh2_connect($host, $port);
        if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established.");

        $authentication = @ssh2_auth_password($this->connection, $username, $password);
        if ( ! $authentication) throw new Exception("Could not authenticate '{$username}' using password: '{$password}'.");
    }
    catch (Exception $e)
    {
        $this->error_message($e->getMessage());
    }
}

// Creo esecuzione pubblica di comandi multipli
   public function exec()
{
    $argument_count = func_num_args();

    try
    {
        if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified.");

        $arguments = func_get_args();

        $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0];

        $stream = @ssh2_exec($this->connection, $command_string);
        if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}");

    }
    catch
    {
        $this->error_message($e->getMessage());
    }

    return $this;
}

// Scrivo crontab in un file
   public function write_to_file($path=NULL, $handle=NULL)
{
    if ( ! $this->crontab_file_exists())
    {  
        $this->handle = (is_null($handle)) ? $this->handle : $handle;
        $this->path   = (is_null($path))   ? $this->path   : $path;

        $this->cron_file = "{$this->path}{$this->handle}";

        $init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}";

        $this->exec($init_cron);
    }

    return $this;
}

// Rimuovo il file temporaneo di cron
   public function remove_file()
{
    if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}");

    return $this;
}

// Creo nuovi processi cron job
   public function append_cronjob($cron_jobs=NULL)
{
    if (is_null($cron_jobs)) $this->error_message("Nothing to append!  Please specify a cron job or an array of cron jobs.");
    
    $append_cronfile = "echo '";        
    
    $append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs;
    
    $append_cronfile .= "'  >> {$this->cron_file}";
    
    $install_cron = "crontab {$this->cron_file}";

    $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file();
    
    return $this;
}

// Rimuovo i cron jobs esistenti
   public function remove_cronjob($cron_jobs=NULL)
{
    if (is_null($cron_jobs)) $this->error_message("Nothing to remove!  Please specify a cron job or an array of cron jobs.");
    
    $this->write_to_file();

    $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
    
    if (empty($cron_array)) $this->error_message("Nothing to remove!  The cronTab is already empty.");
    
    $original_count = count($cron_array);
    
    if (is_array($cron_jobs))
    {
        foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);
    }
    else
    {
        $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT);
    }  
    
    return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array);
}

// Rimuovo il crontab intero
   public function remove_crontab()
{
    $this->exec("crontab -r")->remove_file();
    
    return $this;
}

// Restituisco il risultato se il cron temporaneo esiste
   private function crontab_file_exists()
{
    return file_exists($this->cron_file);
}

// Qui inserisco il messaggio di errore che vogliamo visualizzare
   private function error_message($error)
{
    die("<pre style='color:#EE2711'>ERROR: {$error}</pre>");
}
}
?>
Questa volta ho studiato! smilie
però nn mi è chiaro se è necessario che l'esecuzione dei comandi multipli debba essere pubblica o anche privata, e se sia necessario (nel mio caso) creare altri cronjob e di conseguenza rimuoverli.
Per il momento mi sembra tutto Smile
Attendo tuo riscontro
Cita messaggio
#15
Va bene aver sostituito i parametri "value" con i parametri "name".

Per inviare il form, devi modificare il tag "form" di apertura in questo modo:
Codice:
<form action="instascript.php" method="post">

Per una maggiore compatibilità, aggiungi l'attributo "type" con valore "submit" al bottone:
Codice:
<button type="submit" class="button-go button-go2 flt-lft">VAI</button>

Il metodo "exec" potresti anche renderlo privato in modo che nessun altro script possa eseguire dei comandi, visto che tu non lo esegui direttamente, ma solo tramite il metodo per aggiungere un nuovo cron.

Per ogni file dovresti avere un cron job, quindi dovresti eliminare i cron job nel caso in cui elimini i file.
Mattia!
Cita messaggio
#16
Per adesso ho fatto una prova, ma come faccio a capire se tutto è andato a buon fine?
Non conviene stampare un messaggio di connessione e creazione avvenute correttamente?

Per rendere l'exec privato basta modificarlo in questo modo?
Codice:
// Creo esecuzione pubblica di comandi multipli
   private function exec()
{
    $argument_count = func_num_args();

    try
    {
        if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified.");

        $arguments = func_get_args();

        $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0];

        $stream = @ssh2_exec($this->connection, $command_string);
        if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}");

    }
    catch
    {
        $this->error_message($e->getMessage());
    }

    return $this;
}

Attendo tue, grazie
Chand
Cita messaggio
#17
Se vuoi stampare un messaggio di avvenuta creazione del cron job, puoi inserire dopo:
Codice PHP:
$crontab->append_cronjob('01 06 * * * /home/chand/instabot/'.$username.'.py');

echo 
'<p>Creazione OK</p>'

Nel caso la creazione del cron job dia errore la classe dovrebbe stampare in automatico un messaggio.

Per rendere un metodo privato è corretto scrivere "private" prima di "function".
Mattia!
Cita messaggio
#18
Ciao Mattia, ho provato ma quando provo ad avviare lo script continuo a non visualizzare nessun messaggio e se guardo la cartella di instbot non viene creato neanche il nuovo file.
Cita messaggio
#19
Alla fine del codice prova a mettere:
Codice PHP:
echo '<p>Username: '.$username.'</p>'

Se stampa a schermo "Username:" e basta vuol dire che non riceve correttamente i dati dal form.

Se continua a non stampare nulla, ci dovrebbe essere qualche errore nel codice che non viene mostrato.
Per mostrare gli errori nel codice inserisci all'inizio del codice:
Codice PHP:
error_reporting(E_ALL);
ini_set('display_errors'1); 
Mattia!
Cita messaggio
#20
eccomi, mi restituisce l'errore:
Citazione:Warning: file_get_contents(instabot/example.py): failed to open stream: No such file or directory in /var/www/vincisinstabot/instascript.php on line 6

quindi ho pensato che su instascript.php frose bisogna modificare la riga 6 col giusto percorso della cartella instabot
Codice:
$example = file_get_contents('/home/chand/instabot/example.py');
ma se provo, ho di nuovo pagina bianca, senza errori e senza messaggio di avvenuta connessione (e dentro la cartella non viene ancora creato il file.py)
Cita messaggio
#21
Alla fine del codice hai messo questo?
Codice PHP:
echo '<p>Username: '.$username.'</p>'

Se sì, c'è qualche errore che non viene intercettato.
Mattia!
Cita messaggio
#22
si, l'ho messo subito dopo il messaggio "creazione ok", per intenderci ho chiuso così:
Codice:
echo '<p>Creazione OK</p>';
echo '<p>Username: '.$username.'</p>';
}
?>

però, effettivamente, se la graffa in chiusura la metto prima dei due echo allora la pagina mi da questo risultato:
Citazione:Creazione OK

Username:
ma guardando la cartella il file non viene comunque creato!
Cita messaggio
#23
Il primo "echo" deve rimanere dov'era prima, mentre il secondo deve essere dopo la parentesi graffa chiusa.
Comunque significa che non viene letto l'username passato tramite il form.

Dopo il secondo "echo" prova a mettere (così vediamo cosa viene inviato dal form in POST):
Codice PHP:
var_dump($_POST); 
Mattia!
Cita messaggio
#24
ecco quello che viene visualizzato:
Citazione:Username:

array(6) { ["username"]=> string(11) "chandler" ["password"]=> string(9) "xxxxxxx" [1000]=> string(3) "100" ["follow4follow"]=> string(17) "ciccio, salsiccio" [50]=> string(2) "10" ["wow,_beautiful"]=> string(13) "bella, storia" }
Cita messaggio
#25
Allora il problema è nell'espressione regolare per togliere i caratteri strani dall'username.
Prova a modificare così:
Codice PHP:
$username = isset($_POST['username']) && is_string($_POST['username']) ? preg_replace('/([^a-z0-9-_]+)/i'''trim($_POST['username'])) : ''
Mattia!
Cita messaggio
#26
adesso mi da questo errore:
Citazione:Error response
Error code 501.

Message: Unsupported method ('POST').

Error code explanation: 501 = Server does not support this operation.
non so se è perchè il servizio è temporaneamente non funzioannte, o se ho fatto qualche danno col server (visto che stavo provando ad installare lo script del wifi_k*ygen dell'altro post)
Cita messaggio
#27
ho ripristinato il servizio e adesso mi stampa questi errori:
Citazione:Warning: fopen(/home/chand/instabot/username.py): failed to open stream: Permission denied in /var/www/vincisinstabot/instascript.php on line 13

Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/vincisinstabot/instascript.php on line 14

Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/vincisinstabot/instascript.php on line 15

Parse error: syntax error, unexpected '{', expecting '(' in /var/www/vincisinstabot/class.php on line 51

Per intenderci, le righe 13, 14 e 15 dicono questo:
Codice:
$fp = fopen('/home/chand/instabot/'.$username.'.py', 'w');
    fwrite($fp, $example);
    fclose($fp);

mentre in class.php la riga 51 ha la parentesi graffa, ma la parte di codice è questa:
Codice:
// Creo esecuzione privata di comandi multipli
   private function exec()
{
    $argument_count = func_num_args();

    try
    {
        if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified.");

        $arguments = func_get_args();

        $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0];

        $stream = @ssh2_exec($this->connection, $command_string);
        if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}");

    }
    catch
    {
        $this->error_message($e->getMessage());
    }

    return $this;
}
nel dettaglio la parentesi che precede catch
Cita messaggio
#28
Significa che è sbagliato il percorso dove vuoi salvare il file.
Crea una sottocartella dove c'è lo script dove verranno salvati i file e modifica così:
Codice PHP:
$fp fopen('nuovacartella/'.$username.'.py''w'); 

Per l'errore in "class.php", prova a modificare dove c'è "catch" in questo modo:
Codice PHP:
catch (Exception $e
Mattia!
Cita messaggio
#29
ho seguito le tue istruzioni e continua a darmi errore:
Citazione:Warning: fopen(web/chandler.py): failed to open stream: No such file or directory in /var/www/vincisinstabot/instascript.php on line 13

Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/vincisinstabot/instascript.php on line 14

Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/vincisinstabot/instascript.php on line 15
Creazione OK

Username: chandler

array(6) { ["username"]=> string(11) "chandler" ["password"]=> string(9) "miapassword" [1000]=> string(3) "100" ["follow4follow"]=> string(13) "follow4follow" [50]=> string(2) "10" ["wow,_beautiful"]=> string(13) "bella, storia" }
Cita messaggio
#30
Hai creato una cartella "web" sotto a quella in cui è presente lo script?
Mattia!
Cita messaggio


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  script per generazione immagine da template Chandler 135 278.522 18/07/2015 08:19
Ultimo messaggio: Mattia

Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)