воскресенье, 1 сентября 2013 г.

Функция определения браузера пользователя


Функция определения браузера пользователя, с поправкой на Opera


function get_user_browser($agent) {
preg_match("/(MSIE|Opera|Firefox|Chrome|Version|Opera Mini|Netscape|Konqueror|SeaMonkey|Camino|Minefield|Iceweasel|K-Meleon|Maxthon)(?:\/| )([0-9.]+)/", $agent, $browser_info);
list(,$browser,$version) = $browser_info;
if (preg_match("/Opera ([0-9.]+)/i", $agent, $opera)) return 'Opera '.$opera[1];
if ($browser == 'MSIE') {
preg_match("/(Maxthon|Avant Browser|MyIE2)/i", $agent, $ie);
if ($ie) return $ie[1].' based on IE '.$version;
return 'IE '.$version;
}
    if ($browser == 'Firefox') {
preg_match("/(Flock|Navigator|Epiphany)\/([0-9.]+)/", $agent, $ff);
if ($ff) return $ff[1].' '.$ff[2];
}
if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5);
if ($browser == 'Version') return 'Safari '.$version;
if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko';
return $browser.' '.$version;
}

 // или
function user_min_browser($agent) {
preg_match("/(MSIE|Opera|Firefox|Chrome|Version)(?:\/| )([0-9.]+)/", $agent, $browser_info);
list(,$browser,$version) = $browser_info;
if ($browser == 'Opera' && $version == '9.80') return 'Opera '.substr($agent,-5);
if ($browser == 'Version') return 'Safari '.$version;
if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko';
return $browser.' '.$version;
}

bash скрипт использующий API вконтакте без авторизации


bash скрипт использующий API ВК без авторизации:

#!/bin/bash

sys_version="0.3b"
sys_method='audio.search'
sys_temp='/tmp'

vkapi_secret='dTckAoaSzH'
vkapi_appid='1696393'
vkapi_id="5807425"

cfg_save_to="$HOME"
cfg_new_playlist='1'
cfg_write_tags='0'
cfg_search_count='300'
cfg_mplayer='/usr/bin/mplayer -playlist'
cfg_wget="/usr/bin/curl -#"
cfg_mode='play'
######################################################

Info() {
 echo "[$(date +%k:%M:%S)] $1"
 [ "$2" == "die" ] && exit 1
}

ShowHelp() {
 echo  "VKSearch $sys_version: Поиск, прослушивание и закачка музыки с сайта VKontakte.ru!"
 echo "Для работы скрипта не требуется авторизация ВКонтакте. by snoopcatt, © 2010-2011. Лицензировано под GNU GPL v2."
 echo -e "* Использование: vksearch [опции] запрос"
 echo -e "\t--help: показать это сообщение и закрыть vksearch\n"
 echo -e "\t--user-playlist: использовать плейлист пользователя по ID"
 echo -e "\t--search: использовать поиск по всей коллекции ВК\n"
 echo -e "\t--play: проиграть найденный список треков"
 echo -e "\t--get: скачать найденный список треков"
 echo -e "\t--play-one: проиграть один из найденных треков"
 echo -e "\t--get-one: скачать один трек"
 echo -e "\t--make-playlist: создать плейлист\n"
 echo -e "\t--count=N: искать N треков"
 echo -e "\t--save-to=PATH: сохранять плейлист и треки в указанный PATH"
 echo -e "\t--write-tags: записывать Id3v2 теги в скачанные треки"
 echo -e "\t--get-lyrics: скачать текст песни"

 exit 0
}

GetParams() {
for var in $@
do
 case $var in
  --help) ShowHelp;;
  --user-playlist) sys_method='audio.get' ;;
  --search) sys_method='audio.search' ;;
  --get-lyrics) sys_method='audio.getLyrics' && cfg_mode='get-lyrics' ;;
  --play) cfg_mode=play ;;
  --get) cfg_mode=get ;;
  --play-one) cfg_mode=play && cfg_search_count=1 ;;
  --get-one) cfg_mode=get && cfg_search_count=1 ;;
  --make-playlist) cfg_mode=make-playlist ;;
  --count=*) cfg_search_count=$(echo $var | cut -d '=' -f 2) ;;
  --save-to=*) cfg_save_to=$(echo $var | cut -d '=' -f 2) ;;
  --write-tags) cfg_write_tags=1 ;;
  --*) Info "Ошибка разбора аргументов: Неизвестный параметр $var" die ;;
  *) [ -z "$query" ] && query="${var}" || query="${query} ${var}"  ;;
 esac
done
[ -z "$query" ] && ShowHelp
}

Request() {
 Info "Добро пожаловать в VKSearch $sys_version!"
 Info "Загрузка списка треков..."
 case $sys_method in
  "audio.get")
    vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}method=audio.gettest_mode=1uid=${query}v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
    wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.get&uid=${query}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO "${sys_temp}/vksearch.out"
    found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
  "audio.search")
    vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=${cfg_search_count}method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
    wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=${cfg_search_count}&v=2.0&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO "${sys_temp}/vksearch.out"
    found=$(cat ${sys_temp}/vksearch.out | sed -ne 's,<count>\([^<]*\)</count>,\1,p'|sed 's/^[ \t]*//')  ;;
  "audio.getLyrics")
    vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=1lyrics=1method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
    wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=1&v=2.0&lyrics=1&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO ${sys_temp}/vksearch.out
    lyrics_id="$(cat ${sys_temp}/vksearch.out | sed -n 's|<lyrics_id>\(.*\)</lyrics_id>|\1|p'|sed 's/^[ \t]*//')"
    vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}lyrics_id=${lyrics_id}method=audio.getLyricstest_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
    wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.getLyrics&lyrics_id=${lyrics_id}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO ${sys_temp}/vksearch.lyrics
    found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l)  ;;
 esac

 error_msg="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_msg>\(.*\)</error_msg>|\1|p'|sed 's/^[ \t]*//'|head -n1 )"
 error_code="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_code>\(.*\)</error_code>|\1|p'|sed 's/^[ \t]*//'|head -n1)"
 [ -n "$error_msg" ] && Info "Ошибка: $error_msg (Код $error_code)" die

 song_count=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l )
 [ $song_count -eq 0 ] && Info "По запросу ${query} не найдено ни одного трека..." die || Info "По запросу ${query} найдено ${found} композиций. Обработка первых ${song_count}."
}

Parse() {
 OLD_IFS=$IFS
 IFS=$'\n'
 song_urls=( `cat ${sys_temp}/vksearch.out | sed -n 's|<url>\(.*\)</url>|\1|p'|sed 's/^[ \t]*//' ` )
 song_artists=( `cat ${sys_temp}/vksearch.out | sed -n 's|<artist>\(.*\)</artist>|\1|p'|sed 's/^[ \t]*//' ` )
 song_titles=( `cat ${sys_temp}/vksearch.out | sed -n 's|<title>\(.*\)</title>|\1|p'|sed 's/^  //' ` )
 song_durations=( `cat ${sys_temp}/vksearch.out |sed -n 's|<duration>\(.*\)</duration>|\1|p'|sed 's/^[ \t]*//' ` )
 song_counts=$(( ${#song_urls[@]} - 1 ))
 IFS=$OLD_IFS
}

RemoveDoubles() {
 rm ${sys_temp}/vksearch.pars* 2>&-
 Info "Начинаю удаление треков с одинаковой длительностью..."
 for i in `seq 0 $song_counts`
 do
  echo "<1>${song_durations[$i]}<2>${song_artists[$i]}<3>${song_titles[$i]}<4>${song_urls[$i]}<5>" >> ${sys_temp}/vksearch.parsing
 done
 cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 > ${sys_temp}/vksearch.parsed
 cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 -d > ${sys_temp}/vksearch.doubles
 OLD_IFS=$IFS
 IFS=$'\n'
 song_urls=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<4>\([^<]*\)<5>.*,\1,p' ` )
 song_artists=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<2>\([^<]*\)<3>.*,\1,p' ` )
 song_titles=( `cat ${sys_temp}/vksearch.parsed | sed -ne 's,.*<3>\([^<]*\)<4>.*,\1,p' ` )
 song_durations=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<1>\([^<]*\)<2>.*,\1,p' ` )
 song_counts=$(( ${#song_urls[@]} - 1 ))
 IFS=$OLD_IFS
 Info "В плейлисте осталось ${#song_urls[@]} треков."
}

MakePlaylist() {
 [ $cfg_new_playlist -eq 1 ] && rm $cfg_save_to/VKontakte_PlayList.m3u 2>&-
 [ -f "$cfg_save_to/VKontakte_PlayList.m3u" ] || echo -ne "#EXTM3U\n" > $cfg_save_to/VKontakte_PlayList.m3u
 for i in `seq 0 $song_counts`
 do
  echo -e "#EXTINF:${song_durations[$i]},${song_artists[$i]} - ${song_titles[$i]}\n${song_urls[$i]}\n" >> $cfg_save_to/VKontakte_PlayList.m3u
 done
 Info "Плейлист сохранен как $cfg_save_to/VKontakte_PlayList.m3u"
}

GetFiles() {
 cd "$cfg_save_to"
 for i in `seq 0 $song_counts`
 do
  Info "Начинаю закачку: ${song_artists[$i]} - ${song_titles[$i]}"
  $cfg_wget "${song_urls[$i]}" > "${song_artists[$i]} - ${song_titles[$i]}.mp3"
  Info "Файл ${song_artists[$i]} - ${song_titles[$i]} был загружен!"
  [ "$cfg_write_tags" -eq 1 ]  &&  id3 -2 -a "${song_artists[$i]}" -t "${song_titles[$i]}" "${song_artists[$i]} - ${song_titles[$i]}.mp3"
 done
}

SaveLyrics() {
 cd "$cfg_save_to"
 cat ${sys_temp}/vksearch.lyrics|sed 's/<.*>//g;/^[[:space:]]*$/d;s/^[ \t]*//' > "${song_artists[0]} - ${song_titles[0]}.txt"
 Info "Текст песни ${song_artists[0]} - ${song_titles[0]} сохранён!"
}

MediaPlay() {
 ${cfg_mplayer} "$cfg_save_to/VKontakte_PlayList.m3u"
}

GetParams $*
Request
Parse
RemoveDoubles

case $cfg_mode in
 play)
    MakePlaylist
    MediaPlay ;;
 get)
    GetFiles ;;
 make-playlist)
    MakePlaylist ;;
 get-lyrics)
    SaveLyrics ;;
esac


PHP скрипт для выкачивания музыки из ВК в папку



<?php
set_time_limit(0); // убираем тайм аут

$cookie = "";
$login = "ваш@емаил";
$password = "ваш пароль";
$user_vk = "айди/адрес"; // откуда хотим скачать (номер страницы/адрес страницы)
$savefolder = "music"; // куда будем сохранять файлы


$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);  // true т.к. мы будем отправлять post запрос:
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)');// чтобы сайт думал, что мы - браузер:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // ответ сервера будем записывать в переменную
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // по редиректам будем переходить автоматически.
curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');

$post = array( //Формирование запроса
        'act' => 'login',
        'q' => '',
        'al_frame' => '1',
        'expire' => '',
        'captcha_sid' => '',
        'captcha_key' => '',
        'from_host' => 'vkontakte.ru',
        'email' => $login,
        'pass' => $password
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$answer = curl_exec($ch);
/* В $answer нам приходит javascript, который и устанавливает куки
    с названием: remixsid Нам нужно cпарсить эти 60 символов,
    идентификатора сессии. с помощью них vkontakte поймет,
    что мы авторизировались.*/

$sid = substr($answer, strpos($answer, "setCookieEx('sid', '")+20, 60);
$cookie = 'remixsid='.$sid;
//
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "act=load_audios_silent&al=1&edit=0&gid=0&id=".$user_vk);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/audio'); // укажем страницу, с которой мы получим данные
$data = curl_exec($ch);
preg_match_all("/\['(.*?)','(.*?)','(.*?)','(.*?)','(.*?)','(.*?)','(.*?)','(.*?)','(.*?)','(.*?)'\]/i",$data,$parse);
curl_close($ch);
// и собственно и скачиваем
echo "<pre>";

echo "<b>Начинаем скачку</b><br><br>\n\n";
flush();
foreach($parse[0] as  $array_num => $array_list) { // начинаем скачивать
        $file=str_replace(array("#",";","/","\\"),"",(iconv("cp1251","utf-8",$parse[6][$array_num]))).".mp3"; //путь куда сохранит не забудь дать разрешение на запись в директорию
        $ch = curl_init ($parse[3][$array_num]); // url файла
        $fp = fopen ($savefolder."/".$file, "w"); // создаем файл для записи
        curl_setopt ($ch, CURLOPT_FILE, $fp);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_exec ($ch);
        curl_close ($ch);
        fclose ($fp);
        echo "файл скачан: ".iconv("cp1251","utf-8",($parse[6][$array_num].' - '.$parse[7][$array_num]))." ".date("H:i:s")."<br>\n";
        flush();
        //echo "filename:".$parse[3][$array_num].",     name:".iconv("cp1251","utf-8",($parse[6][$array_num].' - '.$parse[7][$array_num]))."\n";
}
?>


Получение размера БД MySQL



  Функция получение размера БД на PHP
function formatfilesize( $data ) {
// bytes
if( $data < 1024 ) {
return $data . " bytes";
}
// kilobytes
else if( $data < 1024000 ) {
return round( ( $data / 1024 ), 1 ) . "k";
}
// megabytes
else {
return round( ( $data / 1024000 ), 1 ) . " MB";
}
}
Соединение с БД и вычисление:
mysql_select_db( $dbname );
$result = mysql_query( "SHOW TABLE STATUS" );
$dbsize = 0;
while( $row = mysql_fetch_array( $result ) ) {
$dbsize += $row[ "Data_length" ] + $row[ "Index_length" ];
}
echo "Размер базы данных составляет "  . formatfilesize( $dbsize );

PHP: рекурсивное переименование файлов


Рекурсивное переименование файлов на PHP

<?php  
renameDirAndFiles("."); // В качестве аргумента передаем путь (имя) до папки.
function renameDirAndFiles ($patch) {
$handle = opendir($patch);
  while(($file = readdir($handle))) {
    if (is_file ($patch."/".$file) && getExtension1($file) != "php" )     {    
      echo $patch .  "/" . $file;
      // переименовываем файл.
      echo rename ( $patch .  "/" . $file, $patch .  "/" . iconv( 'UTF-8' , 'CP1251' , $file) ) .'<br />';
    }
    if (is_dir ($patch."/".$file) && ($file != ".") && ($file != ".."))
    {
      // рекурсивно проходим по директории
      renameDirAndFiles($patch."/".$file);  // Обходим вложенный каталог 
    }
  }
  closedir($handle);
}

function getExtension1($filename) {
  return substr($filename, strrpos($filename, '.') + 1); // Возвращаем расширение файла
}
?>

Парсинг RSS лент средствами PHP

Парсинг RSS лент средствами PHP

1 – SimpleXML:

<?
$url = 'rss.xml';       //адрес RSS ленты

$rss = simplexml_load_file($url);       //Интерпретирует XML-файл в объект
//цикл для обхода всей RSS ленты
foreach ($rss->channel->item as $item) {
        echo '<h1>'.$item->title.'</h1>';       //выводим на печать заголовок статьи 
        echo $item->description;        //выводим на печать текст статьи
}
?>

2 – XML Parser Functions

<?
$url = 'rss.xml';       //адрес RSS ленты
$xml = xml_parser_create();     //создаёт XML-разборщик
xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);  //устанавливает опции XML-разборщика
xml_parse_into_struct($xml, file_get_contents($url), $element, $index); //разбирает XML-данные в структуру массива
xml_parser_free($xml);  //освобождает XML-разборщик

$count = count($index["TITLE"])-1;      //число проходов цикла.
for ($i=0; $i < $count; $i++) {
        echo '<h1>'.$element[$index["TITLE"][$i+1]]["value"].'</h1>';           //выводим на печать заголовок статьи 
        echo $element[$index["DESCRIPTION"][$i+1]]["value"];            //выводим на печать текст статьи
}
?>


3 – Написать RSS парсер на PHP

<?
$url = 'rss.xml';       //адрес RSS ленты

$rss = @file_get_contents($url); //получаем содержимое RSS лент в виде одной строки
if ($rss) {     
        preg_match_all("/title>[^>]+>/", $rss, $title);         //парсим титлы
        preg_match_all("/<description>[^<]+<\/description>/", $rss, $description);              //парсим описание
        
        $count = count($title[0])-1;    //число проходов цикла
        
        for ($i=0; $i < $count; $i++) {
                echo '<h1>'.substr($title[0][$i+1], 6, -8).'</h1>';          
                echo substr($description[0][$i], 13, -14);              //выводим на печать текст статьи
        }
} else {
        echo '<font color="red">Ошибка парсинга '.$url.'</font>';  
}
?>

* RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п.

Excel + VBA » Объединение файлов


Как объединить несколько файлов Excel в один? С помощью VBA:


Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xls), *.xls", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open Filename:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Постоянные читатели

Популярные сообщения