webForumDet fria alternativet

Hämta TV tablån och visa på min sida

ASPur ASP

24 svar · 1 146 visningar · startad av mattiasnordin

Medlem sedan maj 20012 080 inlägg
Frågan#1

Hej hopp...

Jag har sett olika applikationer och websidor som hämtar information om TV-program, väder och nyheter från olika websidor. Hur går det till?

Tex kör jag ett färdigt Samurize skript som visar vad som går på tv just nu. Mycket trevligt. Skulle vilja ha det så på min hemsida :)

Medlem sedan maj 20012 080 inlägg
#2

Nedan är javascriptet som används i mitt Samurize skrivbord. Går det att exekvera detta på en ASP sida? Hur anropar man skriptet?

/*****************************************************************************************\
|                           This GetTVscript is written by kael                           |
\*****************************************************************************************/
var showTime = true				;// Option to show the time in the output (true or false)
var timeDelimiter = ":"				;// Option what to separate hours and minutes with(":" "." or what you want)
var timeProgramSeparator = " "			;// Option what to separate time and program with
var noProgramYet = "Inget program"		;// The text showing when there are no program yet
var noProgramNow = "Sändningsuppehåll"		;// The text showing when there are no program right now
var noProgramEnd = "Sändningsslut"		;// The text showing when there are no program any more

//To use multiple lines in output, edit this function for your pleasure ("\r\n" is a new line)
/* // and remove this line
function GetMyTV()
{
	return "SVT1: "+GetSVT1()+"\r\n"+"SVT2: "+GetSVT2()+"\r\n"+"TV3:   "+GetTV3()+"\r\n"+"TV4:   "+GetTV4();
}
*/ // and this one

function GetSVT1() { return GetTV_(21, 0); }
function GetBarSVT1() { return GetBar_(21); }
function GetNextSVT1() { return GetTV_(21, 1); }
function GetSVT2() { return GetTV_(22, 0); }
function GetBarSVT2() { return GetBar_(22); }
function GetNextSVT2() { return GetTV_(22, 1); }
function GetTV3() { return GetTV_(26, 0); }
function GetBarTV3() { return GetBar_(26); }
function GetNextTV3() { return GetTV_(26, 1); }
function GetTV4() { return GetTV_(27, 0); }
function GetBarTV4() { return GetBar_(27); }
function GetNextTV4() { return GetTV_(27, 1); }
function GetKanal5() { return GetTV_(10, 0); }
function GetBarKanal5() { return GetBar_(10); }
function GetNextKanal5() { return GetTV_(10, 1); }
function GetViasatActionNature() { return GetTV_(28, 0); }
function GetBarViasatActionNature() { return GetBar_(28); }
function GetNextViasatActionNature() { return GetTV_(28, 1); }
function GetZTV() { return GetTV_(42, 0); }

function GetTV_(channel, count)
{
	var txt = GetPage_(channel);
	if(txt.substr(0,5)=="Error") return txt;

	try
	{

		var now = -1;
		var lines = txt.split("\r\n");
		for(var i=lines.length-2;i>=0;i--)
		{
			var time = lines[i].substring(0,5);
			_time = new Date();

			if((parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2)))<6) _time.setHours(parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2))+18,parseInt(time.substring(3,4))*10 + parseInt(time.substring(4,5)),0,0);
			else _time.setHours(parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2))-6,parseInt(time.substring(3,4))*10 + parseInt(time.substring(4,5)),0,0);

			_now = new Date();
			if(_now.getHours()<6) _now.setHours(_now.getHours()+18);
			else _now.setHours(_now.getHours()-6);

			if(_time<_now)
			{
				now = i;
				break;
			}
		}

		if((now+count>=0) && (now+count<=lines.length-2))
			return lines[now+count];
		else
			return noProgramYet;
	}
	catch(e)
	{
		return "Error parsing file";
	}
}

function GetBar_(channel)
{
	var txt = GetPage_(channel);
	if(txt.substr(0,5)=="Error") return txt;

	try
	{

		var now = -1;
		var lines = txt.split("\r\n");
		for(var i=lines.length-2;i>=0;i--)
		{
			var time = lines[i].substring(0,5);
			_time = new Date();

			if((parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2)))<6) _time.setHours(parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2))+18,parseInt(time.substring(3,4))*10 + parseInt(time.substring(4,5)),0,0);
			else _time.setHours(parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2))-6,parseInt(time.substring(3,4))*10 + parseInt(time.substring(4,5)),0,0);

			_now = new Date();
			if(_now.getHours()<6) _now.setHours(_now.getHours()+18);
			else _now.setHours(_now.getHours()-6);

			if(_time<_now)
			{
				now = i;
				break;
			}
		}

		if(now<0 || now>=(lines.length-2))
			return 0;

		var time1 = lines[now].substring(0,5);
		var time1h = time1.substring(0,2);
		var time1m = time1.substring(3,5);
		var time2 = lines[now+1].substring(0,5);
		var time2h = time2.substring(0,2);
		var time2m = time2.substring(3,5);
		if(time1h<6) time1h=time1h*1+18; else time1h-=6;
		if(time2h<6) time2h=time2h*1+18; else time2h-=6;

		
		var totalmins = (time2h-time1h)*60+(time2m-time1m);
		var runningminutes = (_now.getHours()-time1h)*60+(_now.getMinutes()-time1m)
		return runningminutes/totalmins*100;
	}
	catch(e)
	{
		return "Error parsing file";
	}
}

function GetPage_(channel)
{
	try
	{
		var fs = new ActiveXObject("Scripting.FileSystemObject");
	
		try
		{
			var file=fs.GetSpecialFolder(2)+"\\"+channel+".tv";
	
			if(fs.FileExists(file))
			{
				var f=fs.GetFile(file);
				var filetime = new Date(f.DateLastModified);
				var now = new Date();
				var timeToDownload = new Date();
				timeToDownload.setHours(6,15,0);
				if(timeToDownload>now || filetime>timeToDownload)
				{
						var filen = f.OpenAsTextStream(1);
						var txt = filen.ReadAll();
						filen.Close();
						return txt;
				}
			}
		}
		catch(e)
		{
			return "Error reading from file";
		}
		finally
		{
			delete filetime;
			delete now;
			delete timeToDownload;
		}
		
	
		try
		{
			var http = new ActiveXObject("Microsoft.XMLHTTP");
			http.Open("GET","http://www.dagenstv.com/se/chart/?cha="+channel+"&"+Math.random(),false);
			http.send();
			var html = fixHTMLcodes_(http.responseText);
		}
		catch(e)
		{
			return "Error downloading page";
		}
		finally
		{
			delete http;
		}
	
		try
		{
			var start = "\r\n							<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
			var stop = "</table>";
			html = html.substr(html.indexOf(start)+start.length+50);
			html = html.substr(0,html.indexOf(stop));
			
			var txt="";
			var lines = html.split("\r\n										<tr>");

			var endtime="";
			for(var i=0;i<lines.length;i++)
			{
				var time = lines[i].substr(lines[i].indexOf(">")+1,5);
				var program = lines[i].substr(lines[i].indexOf("charteventname")+30);
				program = program.substr(0,program.indexOf("<"));
	
				if(program.indexOf("\r\n")!=-1)
					program = program.substr(0,program.indexOf("\r\n"));
				
				if(endtime!="")
				{
					var _endtime = new Date();
					_endtime.setHours(parseInt(endtime.substring(0,1))*10 + parseInt(endtime.substring(1,2)),parseInt(endtime.substring(3,4))*10 + parseInt(endtime.substring(4,5)),0,0);
					var _time = new Date();
					_time.setHours(parseInt(time.substring(0,1))*10 + parseInt(time.substring(1,2)),parseInt(time.substring(3,4))*10 + parseInt(time.substring(4,5)),0,0);
					if(_endtime<_time)
					{
						if(showTime)
							txt+=endtime.substring(0,2)+timeDelimiter+endtime.substring(3,5)+timeProgramSeparator;
						txt+=noProgramNow+"\r\n";
					}
				}
				
				endtime = lines[i].substr(lines[i].indexOf("</span> (")+9,5);
				if(endtime.substr(2,1)!=":")
					endtime = "";
				
				if(showTime)
					txt+=time.substring(0,2)+timeDelimiter+time.substring(3,5)+timeProgramSeparator;
				txt+=program+"\r\n";
			}
	
			if(endtime!="")
			{
				var _endtime = new Date();
				_endtime.setHours(parseInt(endtime.substring(0,1))*10 + parseInt(endtime.substring(1,2)),parseInt(endtime.substring(3,4))*10 + parseInt(endtime.substring(4,5)),0,0);
				var _time = new Date();
				_time.setHours(5,59,0);
				if(_endtime<_time)
				{
					if(showTime)
						txt+=endtime.substring(0,2)+timeDelimiter+endtime.substring(3,5)+timeProgramSeparator;
					txt+=noProgramEnd+"\r\n";
				}
			}
		}
		catch(e)
		{
			return "Error parsing page";
		}
	
		try
		{
			var file=fs.CreateTextFile(file,true);
			file.Write(txt);
		}	
		catch(e)
		{
			return "Error writing to file";
		}
		finally
		{
			file.Close();
		}
	}
	catch(e)
	{
		return "Error creating FileSystemObject";
	}
	finally
	{
		delete fs;
	}
	return txt;

}

function fixHTMLcodes_(str)
{
	str = str.replace(/&aring;/g, "å");
	str = str.replace(/&auml;/g, "ä");
	str = str.replace(/&ouml;/g, "ö");
	//REDIGERAT BORT EN MASSA RADER HÄR - MATTias

	return str;
}
Medlem sedan nov. 20017 144 inlägg
#3

Jösses vilken lång kod. ;)

Response.Write "<b>På TV just nu:</b><br>"

Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", "http://tvprogram.nu/cgi-tvprogram/tvfix.cgi?NU", False

objHTTP.Send
strHTML=objHTTP.responseText
Set objHTTP = Nothing

Set regExp = New regexp
regExp.Global = false
regExp.IgnoreCase = false
regExp.Pattern = "<TABLE cellspacing=0 cellpadding=0 width=""100%"">.*</table>"
Set hittade = regExp.Execute(strHTML)

Function makeOutput(str)
	Set regExp = New regexp
	regExp.Global = true
	regExp.IgnoreCase = true
	regExp.Pattern = "<img (.*?)>"
	str = regExp.Replace(str, "")
	regExp.Pattern = "<a href=""javascript:(.*?)><u>(.*?)</u></a>"
	str = regExp.Replace(str, "$2")

         'För att ta bort beskrivande text -> kommentera av de nedre raderna

	'regExp.Pattern = "<font face=""Verdana, Helvetica, Arial"" size=""1"">(.*?)</font>"
	'str = regExp.Replace(str, "")
    MakeOutput = str
End Function 

For each item in hittade
	Response.Write(makeOutput(item.value))
Next

Tänk på att ta bort mellanrummet i java script

Medlem sedan maj 20012 080 inlägg
#4

Helt fantastiskt kul !

Kul teknik. Måste lära mig mer om detta. :)

Finns det något enkelt sätt att få ut de två kommande programmen också?

Typ:

SVT1 nu 10:00 fdsjkfjdskhf
SVT1 nästa 12:00 dfsfdsfdsf
SVT1 nästa 12:30 fsdfdsfsdf

Medlem sedan nov. 20017 144 inlägg
#5

Nej, ifrån den sidan verkar det inte fungera.
Men det kanske finns andra sidor där man kan norpa roliga saker ifrån.
Kolla runt lite.

Medlem sedan maj 20012 080 inlägg
#6

Det måste vara möjligt från http.Open("GET","http://www.dagenstv.com/se/chart/?cha="+channel+"&"+Math.random(),false);

Min samurize visar nämligen den vyn och den använder sig av scriptet ovan. hmm...

Medlem sedan nov. 20017 144 inlägg
#7

Men där får du bara en kanal i taget.

Medlem sedan maj 20012 080 inlägg
#8

Kan man inte lösa det med funktioner som plockar ut just de kanalerna som är intressant för dig?

Medlem sedan nov. 20017 144 inlägg
#9

Asså, får du lillfingret så tar du hela armen. ;)
Visst, tror bara att det kommer att bli en aning prestandakrävande.

Medlem sedan maj 20012 080 inlägg
#10

he he... självklart ;)

Jag ska labba lite när jag kommer hem. Är det riktigt att det man igentligen gör i skriptet är att ta hem hela sidan och "skalar" ut det man är intresserad av?!

Medlem sedan maj 20012 080 inlägg
#11

Vad betyder (.*?)

Finns det någon bra sida där man kan läsa om regExp ?

Medlem sedan apr. 20031 660 inlägg
#12

HEJ!

mattiasnordin skrev:

Finns det någon bra sida där man kan läsa om regExp ?

http://www.devguru.com/Technologies/vbscript/quickref/regexp.html
http://www.devguru.com/Technologies/vbscript/quickref/RegExp_pattern.html

Medlem sedan maj 20012 080 inlägg
#13

Jag försöker att köra JesperT koden fast på en annan sida och förstår att jag måste börja på ruta 1.

Är det någon som kan visa mig hur ett minimumexempel kan se ut. Det jag är ute efter är att plocka ut ett parti ur en websida. Jag förstår inte riktigt hur urvalen fungerar?

Mitt labb:

<%
Response.Write "<b>Test av mattias</b><p>"

Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", "http://mattiasnordin.net", False

objHTTP.Send
' GÖR EN STRÄNG AV HELA SIDANS SOURCE
strHTML=objHTTP.responseText
Set objHTTP = Nothing

Set regExp = New regexp
' VAD BETYDER GLOBAL ???
regExp.Global = false
regExp.IgnoreCase = false
' HMMM... FÖRSÖKER HÄMTA ALLT SOM LIGGER I TABELLER
regExp.Pattern = "<table height=180 width=220>(.*?)</table>"
' HUR SORTERAR MAN BORT DET SOM INTE MATCHAR ENLIGT OVAN ?
varResultat = regExp.Replace(strHTML, "")
%>

<hr><hr>
<%=varResultat%>
<hr><hr>

... som returnerar typ allt :(

Medlem sedan nov. 20017 144 inlägg
#14

Det gäller att hitta olika hållpunkter i innehållet som skall användas.
En hållpunkt kan tex. vara en kommentar i koden

<!-- Center Content start -->
innehåll
<!-- Center Content end -->

För att plocka ut det som står mellan kommentarerna nu så använder du ett pattern typ:

<!-- Center Content start -->(.*?)<!-- Center Content end -->

-"' VAD BETYDER GLOBAL ???" Allt eller överallt (Tänk på jordgloben)
Alltså är Global satt till true så kommer allt som din pattern hittar visas. Är den false så hämtas bara den första.

-"<table height=180 width=220>(.*?)</table>"
Det är viktigt att det du skall hämta ser exakt ut så här när du använder detta mönster.

Sedan kan du använda funktionen som jag hade med i mitt första inlägg.

I det fallet så plockar den bort alla bilder, sedan så plockar den bort alla javascript-länkar eftersom att du inte kommer att ha användning av dem. Men då vill du såklart ändå ha kvar det som står mellan länktaggarna.
Det gör du genom att använda $1,$2,$3 osv. som hänvisar till de olika grupperingarna (omsluts av parenteser) $1 är den första osv.

Vide har skrivit en bra artikel om detta. Det kan du läsa om här

Han har även en regexp-tester som är bra när man skapar patterns. (Jag avänder den flitigt)

Medlem sedan juni 20019 024 inlägg
#15

Tänk bara på att tv-bolagen kommer (garanterat) att ha invändningar.

Lägg därför inte allt för stor vikt vid tv-tablån. Det funkar säkert några veckor, men sedan blir de kinkiga.

Medlem sedan maj 20012 080 inlägg
#16

Bra beskrivning Jesper T ! :)

Nu är jag på gång. Wides regexp tester var väldigt tacksam att använda sig av om man vill lära sig mera.

Men jag får inte till en fråga som även klarar av en radbrytning. Hur gör man detta ?

<span class=(.*?)</span>
<br><br><span class="past">
0600<img border="0" src="i.gif">Gomorron Sverige<br>0930</span>

Ovan har jag inte fått att fungera alls...

<br><br><span class="past">0600<img border="0" src="i.gif">Gomorron Sverige<br>0930</span>

Fungerar utmärkt.

Hmmm...

Tänk bara på att tv-bolagen kommer (garanterat) att ha invändningar.

Antagligen. Jag är mest intresserad av att lära mig hur man gör :)

Medlem sedan maj 20012 080 inlägg
#17
<%
Response.Write "<b>Test av mattias</b><p>"

Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", "http://www.tv.nu", False	' Hämtar hela websidan. VAD GÖR FALSE ???
objHTTP.Send
strHTML=objHTTP.responseText				' GÖR EN STRÄNG AV HELA SIDANS SOURCE

Set regExp = New regexp
regExp.Global = true 						' True visar alla. False visar första träffen.
regExp.IgnoreCase = true 					' Bryr sig inte om gemaner/versaler
regExp.Pattern = "<img (.*?)>"				' Letar efter alla bilder
strHTML = regExp.Replace(strHTML, "  ")		' Ersätter alla bilder med ""
regExp.Pattern = "<a href=.javascript:(.*?)\n*<br><br>"

Set hittade = regExp.Execute(strHTML)

For each item in hittade
	Response.Write(item.value)
Next
%>

<hr><hr><h1>
HÄMTADE SIDAN SER UT SÅ HÄR:<p>
<%=strHTML%>
<hr><hr>

Denna kod returnerar alla dagens program och samtliga kanaler. Spännade det här... :)

Men nu återstår

  1. Att försöka ta bort länkarna
  2. Försöka reducera antalet så att de bara visar de tre tidigaste. Kan det vara vettigt att försöka få in datan i en array eller ska man labba ytterligare med regexp?

:) :)

Medlem sedan maj 20012 080 inlägg
#18

Jag tackar alla inblandade för hjälpen. Nu har jag fått en bra grundkurs i hur regexp fungerar!

Nedan returnerar det som är på TV just nu och vad de två nästkommande programmen är.

Användes på eget ansvar. Antagligen får man inte använda detta utan tillstånd från www.tv.nu. Jag har gjort skriptet i utbildningssyfte.

<%
' REGEXP TEST AV MATTIAS NORDIN
' FÖRSÖKER HÄMTA EN DEL AV INNEHÅLLET PÅ EN ANNAN WEBSIDA. I DETTA FALL [url]www.tv.nu[/url]

Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.Open "GET", "http://www.tv.nu", False	' Hämtar hela websidan. VAD GÖR FALSE ???
objHTTP.Send
strHTML=objHTTP.responseText				' GÖR EN STRÄNG AV HELA SIDANS SOURCE

Set regExp = New regexp
regExp.Global = true 						' True visar alla. False visar första träffen.
regExp.IgnoreCase = true 					' Bryr sig inte om gemaner/versaler
regExp.Pattern = "<img (.*?)>"				' Letar efter alla bilder
strHTML = regExp.Replace(strHTML, "  ")		' Ersätter alla bilder med ""
regExp.Pattern = "<a href=.javascript:(.*?)\n*<br><br>"

Set hittade = regExp.Execute(strHTML)
dim myOnTvArray(100)				' HUR KONTROLLERAR JAG HUR MÅNGA OBJEKT SOM ÄR FUNNA ???
myCounter = 0
For each item in hittade
	myOnTvArray(myCounter) = item.value
'	Response.Write "Hittade en träff vid position "&item.FirstIndex&", som är "&item.Length&" tecken lång"
'	Response.Write(item.value)
	myCounter = myCounter +1
Next%>

<% ' Skapar ett index över kanalerna 
myChannelNameArray = array("SVT 1", "SVT 2", "TV3", "TV4", "Kanal 5", "TV 8", "TV6", "ZTV", "ViaSat Sport", "Eurosport", "Discovery MIX", "Discovery", "National", "Hallmark", "TV1000", "Action", "Canal +", "C+ Film 1", "C+ Film 2 ")%>

<% function funReturnSmallFixedList(varOnTvString) 				' Anropas med funReturnSmallFixedList(myOnTvArray(NUM)
varPosition1 = inStr(varOnTvString, "<br>") 					' Letar efter positionen på första <br>
varPosition2 = inStr(varPosition1+1, varOnTvString, "<br>") 	' Letar efter positionen på andra <br>
varPosition3 = inStr(varPosition2+1, varOnTvString, "<br>") 	' Letar efter positionen på tredje <br>
varFixedOnTvString = left(varOnTvString, varPosition3-1) 		' Klipper bort allt efter tredje <br>
regExp.Pattern = "<a href=(.*?)>(.*?)</a>" 						' Letar efter alla länkar
varFixedOnTvString = regExp.Replace(varFixedOnTvString, "$2") 	' Ersätter alla länkar med resultatet från andra ()
regExp.Pattern = "</span>" 										' Letar efter lite skräp som lämnats kvar
varFixedOnTvString = regExp.Replace(varFixedOnTvString, "") 	' Tar bort span skräpet
funReturnSmallFixedList = varFixedOnTvString 
end function %>

<h1>OUTPUT:</h1><p>
<% for i = 0 to myCounter -1%>
	<b><%=myChannelNameArray(i) %></b><br>  <%=funReturnSmallFixedList(myOnTvArray(i))%>
	<br><br>
<% next %>
Medlem sedan juli 2002423 inlägg
#19

får inte detta att funka
den visar ingenting för mig mer än OUTPUT

men det scriptet över som visar hela sidan fungerar utmärkt!!!

Medlem sedan maj 20012 080 inlägg
#20

Jag har en nyare version på:
http://mattiasnordin.net/web2005/forum/default.asp?C=3
Tyvärr måste du registrera dig... För koden har hamnat under "enbart för medlemmar" ;)

152 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
149 ms — hämta tråd, inlägg och bilagor (db)