Queria um sistema extremamente simples para trocar mensagens entre dois computadores na rede, como é uma rede corporativa com vários bloqueios não seria possível usar algum Instant Messenger e também eu não queria ter de instalar um cliente (programa) somente para isto.
Pesquisando na web achei algumas soluções em PHP, juntando algumas idéias consegui atender minha necessidade.
O “banco de dados” fica armazenado num arquivo HTML dentro da própria pasta web onde o sistema é hospedado.
Na linha 6 do index.php configure seu nome como Admin (somente para o admin aparece um link para limpar a conversa)
Basta armazenar os três arquivos numa pasta do seu servidor web.
index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "//www.w3.org/TR/html4/strict.dtd"> <? date_default_timezone_set('America/Sao_Paulo'); $ADMIN = "Daniel"; ?> <html class="supernova"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="alternate" type="application/json+oembed" href="//www.jotform.com/oembed/?format=json&url=http%3A%2F%2Fwww.jotform.com%2Fform%2F61203526899664" title="oEmbed Form"><link rel="alternate" type="text/xml+oembed" href="//www.jotform.com/oembed/?format=xml&url=http%3A%2F%2Fwww.jotform.com%2Fform%2F61203526899664" title="oEmbed Form"> <meta property="og:title" content="Formulário" > <meta property="og:url" content="//www.jotformz.com/form/61203526899664" > <meta property="og:description" content="Please click the link to complete this form."> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> <meta name="HandheldFriendly" content="true" /> <title>Digipaper Informática - Chat interno</title> <link href="//cdn.jotfor.ms/static/formCss.css?3.3.12872" rel="stylesheet" type="text/css" /> <link type="text/css" rel="stylesheet" href="//cdn.jotfor.ms/css/styles/nova.css?3.3.12872" /> <link type="text/css" media="print" rel="stylesheet" href="//cdn.jotfor.ms/css/printForm.css?3.3.12872" /> <link type="text/css" rel="stylesheet" href="//cdn.jotfor.ms/themes/CSS/566a91c2977cdfcd478b4567.css?"/> <link type="text/css" rel="stylesheet" href="styles.css" /> <script src="//cdn.jotfor.ms/static/prototype.forms.js" type="text/javascript"></script> <script src="//cdn.jotfor.ms/static/jotform.forms.js?3.3.12872" type="text/javascript"></script> <script type="text/javascript"> JotForm.init(function(){ JotForm.alterTexts({"alphabetic":"Este campo pode conter apenas letras","alphanumeric":"Este campo só pode conter letras e números.","ccInvalidCVC":"Single Product w/ Single Choice Orders ","ccInvalidExpireDate":"Expire date is invalid.","ccInvalidNumber":"Credit Card Number is invalid.","ccMissingDetails":"Please fill up the Credit Card details.","ccMissingDonation":"Please enter numeric values for donation amount.","ccMissingProduct":"Please select at least one product.","characterLimitError":"Too many Characters. The limit is","characterMinLimitError":"Too few characters. The minimum is","confirmClearForm":"Você tem certeza que quer limpar este formulário?","confirmEmail":"E-mail não confere","currency":"Este campo apenas admite valores monetários.","cyrillic":"Este campo aceita apenas caracteres cirilicos.","dateInvalid":"This date is not valid. The date format is {format}","dateLimited":"This date is unavailable.","disallowDecimals":"Please enter a whole number.","email":"Digite um endereço de e-mail válido.","fillMask":"Valor do campo deve preencher máscara.","freeEmailError":"Não são permitidas contas de email gratuitas","generalError":"Existem alguns erros no formulário. Corrija-os antes de continuar. ","generalPageError":"Há erros nesta página. Por favor, corrija-os antes de continuar.","gradingScoreError":"Pontuação total deve ser menor ou igual a ","incompleteFields":"Há campos obrigatórios incompletos. Por favor, preencha-os.","inputCarretErrorA":"A entrada não deve ser menor do que o valor mínimo:","inputCarretErrorB":"Valor não deve ser maior do que o máximo:","lessThan":"A sua pontuação deve ser inferior ou igual a","maxDigitsError":"O numero máximo de caracteres permitidos são","maxSelectionsError":"O número máximo de seleções permitido é","minSelectionsError":"O número mínimo exigido de seleções é","multipleFileUploads_emptyError":"{file} está vazio, por favor selecione os arquivos de novo.","multipleFileUploads_fileLimitError":"Somente são permitidos {fileLimit} envios de arquivos","multipleFileUploads_minSizeError":"{file} é muito pequeno, o tamanho mínimo do arquivo é {minSizeLimit}.","multipleFileUploads_onLeave":"Os arquivos agora estão em upload, se você sair agora o upload será cancelado.","multipleFileUploads_sizeError":"{file} é muito grande, o tamanho máximo é {sizeLimit}.","multipleFileUploads_typeError":"O arquivo {file} é inválido, pois somente as extensões {extensions} são permitidas.","numeric":"Este campo pode conter apenas números","pastDatesDisallowed":"A data não pode ser passada.","pleaseWait":"Por favor aguarde...","required":"Este campo é obrigatório.","requireEveryCell":"Toda célula é requisitada.","requireEveryRow":"Todos os campos são requeridos.","requireOne":"Pelo menos um campo é requisitado","submissionLimit":"Foi mal, mas apenas um envio de dados é permitido. Múltiplas submissões estão desativadas nesse formulário.","uploadExtensions":"Só pode fazer upload dos seguintes ficheiros:","uploadFilesize":"O tamanho do arquivo não pode ser maior que:","uploadFilesizemin":"O ficheiro não pode ser menor que:","url":"This field can only contain a valid URL","wordLimitError":"Too many words. The limit is","wordMinLimitError":"Too few words. The minimum is"}); JotForm.clearFieldOnHide="disable"; JotForm.onSubmissionError="jumpToFirstError"; }); </script> </head> <body> <? session_start(); function loginForm(){ //echo date("d/m/y - G:i"); //echo phpinfo(); echo' <div id="loginform"> <form action="index.php" method="post"> <label for="name">Nome:</label> <input type="text" name="name" id="name" /> <input type="submit" name="enter" id="enter" value="Entrar" /> </form> </div> '; } if(isset($_POST['enter'])){ if($_POST['name'] != ""){ $_SESSION['name'] = stripslashes(htmlspecialchars($_POST['name'])); $fp = fopen("log.html", 'a'); fwrite($fp, "<div class='msgln'>(".date("d/m/y - G:i").")<i><b> ". $_SESSION['name'] ."</b> entrou do chat.</i><br></div>"); fclose($fp); } else{ echo '<span class="error">Digite seu nome</span>'; } } ?> <?php if(!isset($_SESSION['name'])){ loginForm(); } else{ ?> <form class="jotform-form" action="" method="post" name="message" id="61203526899664" accept-charset="utf-8"> <input type="hidden" name="formID" value="61203526899664" /> <div class="form-all"> <ul class="form-section page-section"> <li id="cid_1" class="form-input-wide" data-type="control_head"> <div class="form-header-group"> <div class="header-text"> <h2 id="header_1" class="form-header"> Olá, <b><?php echo $_SESSION['name']; ?></b>! </h2> <p style="float:right;"><a id="exit" href="#">Sair</a></p> </div> </div> </li> <li class="form-line" data-type="control_textarea" id="id_2"> <div id="cid_2" class="jf-required"> <div id="chatbox" class="chatbox" name="q2_input2"></div> </div> </li> <li class="form-line" data-type="control_textbox" id="id_3"> <label class="form-label form-label-left form-label-auto" id="label_3" for="input_3"> </label> <div id="cid_3" class="form-input jf-required"> <input type="text" class=" form-textbox" data-type="input-textbox" id="usermsg" name="usermsg" size="60" value="" /> </div> <?php if ($_SESSION['name'] == $ADMIN){ echo '<p class="logout" style="float:right;"><a id="clear" href="#">Limpar conversa</a></p>'; }; ?> </li> <li class="form-line" data-type="control_button" id="id_4"> <div id="cid_4" class="form-input-wide"> <div style="margin-left:156px" class="form-buttons-wrapper"> <button name="submitmsg" id="submitmsg" type="submit" class="form-submit-button"> Enviar </button> </div> </div> </li> <li style="display:none"> Should be Empty: <input type="text" name="website" value="" /> </li> </ul> </div> <input type="hidden" id="simple_spc" name="simple_spc" value="61203526899664" /> <script type="text/javascript"> document.getElementById("si" + "mple" + "_spc").value = "61203526899664-61203526899664"; </script> </form> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> <script type="text/javascript"> // jQuery Document $(document).ready(function(){ //If user submits the form $("#submitmsg").click(function(){ var clientmsg = $("#usermsg").val(); $.post("post.php", {text: clientmsg}); $("#usermsg").attr("value", ""); return false; }); //Load the file containing the chat log function loadLog(){ $.ajax({ url: "log.html", cache: false, success: function(html){ $("#chatbox").html(html); //Insert chat log into the #chatbox div }, }); } //Load the file containing the chat log function loadLog(){ var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height before the request $.ajax({ url: "log.html", cache: false, success: function(html){ $("#chatbox").html(html); //Insert chat log into the #chatbox div //Auto-scroll var newscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height after the request if(newscrollHeight > oldscrollHeight){ $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); //Autoscroll to bottom of div } }, }); } setInterval (loadLog, 2500); //Reload file every 2500 ms or x ms if you w }); </script> <?php } ?> <script type="text/javascript"> // jQuery Document $(document).ready(function(){ //If user wants to end session $("#exit").click(function(){ var exit = confirm("Quer mesmo sair do Chat?"); if(exit==true){window.location = 'index.php?logout=true';} }); //apagar conversa $("#clear").click(function(){ var apagar = confirm("Quer mesmo limpar todo o Chat?"); if(apagar==true){window.location = 'index.php?clean=true';} }); }); </script> <?php if(isset($_GET['logout'])){ //Simple exit message $fp = fopen("log.html", 'a'); fwrite($fp, "<div class='msgln'>(".date("d/m/y - G:i").")<i><b> ". $_SESSION['name'] ."</b> saiu do chat.</i><br></div>"); fclose($fp); session_destroy(); header("Location: index.php"); //Redirect the user } ?> <?php if(isset($_GET['clean'])){ //apagar conversa echo unlink("log.html"); header("Location: index.php"); //Redirect the user } ?> </body> </html>
post.php
<? date_default_timezone_set('America/Sao_Paulo'); session_start(); if(isset($_SESSION['name'])){ $text = $_POST['text']; $fp = fopen("log.html", 'a'); $data = date("d/m/y"); $hora = date("G")-3; $minuto = date("i"); fwrite($fp, "<div class='msgln'>(".date("d/m/y - G:i").") <b>".$_SESSION['name']."</b>: ".stripslashes(htmlspecialchars($text))."<br></div>"); fclose($fp); } ?>
styles.css
.form-label-left{ width:150px !important; } .form-line{ padding-top:12px; padding-bottom:12px; } .form-label-right{ width:150px !important; } body, html{ margin:0; padding:0; background:#fff; } .form-all{ margin:0px auto; padding-top:0px; width:650px; color:#555 !important; font-family:"Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Verdana, sans-serif; font-size:14px; } .form-radio-item label, .form-checkbox-item label, .form-grading-label, .form-header{ color: #555; } /* Injected CSS Code */ .form-all { font-family: "Lucida Grande", sans-serif; } .form-all { width: 650px; width: 100%; max-width: 650px; } .form-label-left, .form-label-right { width: 150px; } .form-label { white-space: normal; } .form-label.form-label-auto { display: inline-block; float: left; text-align: left; width: 150px; } .form-label-left { display: inline-block; white-space: normal; float: left; text-align: left; } .form-label-right { display: inline-block; white-space: normal; float: left; text-align: right; } .form-label-top { white-space: normal; display: block; float: none; text-align: left; } .form-all { font-size: 14px; } .form-label { font-weight: bold; } .form-checkbox-item label, .form-radio-item label { font-weight: normal; } .supernova { background-color: #ffffff; background-color: #f5f5f5; } .supernova body { background-color: transparent; } /* @width30: (unit(@formWidth, px) + 60px); @width60: (unit(@formWidth, px)+ 120px); @width90: (unit(@formWidth, px)+ 180px); */ /* | */ @media screen and (min-width: 480px) { .supernova .form-all { border: 1px solid #dcdcdc; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1); } } /* | */ /* | */ @media screen and (max-width: 480px) { .jotform-form { padding: 10px 0; } } /* | */ /* | */ @media screen and (min-width: 480px) and (max-width: 768px) { .jotform-form { padding: 30px 0; } } /* | */ /* | */ @media screen and (min-width: 480px) and (max-width: 649px) { .jotform-form { padding: 30px 0; } } /* | */ /* | */ @media screen and (min-width: 768px) { .jotform-form { padding: 60px 0; } } /* | */ /* | */ @media screen and (max-width: 649px) { .jotform-form { padding: 0; } } /* | */ .supernova .form-all, .form-all { background-color: #ffffff; border: 1px solid transparent; } .form-header-group { border-color: #e6e6e6; } .form-matrix-table tr { border-color: #e6e6e6; } .form-matrix-table tr:nth-child(2n) { background-color: #f2f2f2; } .form-all { color: #555555; } .form-header-group .form-header { color: #555555; } .form-header-group .form-subHeader { color: #6f6f6f; } .form-sub-label { color: #6f6f6f; } .form-label-top, .form-label-left, .form-label-right, .form-html { color: #555555; } .form-checkbox-item label, .form-radio-item label { color: #6f6f6f; } .form-line.form-line-active { -webkit-transition-property: all; -moz-transition-property: all; -ms-transition-property: all; -o-transition-property: all; transition-property: all; -webkit-transition-duration: 0.3s; -moz-transition-duration: 0.3s; -ms-transition-duration: 0.3s; -o-transition-duration: 0.3s; transition-duration: 0.3s; -webkit-transition-timing-function: ease; -moz-transition-timing-function: ease; -ms-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; background-color: #ffffe0; } /* ömer */ .form-radio-item, .form-checkbox-item { padding-bottom: 0px !important; } .form-radio-item:last-child, .form-checkbox-item:last-child { padding-bottom: 0; } /* ömer */ .form-single-column .form-checkbox-item, .form-single-column .form-radio-item { width: 100%; } .supernova { height: 100%; background-repeat: no-repeat; background-attachment: scroll; background-position: center top; background-repeat: repeat; } .supernova { background-image: none; } #stage { background-image: none; } /* | */ .form-all { background-repeat: no-repeat; background-attachment: scroll; background-position: center top; background-repeat: repeat; } .form-header-group { background-repeat: no-repeat; background-attachment: scroll; background-position: center top; } .form-line { margin-top: 12px; margin-bottom: 12px; } .form-line { padding: 12px 36px; } .form-all .qq-upload-button, .form-all .form-submit-button, .form-all .form-submit-reset, .form-all .form-submit-print { font-size: 1em; padding: 9px 15px; font-family: "Lucida Grande", sans-serif; font-size: 14px; font-weight: normal; } .form-all .form-pagebreak-back, .form-all .form-pagebreak-next { font-size: 1em; padding: 9px 15px; font-family: "Lucida Grande", sans-serif; font-size: 14px; font-weight: normal; } /* & when ( @buttonFontType = google ) { @import (css) "@{buttonFontLink}"; } */ h2.form-header { line-height: 1.618em; font-size: 1.714em; } h2 ~ .form-subHeader { line-height: 1.5em; font-size: 1.071em; } .form-header-group { text-align: left; } /*.form-dropdown, .form-radio-item, .form-checkbox-item, .form-radio-other-input, .form-checkbox-other-input,*/ .form-captcha input, .form-spinner input, .form-error-message { padding: 4px 3px 2px 3px; } .form-header-group { font-family: "Lucida Grande", sans-serif; } .form-section { padding: 0px 0px 0px 0px; } .form-header-group { margin: 12px 36px 12px 36px; } .form-header-group { padding: 24px 0px 24px 0px; } .form-textbox, .form-textarea { padding: 4px 3px 2px 3px; } #chatbox { text-align:left; margin:0 auto; margin-bottom:25px; padding:10px; background:#fff; height:200px; border:1px solid #ACD8F0; overflow:auto; } .form-textbox, .form-textarea, .form-radio-other-input, .form-checkbox-other-input, .form-captcha input, .form-spinner input { background-color: #ffffff; } [data-type="control_dropdown"] .form-input, [data-type="control_dropdown"] .form-input-wide { width: 150px; } .form-label { font-family: "Lucida Grande", sans-serif; } li[data-type="control_image"] div { text-align: left; } li[data-type="control_image"] img { border: none; border-width: 0px !important; border-style: solid !important; border-color: false !important; } .form-line-column { width: auto; } .form-line-error { overflow: hidden; -webkit-transition-property: none; -moz-transition-property: none; -ms-transition-property: none; -o-transition-property: none; transition-property: none; -webkit-transition-duration: 0.3s; -moz-transition-duration: 0.3s; -ms-transition-duration: 0.3s; -o-transition-duration: 0.3s; transition-duration: 0.3s; -webkit-transition-timing-function: ease; -moz-transition-timing-function: ease; -ms-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; background-color: #fff4f4; } .form-line-error .form-error-message { background-color: #ff3200; clear: both; float: none; } .form-line-error .form-error-message .form-error-arrow { border-bottom-color: #ff3200; } .form-line-error input:not(#coupon-input), .form-line-error textarea, .form-line-error .form-validation-error { border: 1px solid #ff3200; -webkit-box-shadow: 0 0 3px #ff3200; -moz-box-shadow: 0 0 3px #ff3200; box-shadow: 0 0 3px #ff3200; } .ie-8 .form-all { margin-top: auto; margin-top: initial; } .ie-8 .form-all:before { display: none; } /* | */ @media screen and (max-width: 480px), screen and (max-device-width: 768px) and (orientation: portrait), screen and (max-device-width: 415px) and (orientation: landscape) { .jotform-form { padding: 0; } .form-all { border: 0; width: 100% !important; max-width: initial; } .form-sub-label-container { width: 100%; margin: 0; } .form-input { width: 100%; } .form-label { width: 100%!important; } .form-line { padding: 2% 5%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } input[type=text], input[type=email], input[type=tel], textarea { width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; max-width: initial !important; } .form-input, .form-input-wide, .form-textarea, .form-textbox, .form-dropdown { max-width: initial !important; } div.form-header-group { padding: 24px 0px !important; margin: 0 12px 2% !important; margin-left: 5% !important; margin-right: 5% !important; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } [data-type="control_button"] { margin-bottom: 0 !important; } .form-buttons-wrapper { margin: 0!important; } .form-buttons-wrapper button { width: 100%; } table { width: 100%!important; max-width: initial !important; } table td + td { padding-left: 3%; } .form-checkbox-item input, .form-radio-item input { width: auto; } .form-collapse-table { margin: 0 5%; } } /* | */ /*__INSPECT_SEPERATOR__*/ /* Injected CSS Code */