Datei bei falschem Referrer umbenennen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Datei bei falschem Referrer umbenennen

Beitrag von mgutt »

Ich habe eine Idee, die wahrscheinlich etwas schwieriger umzusetzen sein wird.

Ich möchte, wenn jemand einen Downloadlink von meiner Seite "stiehlt" und bei seiner Seite einbindet die betroffene Datei umbennen. (.htaccess geht nicht gegen bei: rechte Maustaste -> speichern unter...)

Nun, da die Datei direkt angewählt wird, ohne über eine php-Datei zu gehen ist es natürlich schwer dann noch etwas herauszufinden.

Hier helfen mir also nur die Logdateien.

Wenn also eine Datei "video_345.mpg" von einem fremden Referrer aufgerufen wurde, dann möchte ich, dass die Datei umbenannt wird in "video_675.mpg" und in der Datenbank der neue Dateiname aktualisiert wird.

Tatsächlich habe ich etwas ähnliches schon geschrieben:
http://www.phpbb.de/viewtopic.php?t=111684

Aber hier habe ich das Problem, dass sich die Position der Information leider immer ändert, wenn ich es über die Webalizerseite auslesen wollte.

Kann man logdateien ganz normal "includen"?

Wie denkt ihr könnte ich eine einfache Lösung für das Problem programmieren?
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Weiß jemand wie man eine eingelesene Datei filtert wie folgt:
....
....
....
....
Top 10 von 254066 URLs sortiert nach kb

# Anfragen kb URL

1 8711 0.06% 33959654 6.29% /files/leaf_blower_166.wmv
2 885 0.01% 31161061 5.77% /files/encoded-promo-reel-omniman_159.wmv
3 1239 0.01% 24307050 4.50% /files/vtecmagic1_114.wmv
4 8123 0.05% 24242590 4.49% /files/help_tv_alkohol_spot_172.wmv
5 3123 0.02% 16185021 3.00% /files/634whp_delsol_172.wmv
6 1410 0.01% 10485879 1.94% /files/assi_astra_188.wmv
7 1332 0.01% 10086723 1.87% /files/hdmmotorsports_130.wmv
8 1671 0.01% 10047485 1.86% /files/256-whp-civic-eg_430.wmv
9 3891 0.03% 9586152 1.78% /files/illegal_street_racing_1150bhp_nissan_skyline_on_street_699.wmv
10 517862 3.35% 8135623 1.51% /forum.php
....
....
....
....
Das "URLs sortiert nach kb" ist einmalig auf der Seite und ich dachte ich könnte das irgendwie als Anhaltspunkt nehmen.

Dann würde ich die Url auslesen und sobald ich die habe, benenne ich die Datei einfach um. (das bekomme ich selber hin)

Datei einlesen:

Code: Alles auswählen

$_kbarray = file('usage/monatXYZ.html');
Nur wie lösche ich dann aus diesem Array alle vor dem Element mit dem Inhalt "URLs sortiert nach kb" und lasse mir beispielsweise die nächsten 10 Zeilen ausgeben? (die kann ich dann selber wieder zerstückeln, um die Url herauszubekommen)

Bei andere Werte habe ich einfach per:

Code: Alles auswählen

$kbwert = trim($_kbarray[56]);
die Zeile angesprochen, die ich brauchte, aber auf der jetzt einzulesenden Seite ändert sich leider immer die Reihenfolge. :-?

Übrigens mein anderer Mod ist schon sehr erfolgreich zum Einsatz gekommen, falls das jemand interessiert:
[ externes Bild ]

Dort habe ich erst den Gesamttraffic ausgelesen und ab da, wo der Pfeil ist, wurde ein von mir vorgegebenes Limit übertreten und der Zugriff auf gewisse Downloads verboten. Wie man sieht fällt der verbrauchte KB-Wert dann sofort in den Keller :D
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
chriss713
Mitglied
Beiträge: 229
Registriert: 06.06.2005 14:06

Beitrag von chriss713 »

Schreib Dir alles, was nach der Zeile mit "URLs sortiert nach kb" kommt in ein zweites Array und arbeite damit weiter.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

d.h. schleife und andauernd false bis in array "URLs sortiert nach kb" enthalten ist und dann?

wie lasse ich die schleife weiter laufen?

Sollte ich zur Suche "in_array" verwenden?
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
chriss713
Mitglied
Beiträge: 229
Registriert: 06.06.2005 14:06

Beitrag von chriss713 »

Ungetestet, "quick & dirty"...

Code: Alles auswählen

$newarray = array();
$matchline = 0;

for ($i = 0; $i < count($_kbarray); $i++)
{
   if (strstr($_kbarray[$i], 'URLs sortiert nach kb')
   {
      $matchline = $i;
   }
   if ($i >= $matchline)
   {
      $newarray = array_push($newarray, $_kbarray[$i]);
   }
}
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

ein wenig modifiziert: (array_push sollte man keiner variablen zuweisen und auf keinen fall der gleichen, die befüllt wird = Fehler und die If Abfrage zu matchline war andersherum)

Code: Alles auswählen

$_kbarray = file('usage/usage_200603.html');
$newarray = array();
$matchline = 0; 

for ($i = 0; $i < count($_kbarray); $i++) 
{ 
   if ( strstr($_kbarray[$i], 'URLs sortiert nach kb') )
   { 
      $matchline = $i;
   }
   if ($matchline >= $i)
   {
      array_push($newarray, $_kbarray[$i]);
   }
}
print_r($newarray);
Das Problem ist, dass beim Erfüllen der Bedingung die Schleife von vorne beginnt und matchline, dann wieder Null ist.

Sollte man dann zwei for-Schleifen verschachteln? Ich mache es einfach mal.

EDIT:

Also mit einer Konstante gehts:

Code: Alles auswählen

$_kbarray = file('usage/usage_200603.html');
$newarray = array();

for ($i = 0; $i < count($_kbarray); $i++)
{
   if ( strstr($_kbarray[$i], 'URLs sortiert nach kb') )
   {
      define('MATCHLINE', TRUE);
   }
   if ( defined('MATCHLINE') )
   {
		array_push($newarray, $_kbarray[$i]);
   }
}
print_r($newarray);
Die ist ja dann auch Global. Nur die Frage wie sinnvoll das ist?!

EDIT2:
Ok ich konnte es noch simpler lösen. Da bei mir nur "wmv" erstmal wichtig ist, mache ich es so:

Code: Alles auswählen

$_kbarray = file('usage/usage_200603.html');
$newarray = array();

for ($i = 0; $i < count($_kbarray); $i++)
{
   if ( strstr($_kbarray[$i], '.wmv') )
   {
		array_push($newarray, $_kbarray[$i]);
   }
}
print_r($newarray);
Dadurch bekomme ich genau die Dateinamen, die ich brauche und sonst nichts. :D

EDIT3:

Code: Alles auswählen

<?php
/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

// Files & Variables of phpBB
define('IN_PHPBB', true); 
$phpbb_root_path = './'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 
//
// End session management

$_kbarray = file('usage/usage_200603.html');
$newarray = array();

for ($i = 0; $i < count($_kbarray); $i++)
{
   if ( strstr($_kbarray[$i], '.wmv') )
   {
		$_kbarray[$i] = trim(strip_tags($_kbarray[$i]));
		array_push($newarray, $_kbarray[$i]);
   }
}
// $newarray enthält nun die zu ändernden Dateinamen inkl. "files/"

for ($i = 0; $i < count($newarray); $i++)
{
	echo("Wir beginnen mit Datei $newarray[$i]:<br />");
	if ( is_file($newarray[$i]) ) // ist die Datei überhaupt im Ordner "files/" vorhanden?
	{
		$old_filename = basename($newarray[$i],".wmv");
		//
		// Go ahead and pull all data for this video
		//
		$sql = "SELECT real_filename, extension
			FROM phpbb_attachments_desc
			WHERE physical_filename = $old_filename";
		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, "Could not obtain video information.", '', __LINE__, __FILE__, $sql);
		}
		// Did the query return any data?
		if ( $videorow = $db->sql_fetchrowset($result) )
		{
			$db->sql_freeresult($result);
			$new_filename = $videorow['real_filename'] . '_' . substr(rand(), 0, 3) . '.' . $videorow['extension'];
			$renamefile = rename($newarray[$i], '/files/' . $new_filename);
			if ($renamefile)
			{
				echo("$newarray[$i] ($old_filename) konnte erfolgreich in $new_filename umbenannt werden.<br />");
				//
				// Update the filename
				//
				$sql = "UPDATE phpbb_attachments_desc
				    SET physical_filename = $new_filename
					WHERE physical_filename = $old_filename";
				if ( !($result = $db->sql_query($sql)) )
				{
					message_die(GENERAL_ERROR, 'Could not update filename in database!', '', __LINE__, __FILE__, $sql);
				}
				else
				{
					echo("$new_filename wurde erfolgreich in der Datenbank gespeichert!<br /><br />");
				}
				$db->sql_freeresult($result);
			}
			else
			{
				echo("$newarray[$i] ($old_filename) konnte nicht in $new_filename umbenannt werden! (Fehler)<br />");
			}
		}
		else
		{
			echo("$newarray[$i] ($old_filename) wurde nicht in der Datenbank gefunden!<br /><br />");
		}
	}
	else
	{
		echo("$newarray[$i] ($old_filename) - Kein Update notwendig bzw. Datei nicht im Ordner \"files/\" gefunden.<br /><br />");
	}
}

?>
"is_file" will nicht wie ich will :cry:

EDIT4:

Code: Alles auswählen

<?php
/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

// Files & Variables of phpBB
define('IN_PHPBB', true); 
$phpbb_root_path = '../'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 
//
// End session management

$_kbarray = file($phpbb_root_path . 'usage/usage_200603.html');
$newarray = array();

for ($i = 0; $i < count($_kbarray); $i++)
{
   if ( strstr($_kbarray[$i], '.wmv') )
   {
		$_kbarray[$i] = trim(strip_tags($_kbarray[$i]));
		array_push($newarray, "files/" . basename($_kbarray[$i],".wmv") . ".wmv"); // ein kleiner Trick um den Schrägstrich vor "files" wegzubekommen :D
   }
}
// $newarray enthält nun die zu ändernden Dateinamen inkl. "files/"
//print_r($newarray);

for ($i = 0; $i < count($newarray); $i++)
{
	echo("Wir beginnen mit Datei $newarray[$i]:<br />");
	if ( is_file($phpbb_root_path . $newarray[$i]) ) // ist die Datei überhaupt im Ordner "files/" vorhanden?
	{
		echo("Die Datei ist vorhanden...<br />");
		$old_filename = basename($newarray[$i]);
		//
		// Go ahead and pull all data for this video
		//
		$sql = "SELECT real_filename, extension
			FROM phpbb_attachments_desc
			WHERE physical_filename = '" . $old_filename . "'
			LIMIT 1";
		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, "Could not obtain video information.", '', __LINE__, __FILE__, $sql);
		}
		// Did the query return any data?
		if ( $videorow = $db->sql_fetchrow($result) )
		{
			$new_filename = basename($videorow['real_filename'], ".wmv") . '_' . substr(rand(), 0, 3) . '.' . $videorow['extension'];
			$renamefile = rename($phpbb_root_path . $newarray[$i], $phpbb_root_path . 'files/' . $new_filename);
			if ($renamefile)
			{
				echo("Die Datei konnte erfolgreich in $new_filename umbenannt werden...<br />");
				//
				// Update the filename
				//
				$sql = "UPDATE phpbb_attachments_desc
				    SET physical_filename = '" . $new_filename . "'
					WHERE physical_filename = '" . $old_filename . "'";
				if ( !($result = $db->sql_query($sql)) )
				{
					message_die(GENERAL_ERROR, 'Could not update filename in database!', '', __LINE__, __FILE__, $sql);
				}
				else
				{
					echo("Die Datei wurde erfolgreich in der Datenbank gespeichert...<br /><br />");
				}
			}
			else
			{
				echo("Die Datei konnte nicht in $new_filename umbenannt werden! (Fehler)<br /><br />");
			}
		}
		else
		{
			echo("Die Datei wurde nicht in der Datenbank gefunden! (Fehler)<br /><br />");
		}
	}
	else
	{
		echo("Die Datei befindet sich nicht im Ordner \"files/\"!<br /><br />");
	}
}

?>
So es klappt nun soweit. Die Datei liegt nun geschützt im ACP-Verzeichnis und kann per Cronjob einmal in der Woche aufgerufen werden.

Nett wäre jetzt am Ende noch den Inhalt der Seite per Email zu bekommen :D

Jetzt mache ich mich noch ran, dass das Script automatisch die neueste Statistikseite wählt. (also für jeden Monat aufs neue usage_200603.html, usage_200604.html.... usage_200701.html ... usw.)
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Antworten

Zurück zu „Coding & Technik“