Gå til innhold

Sende SMS skript?


Anbefalte innlegg

Videoannonse
Annonse

Har tenkt til aa ta en titt paa dette scriptet igjen naar jeg kommer tilbake fra ferie paa onsdag, og rette opp eventuelle feil og mangler.. Noen funksjonsoensker til da?

Hadde ogsaa tenkt aa lage et script som kan sjekke etter nye mail paa en IMAP server, for saa aa sende en SMS med info om nye mailer til et gitt mobilnummer. Er dette av interesse for noen andre enn meg?

 

Jonhoo

Lenke til kommentar

Da var det gjort...

Scriptet email2SMS.php må ligge i samme mappe som imapX.php og sendSMS.php, og så setter du bare opp en planlagt oppgave (Windows) eller crontab (Linux) som skal kjøre så ofte du vil at den skal sjekke...

 

Det vanlige scriptet fungerer nå som det skal, og man kan også sende meldinger lengre enn 127 tegn (De vil da ble delt opp over flere meldinger, med reklame i hver melding.

 

Enjoy!

 

(Kom gjerne med tilbakemeldinger =) )

Jonhoo

SendSMS.zip

Lenke til kommentar
  • 2 måneder senere...
  • 1 måned senere...

De har visst endra litt på sidene sine ja, man må blant annet bekrefte SMSen før den sendes nå.

Jeg har ikke så voldsomt peiling på curl, men har nå prøvd meg litt frem og er NESTEN i mål!

 

Jeg kommer så langt som til siden man skal bekrefte meldingen, men får bare 500-feilmelding etter det.

Noen andre som er bedre på curl enn meg som ser hva som er feil? :)

 

 

<?php

/*
$meldingssentral = new SMS($bruker, $passord)
- Kobler til ung1881

$meldingssentral->sendSMS($til, $melding)
- Sender en SMS

$meldingssentral->sisteLoggmelding()
- Henter ut siste loggmelding
Alle loggmeldinger er lagret i en array slik:
Array( 
	'msg' => 
	'error' =>
	'time' =>
)

$meldingssentral->hentSessionLogg()
- Henter ut alle loggmeldinger for objektet

//Sett opp DB tilkobling før du prøver funksjonene under!
$meldingssentral->settDbConn($dbconn, $tabellnavn)

//Pass også på at det er satt opp en tiktig tabell
$meldingssentral->createTable($dbconn, $tabellnavn)
- Prøver å lage en tabell med riktige innstillinger
- Dersom en allerede finnes vil tilkobling bli opprettet med en gang,
	du taper ikke noe hastighet på å kjøre denne funksjonen for hver gang
	så lenge du kjører den istedenfor settDbConn

$logg = $meldingssentral->hentLogg($måned = false, $år = false);
- Gir deg en liste med meldinger sendt, mottakere, datoer etc fra en database...
- Kan hente ut meldinger kun fra en gitt måned (dette året hvis ikke noe år oppgitt)
- Kan hente ut meldinger fra et gitt år
- Hvis ingen parametere er gitt returnerer den alle loggoppføringer

-- OBS: Denne funksjonen lagrer automatisk loggen fra denne sessionen

$meldingssentral->oppdaterLogg()
- Lagrer nåværende logg til databasen
- Passer på at det ikke blir noen duplikater
*/

class SMSsender {
private $bruker;
private $passord;
private $cookiefil;
private $curl_session;
private $finished_url;
private $isAuthed = false;

private $logger = array();
private $fulllogger = array();
private $dbconn = false;
private $loggtable = '';

function __construct($bruker, $passord, $cookie = '', $connect = true)
{
	$this->bruker = $bruker;
	$this->passord = $passord;
	$this->cookiefil = ($cookie == '' ? 'cookie-sms.'.time().'.txt' : $cookie);

	$this->curl_session = curl_init();

	if ($connect)
		if (!$this->auth())
		{
			trigger_error('Kunne ikke logge på ung1881.no!', E_USER_WARNING);
			return false;
		}
}

public function connect()
{
	if (!$this->auth())
	{
		trigger_error('Kunne ikke logge på ung1881.no!', E_USER_WARNING);
		return false;
	}
}

private function log($msg, $error, $tid = 0)
{
	array_push($this->logger, array('error' => ($error?1:0), 'msg' => $msg, 'time' => (!$tid?time():$tid)));
}

private function auth()
{
	//Skaff nødvendige variabler før posting
	curl_setopt($this->curl_session, CURLOPT_URL, "http://www.1881.no/ung1881/Default.aspx");
	curl_setopt($this->curl_session, CURLOPT_RETURNTRANSFER, 1);
	$frontpage = curl_exec($this->curl_session);
	$tokens = array();
		//Hent inn hidden validation fields
		preg_match('/ id="__VIEWSTATE" value="([^"]+)"/', $frontpage, $tokens['viewstate']);
	$tokens['viewstate'] = $tokens['viewstate'][1];


	//Send post for logginn
	curl_setopt($this->curl_session, CURLOPT_URL, "http://www.1881.no/ung1881/Default.aspx");
	curl_setopt($this->curl_session, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($this->curl_session, CURLOPT_POST, 1);
		$post =  '__VIEWSTATE='.urlencode($tokens['viewstate']);
		$post .= '&ctl00$ucSearchBar$txtUserName='.$this->bruker;
		$post .= '&ctl00$ucSearchBar$txtPassword='.$this->passord;
		$post .= '&ctl00$ucSearchBar$btnLogIn.x=1&ctl00$ucSearchBar$btnLogIn.y=1';
	curl_setopt($this->curl_session, CURLOPT_POSTFIELDS, $post);
	curl_setopt($this->curl_session, CURLOPT_COOKIEJAR, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_COOKIEFILE, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_FOLLOWLOCATION, 1);
	$memberpage = curl_exec($this->curl_session);

	//Sjekk at logginn var vellykket, hvis ikke skriv til logg
	if (!strpos($memberpage, '<fieldset class="innlogget">'))
	{
		$this->log('Kunne ikke logge inn bruker '.$this->bruker, true);
		return false;
	}

	//Lagre vellykket innlogging
	$this->log('Brukeren '.$this->bruker.' logget inn', false);
	$this->isAuthed = true;
	return true;
}

private function toUTF8Selective($string)
{
	return mb_convert_encoding($string, "UTF-8", mb_detect_encoding($string, "auto"));
}

public function sendSMS($nummer, $melding)
{
	if (!$this->isAuthed)
	{
		$this->log('Du kan ikke sende meldinger hvis du ikke er logget inn!', true);
		return false;
	}

	if (strlen($melding) > 127)
	{
		$this->log('En melding til '.$nummer.' ble delt opp i flere SMSer!', false);
		$chars = 0;
		$worked = true;
		while ($chars < strlen($melding))
		{
			if (!$this->sendSMS($nummer, substr($melding, $chars, 127)))
				$worked = false;
			$chars += 127;
		}
		return $worked;
	}

	//Henter send SMS form
	curl_setopt($this->curl_session, CURLOPT_URL, "http://www.1881.no/Ung1881/SMS/Send-SMS/");
	curl_setopt($this->curl_session, CURLOPT_RETURNTRANSFER, 1);
	$sendSMSpage = curl_exec($this->curl_session);
		//Hent inn hidden validation fields igjen
		preg_match('/ id="__VIEWSTATE" value="([^"]+)"/', $sendSMSpage, $tokens['viewstate']);
	$tokens['viewstate'] = $tokens['viewstate'][1];

	//Så poster vi meldingen
	curl_setopt($this->curl_session, CURLOPT_URL, "http://www.1881.no/Ung1881/SMS/Send-SMS/Post.aspx");
	curl_setopt($this->curl_session, CURLOPT_COOKIEJAR, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_COOKIEFILE, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($this->curl_session, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($this->curl_session, CURLOPT_POST, 1);
		$post =  '__VIEWSTATE='.urlencode($tokens['viewstate']);
		$post .= '&ctl00$MainContent$PageContentMain$txtReciever='.$nummer;
		$post .= '&ctl00$MainContent$PageContentMain$txtSmsText='.$this->toUTF8Selective($melding); 
		$post .= '&ctl00$MainContent$PageContentMain$btnNextSms.x=1&ctl00$MainContent$PageContentMain$btnNextSms.y=1';
	curl_setopt($this->curl_session, CURLOPT_POSTFIELDS, $post);
	$sendMsg = curl_exec($this->curl_session);


/*echo "<pre>";
var_dump(curl_getinfo($this->curl_session));
echo "</pre>";*/
//var_dump($sendMsg);


	//Så bekrefter vi meldingen
	curl_setopt($this->curl_session, CURLOPT_URL, "http://www.1881.no/Ung1881/SMS/Send-SMS/Post.aspx");
	curl_setopt($this->curl_session, CURLOPT_COOKIEJAR, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_COOKIEFILE, $this->cookiefil);
	curl_setopt($this->curl_session, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($this->curl_session, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($this->curl_session, CURLOPT_POST, 1);
		$post =  '__VIEWSTATE='.urlencode($tokens['viewstate']);
		$post .= '&ctl00$MainContent$PageContentMain$btnSendSms.x=1&ctl00$MainContent$PageContentMain$btnSendSms.y=1';
	curl_setopt($this->curl_session, CURLOPT_POSTFIELDS, $post);
	$sendMsg = curl_exec($this->curl_session);


//var_dump($sendMsg);

	//Sjekk at meldingen ble sendt
	preg_match('/<span id="_ctl0_MainContent_PageContentMain_lblError" class="error">([^\"]+)<\/span>/is', $sendMsg, $smsstatus);
	if (strpos($sendMsg, "<script>fade_in('smsSendt')</script>") === false)
	{
		$this->log('En meldingssending feilet for bruker '.$this->bruker.' med status: '.$smsstatus[1], true);
		return false;
	}

	$this->log('En melding ble sendt fra brukerkontoen '.$this->bruker.' til nummer: '.$nummer, false);
	return true;
}

public function sisteLoggmelding()
{
	return (empty($this->logger)?false:$this->logger[count($this->logger)]);
}

public function settDbConn($db, $tabell, $surpress = false)
{
	if (!mysql_query("SELECT * FROM $tabell WHERE melding = '' AND tid = 0 AND error = 0 AND uniqhash = ''", $db))
	{
		if (!$surpress)
			trigger_error("Den oppgitte kombinasjonen av databasetilkobling og tabell er ikke gyldig!", E_USER_WARNING);
		return false;
	}
	$this->dbconn = $db;
	$this->loggtable = $tabell;
	return true;
}

public function hentLogg($m = false, $y = false)
{
	$this->oppdaterLogg();
	if (!$this->dbconn)
	{
		trigger_error("Kunne ikke hente ut logg fra databasen, ingen tilkobling satt", E_USER_WARNING);
		return false;
	}

	$sql = "SELECT * FROM {$this->loggtable}";

	if ($m !== false && $y !== false)
	{
		$sql .= " WHERE tid > ".mktime(0, 0, 0, (int)$m, 1, $y)." AND tid < ".mktime(23, 59, 59, ((int)$m+1), 0, $y);
	}
	elseif ($m !== false)
	{
		$sql .= " WHERE tid > ".mktime(0, 0, 0, (int)$m, 1, date("Y"))." AND tid < ".mktime(23, 59, 59, ((int)$m+1), 0,  date("Y"));
	}
	elseif ($y !== false)
	{
		$sql .= " WHERE tid > ".mktime(0, 0, 0, 1, 1, $y)." AND tid < ".mktime(23, 59, 59, 12, 31,  $y);
	}

	$sql .= " ORDER BY tid ASC";

	$allLogEntries = mysql_query($sql, $this->dbconn);

	if(!$allLogEntries)
	{
		$this->log('DB Error: '.mysql_error().' ved bruk av følgende query "'.$sql.'"', 1, time());
	}

	$this->logger = array();
	while ($entry = mysql_fetch_array($allLogEntries))
	{
		$this->log($entry['melding'], $entry['error'], $entry['tid']);
	}

	return $this->logger;
}

public function hentSessionLogg()
{
	return $this->logger;
}

public function oppdaterLogg()
{
	if (!$this->dbconn)
	{
		trigger_error("Kunne ikke oppdatere databasen, ingen tilkobling satt", E_USER_WARNING);
		return false;
	}

	for ($i = 0; $i < count($this->logger); $i++)
	{
		mysql_query("INSERT IGNORE INTO {$this->loggtable} (melding, error, tid, uniqhash) VALUES ('".
			mysql_real_escape_string($this->logger[$i]['msg'])."', '".
			($this->logger[$i]['error']?1:0)."', '".
			$this->logger[$i]['time']."', '".
			sha1($this->logger[$i]['msg'].($this->logger[$i]['error']?1:0).$this->logger[$i]['time']).
			"')", $this->dbconn);
	}
}

public function createTable($db, $tblnme)
{
	if ($this->settDbConn($db, $tblnme, true))
	{
		return true;
	}

	$create =<<<EOF
CREATE TABLE $tblnme (
meldingsid INT UNSIGNED AUTO_INCREMENT,
melding TEXT,
tid INT UNSIGNED,
error TINYINT(1),
uniqhash TEXT,
PRIMARY KEY(meldingsid),
UNIQUE uniqhash (uniqhash(40))
)
EOF;
	$c = mysql_query($create, $db);
	if ($c)
	{
		$this->dbconn = $db;
		$this->loggtable = $tblnme;
		return true;
	}
	else
	{
		trigger_error("Kunne ikke opprette tabell!\n".mysql_error(), E_USER_WARNING);
		return false;
	}
}

function __destruct()
{
	curl_close($this->curl_session);
}
};

?>

 

Lenke til kommentar
  • 2 måneder senere...

For de som vil lage 2 veis SMS, så er tingen http://www.gammu.org/wiki/index.php?title=Main_Page Kjører i deamon med Mysql. Bare å koble opp en gammel mobil telefon, med f.eks fri familie, så kan man komunisere med maskinen over php. Krever så klart at man har serveren selv. kjører selv med gammelt option HSDPA kort... funker fett. legger bare inn meldinger i en tabell i databasen, også forsvinner de ut! samme med inngående.

Lenke til kommentar
  • 2 måneder senere...

Hei,

 

I og med at siste versjon av ung1881-scriptet ikke funker lenger, lurer jeg på om noen har klart å gjøre de endringer som trengs for å få den til å virke igjen? Det hadde vært VELDIG gledelig om det gikk an å få tak i dette "nye" scriptet! Har en online webkalender hvor utsending av sms vil være veldig viktig funksjon.

 

* Er det event. alternative sms-leverandører & script, som fungerer vs. norske mobilnumre?

* Hvis "ung1881"-scriptet kan tilpasses og brukes. Dette hadde vært veldig, veldig greit å få til:

Vanligvis, når mottaker får sms-meldingen - så står mitt mobilnr. som avsender. Er det mulig å få til at det står noe annet som "avsender-nr" - som f.eks. "Fra nettsiden"?

I firmaet jeg jobber i, har vi et eget "sms-program" (skrevet i Delphi) - hvor man kan få til nettopp dette... men her benytter vi en annen sms-leverandør (CoolSMS i Danmark).

 

-Takker for svar :yes:

Endret av koda95
Lenke til kommentar
  • 2 uker senere...
Finnes mange ulike leverandører av SMS-tjenester der ute. SMS-utsendelse er jo tross alt noe som fler og fler benytter, og som har vært temmelig populært i en lengre tid. Du kan jo f.eks. vurdere KeySMS fra arbeidsplassen min.

 

Hmm... det blir nok altfor dyrt for mitt vedkommende... Dette er tjenester tilpasset firmaer/bedrifter med langt større behov (i ant. sms'er) - og tykkere lommebok ;) enn meg...

 

For mitt vedkommende vil det aldri bli mer enn maks. 20-30 stk. sms i måneden..

Lenke til kommentar
  • 6 måneder senere...

For de av dere som fortsatt er interessert i dette så har jeg nå skrevet en klasse som lar deg bruke PHP som en nettleser ( trykke på lenker, submitte forms, etc.. ). Dette vil antageligvis gjøre det ganske mye lettere å ordne dette.. Har ikke tid til å skrive et nytt sendSMS script, men med hjelp av denne klassen så burde det være en veldig smal sak.

 

Klassen ligger på PHP Classes: http://www.phpclasses.org/browse/package/5450.html

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...