[web] Выдать картинку-принтскрин по урлу сайта.

stm7884696

Подумал я тут, пока курить ходил, что неплохо было бы написать скриптик, которому даешь адрес урла, а он тебе в ответ картинку аля принт скрин сайта, на который ссылается урл...
Вот теперь вопрос, можно ли это вообще как-нить сделать ?

Vit0505

Честно говоря, не вижу проблемы. В Борланде, например, это делается стандартными средствами.
Да в принципе, и этих средств не надо. Делаешь форк "explorer http://url.domain.arpa" и снимаешь скриншот любым стандартным методом работы с графикой.

stm7884696

это что такое?
я просто хочу, что бы скрипт не на локале был, а на серваке...
Соответственно наверно подойдут только средства ВЕБ разработки...

a10063

а зачем?

sergey_m

Тогда свой броузер писать

stm7884696

ну вот есть такая идея...
Интересно стало....
А браузер то писать зачем ?

TYU_2008

ну "сервак" может и под windows жить, а там и IE тут как тут

a10063

А браузер то писать зачем ?
в случае, если только ср-вами ВЕБ разработки

Vit0505

какая разница-то? Что тебе мешает писать на серваке с использованием форков и графических библиотек?

dedwowan

А почему именно средства WEB разработки?
По сути тебе нужна программа, запускающая браузер, вызывающая URL и делающая принтскрин. Для этого WEB юзать не надо )
Если она работает с сервера, то тебе просто оболочку написать надо, которая будет эту программу дергать

voronetskaya

под браузером понимаеццо рендерер html'я в растр.

a10063

у него, наверное, не свой, а какой-нить халявный сервак

artimon

Такой сервис уже есть
http://danvine.com/iecapture/
http://danvine.com/icapture/

stm7884696

Warning: mysql_connect: Access denied for user: '209.68.1.162' (Using password: YES) in /usr/www/users/dvine/danvine.com/iecapture/inc/global.inc.php on line 45
Warning: Cannot modify header information - headers already sent by (output started at /usr/www/users/dvine/danvine.com/iecapture/inc/global.inc.php:45) in /usr/www/users/dvine/danvine.com/iecapture/detail.html on line 37
не пашет (

stm7884696

ну не халявный, а обычный хостинг....

a10063

а icapture пробовал?

stm7884696

ага.. тама регится надо...
у нах с базой косяк походу..

stm7884696

значит походу просто так сделать нельзя?
Надо обязательно привлекать какую-нить шнягу...?

stm7884696

Делаешь форк "explorer http://url.domain.arpa" и снимаешь скриншот любым стандартным методом работы с графикой.
а можно об этом поподробнее...
Как сделать это в XP ?
по пунктам, если можно, а то что такое форк я незнаком...

Vit0505

Юзай MSDN. Ключевые слова: _spawn, _exec, system.

stm7884696

с мсдном у меня тоже напряг...
Если кто знает, как это делаеться просто (а упоминания о простом способе здесь были)Ю может расскажет поподробнее?
А то с факом и мсдном на неделю застряну...

Vit0505

intptr_t _spawnl(
int mode,
const char *cmdname,
const char *arg0,
const char *arg1,
... const char *argn,
NULL
);
Create and execute a new process.
Parameters
mode
Execution mode for calling process
cmdname
Path of file to be executed
arg0, arg1, ... argn
List of pointers to arguments
Return Value
The return value from a synchronous _spawnl or _wspawnl (_P_WAIT specified for mode) is the exit status of the new process. The return value from an asynchronous _spawnl or _wspawnl (_P_NOWAIT or _P_NOWAITO specified for mode) is the process handle. The exit status is 0 if the process terminated normally. You can set the exit status to a nonzero value if the spawned process specifically calls the exit routine with a nonzero argument. If the new process did not explicitly set a positive exit status, a positive exit status indicates an abnormal exit with an abort or an interrupt. A return value of –1 indicates an error (the new process is not started). In this case, errno is set to one of the following values:
E2BIG
Argument list exceeds 1024 bytes
EINVAL
mode argument is invalid
ENOENT
File or path is not found
ENOEXEC
Specified file is not executable or has invalid executable-file format
ENOMEM
Not enough memory is available to execute new process
Requirements
Routine Required header Compatibility
_spawnl <process.h> Win 98, Win Me, Win NT, Win 2000, Win XP

sergey_m

msdn.rambler.ru
вводи слова

Dasar

не слушай их - они тебя плохому научат.
если тебе нужен именно скриншот (а не распечатанный html то под windows-ом - это делается так:

void OnLoad
{
axWebBrowser1.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(OnDocComplete);
axWebBrowser1.Navigate (url,
ref flags,
ref frame_name,
ref post_data,
ref headers);
}
void OnDocComplete (object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
new ScreenShot(axWebBrowser1).Bitmap.Save("q.bmp");
}

stm7884696

под виндой это я понял, а в какую прогу этот код вбивать?
не в командную же строку...

Dasar

в любую .Net-овскую, например, в Asp.net-овскую можно

stm7884696

а может это кто нить сделать
?
А то этот дотнет занимает 2 гига, а у меня места что бы его поставить нет (

sergei1969

это ты не путай, дот нет занимает мегов 30, писать можешь в нотепаде
ещё IIS нужен, но он тоже никак не 2 гига весит

stm7884696

вот поэтому и прошу помощи, т.к. спутал с MS .NET studio 2003
А на php мона? и у меня апач стоит...

bastii

Лихо. А ScreenShot что?

Dasar

что-то такое:

public class ScreenShot
{
public ScreenShot(Control screenControl)
{
this.screenControl = screenControl;
ResetBitmap;
}

Control screenControl;
public Control ScreenControl
{
get
{
return screenControl;
}
}

Bitmap bitmap = null;
public Bitmap Bitmap
{
get
{
return bitmap;
}
}


public void ResetBitmap
{
bitmap = new Bitmap(ScreenControl.Width + 2, ScreenControl.Height + 2);
using (Graphics g = Graphics.FromImage(bitmap
{
IntPtr dc = g.GetHdc;
try
{
SendMessage(ScreenControl.Handle, WM_PRINT, dc,
DrawingOptions.PRF_CHILDREN |
DrawingOptions.PRF_CLIENT |
DrawingOptions.PRF_NONCLIENT |
DrawingOptions.PRF_OWNED);
}
finally
{
g.ReleaseHdc(dc);
}
}
}

[Flags]
private enum DrawingOptions
{
PRF_CHECKVISIBLE = 0x00000001,
PRF_NONCLIENT = 0x00000002,
PRF_CLIENT = 0x00000004,
PRF_ERASEBKGND = 0x00000008,
PRF_CHILDREN = 0x00000010,
PRF_OWNED = 0x00000020
}

private const int WM_PRINT = 0x0317;
private const int WM_PRINTCLIENT = 0x0318;

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int msg, IntPtr dc,
DrawingOptions opts);

}
}

bastii

Прикольно. И работает? Проверял? А как explorer на WM_PRINT реагирует?

Dasar

да, работает.
explorer - это обычный ActiveX-контрол.

bastii

Это я понял. Кстати, в Winforms 2.0 есть уже такой контрол. Мне вот интересно в чем отличие WM_PAINT и WM_PRINT.

stm7884696

а где работает?
дай ссылочку, или скинь скриптик....
Оставить комментарий
Имя или ник:
Комментарий: