Перевод текста из буфера обмена

Обсуждение программ nnCron и nnCron LITE

Перевод текста из буфера обмена

Postby Decomo » Fri, 16 Jul 2010, 16:41

Таск для перевода простого текста из буфера обмена с английского на русский по комбинации горячих клавиш. Кавычки и различные спецсимволы могут обрабатываться некорректно.
Формируется POST-запрос, перекодируется в UTF-8 и посылается серверу.
Ответ обрабатывается с помощью регулярных выражений, перекодируется в ANSI и выводится в виде сообщения. При нажатии кнопки ДА перевод помещается в буфер обмена.

Code: Select all
#( CLASSIC-TASK-#-trans
SingleInstance
WatchHotKey: "^@{0x26}"   \ Ctrl+Alt+СтрелкоВверьх
WINAPI: InternetOpenA        WININET.DLL
WINAPI: InternetConnectA     WININET.DLL
WINAPI: HttpOpenRequestA     WININET.DLL
WINAPI: HttpSendRequestA     WININET.DLL
WINAPI: InternetReadFile     WININET.DLL
WINAPI: InternetCloseHandle  WININET.DLL
CREATE БуферДляЧтения 102400 ALLOT
USER-CREATE str 1024 USER-ALLOT
USER ПрочитаноБайт
USER UnicodeBuf
0 CONSTANT NULL
: UTF8>ANSI ( addr u -- addr2 u2 )
  DUP 2* CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP 2* CELL+ UnicodeBuf @ ROT R>
  0 65001
  MultiByteToWideChar
  UnicodeBuf @
  SWAP 2*
  2DUP + 0 SWAP W!
  UNICODE>S
;
: ANSI>UTF8 ( addr u -- addr2 u2 )
  S>UNICODE 1+
  >R >R 0 0 R> R>
  2* DUP CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP CELL+ UnicodeBuf @
  ROT 2 /
  R>
  0 65001
  WideCharToMultiByte
  UnicodeBuf @
  SWAP 1-
;
: ПереводБуфера { \ hInternet hConnect hRequest -- }
0 NULL NULL 1 Z" Opera"
InternetOpenA ?DUP                                                                               BALLOON: "Перевод" "InternetOpenA"
IF
    TO hInternet
    0 0 3 NULL NULL 80 Z" translate.qb.by" hInternet
    InternetConnectA ?DUP                                                                        BALLOON: "Перевод" "InternetConnectA"
    IF
        TO hConnect
        0 NULL NULL NULL NULL NULL Z" POST" hConnect       
        HttpOpenRequestA ?DUP                                                                    BALLOON: "Перевод" "HttpOpenRequestA"
        IF
            TO hRequest
                                                   S" text=" str PLACE
                                                   CLIPBOARD str +PLACE
                                                   S" &sl=en&tl=ru" str +PLACE
                                                   str COUNT ANSI>UTF8
            SWAP S" Content-Type: application/x-www-form-urlencoded" SWAP hRequest
            HttpSendRequestA                                                                     BALLOON: "Перевод" "HttpSendRequestA"
            IF
                ПрочитаноБайт 102400 БуферДляЧтения hRequest
                InternetReadFile ( читаем страницу целиком - 100 КБ должно хватить )             BALLOON: "Перевод" "InternetReadFile"
                IF
                    ПрочитаноБайт @
                        IF
                            \ БуферДляЧтения ПрочитаноБайт @ S" c:\test.html" FAPPEND
                       БуферДляЧтения ПрочитаноБайт @
                            RE-ALL: "%1 esPICKS%" "/(left;%QUOTE%>)?#7.+(<\/blockquote>)?=/s"
                            $0 UTF8>ANSI str PLACE
                            ;RE-ALL
                        THEN
                ELSE
                    GetLastError MSG: "InternetReadFile_ERROR:%0 esPICK%"
                THEN
            ELSE
                GetLastError MSG: "HttpSendRequestA_ERROR:%0 esPICK%"
            THEN
        ELSE
            GetLastError MSG: "HttpOpenRequestA_ERROR:%0 esPICK%"
        THEN
    ELSE
        GetLastError MSG: "InternetConnectA_ERROR:%0 esPICK%"
    THEN
ELSE
    GetLastError MSG: "InternetOpenA_ERROR:%0 esPICK%"
THEN
hRequest InternetCloseHandle
hConnect InternetCloseHandle
hInternet InternetCloseHandle DROP 2DROP
;
Action:
\ S" " S" c:\test.html" FWRITE
ПереводБуфера
BALLOON: "" ""
\ CLIPBOARD: "%str COUNT%" BALLOON: "Перевод:" "%str COUNT%"
QUERY: "%str COUNT%" IF CLIPBOARD: "%str COUNT%" THEN
)#


Доступны другие языки для перевода в любом направлении.
POST запрос должен быть сформирован соответственно - text=Love&sl=en&tl=ru.
Если исходный язык не указан - сервер попытается его определить.
"en" - английский; "es" - испанский;"it" - итальянский;"de" - немецкий;"ru" - русский;"fr" - французский;"sq" - албанский;"ar" - арабский;"af" - африкаанс; "be" - белорусский;"bg" - болгарский;"cy" - валлийский;"hu" - венгерский;"vi" - вьетнамский;"gl" - галисийский;"nl" - голландский;"el" - греческий;"da" - датский;"iw" - иврит;"yi" - идиш;"id" - индонезийский;"ga" - ирландский;"is" - исландский;"ca" - каталанский;"zh-CN" - китайский;"ko" - корейский;"lv" - латышский;"lt" - литовский;"mk" - македонский;"ms" - малайский;"mt" - мальтийский;"no" - норвежский;"fa" - персидский;"pl" - польский;"pt" - португальский;"ro" - румынский;"sr" - сербский;"sk" - словацкий;"sl" - словенский;"sw" - суахили;"tl" - тагальский;"th" - тайский;"tr" - турецкий;"uk" - украинский;"fi" - финский;"hi" - хинди;"hr" - хорватский;"cs" - чешский;"sv" - шведский;"et" - эстонский;"ja" - японский;
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus

Re: Перевод текста из буфера обмена

Postby Kostya5 » Fri, 16 Jul 2010, 17:30

О, классная штука!
А через прокси как-то можно сделать?
возможно использовать параметры прокси из IE?
Kostya5
 
Posts: 19
Joined: Wed, 25 Jul 2007, 13:50

Перевод текста из буфера обмена через прокси

Postby Decomo » Sat, 17 Jul 2010, 01:27

Kostya5 wrote:О, классная штука!
А через прокси как-то можно сделать?
возможно использовать параметры прокси из IE?


Если кто не в курсе - в nnCron-е всё можно=)
Здесь параметры прокси указаны непосредственно в тексте задачи:
Code: Select all
#( CLASSIC-TASK-#-trans
SingleInstance
WatchHotKey: "^@{0x26}"   \ Ctrl+Alt+СтрелкоВверьх
WINAPI: InternetOpenA        WININET.DLL
WINAPI: InternetConnectA     WININET.DLL
WINAPI: HttpOpenRequestA     WININET.DLL
WINAPI: HttpSendRequestA     WININET.DLL
WINAPI: InternetReadFile     WININET.DLL
WINAPI: InternetCloseHandle  WININET.DLL
WINAPI: InternetSetOptionA   WININET.DLL
CREATE БуферДляЧтения 102400 ALLOT
USER-CREATE str 102400 USER-ALLOT
USER ПрочитаноБайт
USER UnicodeBuf
0 CONSTANT NULL
: UTF8>ANSI ( addr u -- addr2 u2 )
  DUP 2* CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP 2* CELL+ UnicodeBuf @ ROT R>
  0 65001
  MultiByteToWideChar
  UnicodeBuf @
  SWAP 2*
  2DUP + 0 SWAP W!
  UNICODE>S
;
: ANSI>UTF8 ( addr u -- addr2 u2 )
  S>UNICODE 1+
  >R >R 0 0 R> R>
  2* DUP CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP CELL+ UnicodeBuf @
  ROT 2 /
  R>
  0 65001
  WideCharToMultiByte
  UnicodeBuf @
  SWAP 1-
;
: ПереводБуфера { \ hInternet hConnect hRequest -- }
0 0 Z" http=http://peering3.sharkeva.com:8083" 3 Z" Opera"
InternetOpenA ?DUP                                                                               BALLOON: "Перевод" "InternetOpenA"
IF
    TO hInternet
    0 0 3 NULL NULL 80 Z" translate.qb.by" hInternet
    InternetConnectA ?DUP                                                                        BALLOON: "Перевод" "InternetConnectA"
    IF
        TO hConnect
        0 0 NULL NULL NULL NULL Z" POST" hConnect
        HttpOpenRequestA ?DUP                                                                    BALLOON: "Перевод" "HttpOpenRequestA"
        IF
            TO hRequest
                             S" text=" str PLACE
                             CLIPBOARD str +PLACE
                             S" &sl=en&tl=ru" str +PLACE
                             str COUNT ANSI>UTF8
( ИМЯ ПОЛЬЗОВАТЕЛЯ ПРОКСИ )               S" lalala" SWAP 43 hRequest
                                          InternetSetOptionA
                                          NOT IF GetLastError
                                          MSG: "InternetSetOptionA_ProxyUser_ERROR:%0 esPICK%" THEN
( ПАРОЛЬ )                                 S" bububu" SWAP 44 hRequest
                                           InternetSetOptionA
                                           NOT IF GetLastError
                                           MSG: "InternetSetOptionA_ProxyPass_ERROR:%0 esPICK%" THEN
            SWAP S" Content-Type: application/x-www-form-urlencoded" SWAP hRequest
            HttpSendRequestA                                                                     BALLOON: "Перевод" "HttpSendRequestA"
            IF
                ПрочитаноБайт 102400 БуферДляЧтения hRequest
                InternetReadFile ( читаем страницу целиком - 100 КБ должно хватить )             BALLOON: "Перевод" "InternetReadFile"
                IF
                    ПрочитаноБайт @
                        IF
                            \ БуферДляЧтения ПрочитаноБайт @ S" c:\test.html" FAPPEND
                       БуферДляЧтения ПрочитаноБайт @
                            RE-ALL: "%1 esPICKS%" "/(left;%QUOTE%>)?#7.+(<\/blockquote>)?=/s"
                            $0 UTF8>ANSI str PLACE
                            ;RE-ALL
                        THEN
                ELSE
                    GetLastError MSG: "InternetReadFile_ERROR:%0 esPICK%"
                THEN
            ELSE
                GetLastError MSG: "HttpSendRequestA_ERROR:%0 esPICK%"
            THEN
        ELSE
            GetLastError MSG: "HttpOpenRequestA_ERROR:%0 esPICK%"
        THEN
    ELSE
        GetLastError MSG: "InternetConnectA_ERROR:%0 esPICK%"
    THEN
ELSE
    GetLastError MSG: "InternetOpenA_ERROR:%0 esPICK%"
THEN
hRequest  InternetCloseHandle
hConnect  InternetCloseHandle
hInternet InternetCloseHandle DROP 2DROP
;
Action:
\ S" " S" c:\test.html" FWRITE
ПереводБуфера
\ CLIPBOARD: "%str COUNT%" BALLOON: "Перевод:" "%str COUNT%"
QUERY: "%str COUNT%" IF CLIPBOARD: "%str COUNT%" THEN
BALLOON: "" ""
)#
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus

Re: Перевод текста из буфера обмена

Postby Kostya5 » Sat, 17 Jul 2010, 08:34

Если кто не в курсе - в nnCron-е всё можно=)

Да в этом я практически не сомневался :wink:
Спасибо за прокси, в понедельник попробую на работе :)

Upd: работает!
Kostya5
 
Posts: 19
Joined: Wed, 25 Jul 2007, 13:50

Обход ограничения в 256 байт

Postby Decomo » Mon, 19 Jul 2010, 20:57

Code: Select all
#( CLASSIC-TASK-#-trans
SingleInstance
WatchHotKey: "^@{0x26}"   \ Ctrl+Alt+СтрелкоВверьх
WINAPI: InternetOpenA        WININET.DLL
WINAPI: InternetConnectA     WININET.DLL
WINAPI: HttpOpenRequestA     WININET.DLL
WINAPI: HttpSendRequestA     WININET.DLL
WINAPI: InternetReadFile     WININET.DLL
WINAPI: InternetCloseHandle  WININET.DLL
USER-CREATE БуферДляЧтения 102400 ALLOT
USER-CREATE str 102400 USER-ALLOT
USER-VALUE iks
USER ПрочитаноБайт
USER UnicodeBuf
0 CONSTANT NULL
: UTF8>ANSI ( addr u -- addr2 u2 )
  DUP 2* CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP 2* CELL+ UnicodeBuf @ ROT R>
  0 65001
  MultiByteToWideChar
  UnicodeBuf @
  SWAP 2*
  2DUP + 0 SWAP W!
  UNICODE>S
;
: ANSI>UTF8 ( addr u -- addr2 u2 )
  S>UNICODE 1+
  >R >R 0 0 R> R>
  2* DUP CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP CELL+ UnicodeBuf @
  ROT 2 /
  R>
  0 65001
  WideCharToMultiByte
  UnicodeBuf @
  SWAP 1-
;
: ПереводБуфера { \ hInternet hConnect hRequest -- }
0 NULL NULL 1 Z" Opera"
InternetOpenA ?DUP                                                                               BALLOON: "Перевод" "InternetOpenA"
IF
    TO hInternet
    0 0 3 NULL NULL 80 Z" translate.qb.by" hInternet
    InternetConnectA ?DUP                                                                        BALLOON: "Перевод" "InternetConnectA"
    IF
        TO hConnect
        0 0 NULL NULL NULL NULL Z" POST" hConnect
        HttpOpenRequestA ?DUP                                                                    BALLOON: "Перевод" "HttpOpenRequestA"
        IF
            TO hRequest
                             S" text=" TO iks str iks MOVE
                             CLIPBOARD >R str iks + R@ MOVE R> iks + TO iks
                             S" &sl=en&tl=ru" >R str iks + R@ MOVE R> iks + TO iks
                             str iks ANSI>UTF8
            SWAP S" Content-Type: application/x-www-form-urlencoded" SWAP hRequest
            HttpSendRequestA                                                                     BALLOON: "Перевод" "HttpSendRequestA"
            IF
                ПрочитаноБайт 102400 БуферДляЧтения hRequest
                InternetReadFile ( читаем страницу целиком - 100 КБ должно хватить )             BALLOON: "Перевод" "InternetReadFile"
                IF
                    ПрочитаноБайт @
                        IF
                       БуферДляЧтения ПрочитаноБайт @
                            RE-ALL: "%1 esPICKS%" "/(left;%QUOTE%>)?#7.+(<\/blockquote>)?=/s"
                            $0 UTF8>ANSI TO iks str iks MOVE
                            ;RE-ALL
                        THEN
                ELSE
                    GetLastError MSG: "InternetReadFile_ERROR:%0 esPICK%"
                THEN
            ELSE
                GetLastError MSG: "HttpSendRequestA_ERROR:%0 esPICK%"
            THEN
        ELSE
            GetLastError MSG: "HttpOpenRequestA_ERROR:%0 esPICK%"
        THEN
    ELSE
        GetLastError MSG: "InternetConnectA_ERROR:%0 esPICK%"
    THEN
ELSE
    GetLastError MSG: "InternetOpenA_ERROR:%0 esPICK%"
THEN
hRequest  InternetCloseHandle
hConnect  InternetCloseHandle
hInternet InternetCloseHandle DROP 2DROP
;
Action:
ПереводБуфера
QUERY: "%str iks%" IF CLIPBOARD: "%str iks%" THEN
BALLOON: "" ""
)#


Теперь размер переводимого текста ограничен лишь сервером. Если текст слишком большой - сервер говорит
Кьюби сейчас не в себе.
Повторите запрос чуть позже.
=)
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus

Re: Перевод текста из буфера обмена

Postby Morituruz » Wed, 01 Sep 2010, 09:47

Отличная функция, но можно ли указывать отдельные настройки для прокси?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Перевод текста из буфера обмена

Postby Decomo » Wed, 01 Sep 2010, 11:46

Moriturus wrote:Отличная функция, но можно ли указывать отдельные настройки для прокси?


Code: Select all
#( CLASSIC-TASK-#-trans
SingleInstance
WatchHotKey: "^@{0x26}"   \ Ctrl+Alt+СтрелкоВверьх
WINAPI: InternetOpenA        WININET.DLL
WINAPI: InternetConnectA     WININET.DLL
WINAPI: HttpOpenRequestA     WININET.DLL
WINAPI: HttpSendRequestA     WININET.DLL
WINAPI: InternetReadFile     WININET.DLL
WINAPI: InternetCloseHandle  WININET.DLL
WINAPI: InternetSetOptionA   WININET.DLL
CREATE БуферДляЧтения 102400 ALLOT
USER-CREATE str 102400 USER-ALLOT
USER-VALUE iks
USER ПрочитаноБайт
USER UnicodeBuf
0 CONSTANT NULL
: UTF8>ANSI ( addr u -- addr2 u2 )
  DUP 2* CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP 2* CELL+ UnicodeBuf @ ROT R>
  0 65001
  MultiByteToWideChar
  UnicodeBuf @
  SWAP 2*
  2DUP + 0 SWAP W!
  UNICODE>S
;
: ANSI>UTF8 ( addr u -- addr2 u2 )
  S>UNICODE 1+
  >R >R 0 0 R> R>
  2* DUP CELL+ ALLOCATE DROP UnicodeBuf !
  SWAP >R
  DUP CELL+ UnicodeBuf @
  ROT 2 /
  R>
  0 65001
  WideCharToMultiByte
  UnicodeBuf @
  SWAP 1-
;
: ПереводБуфера { \ hInternet hConnect hRequest -- }
\ ТУТ АДРЕС ПРОКСИ
\ 0 0 Z" http=http://178.124.128.220:8590" 3 Z" Opera"
0 0 Z" http=http://peering3.sharkeva.com:8083" 3 Z" Opera"
InternetOpenA ?DUP                                                                               BALLOON: "Перевод" "InternetOpenA"
IF
    TO hInternet
    0 0 3 NULL NULL 80 Z" translate.qb.by" hInternet
    InternetConnectA ?DUP                                                                        BALLOON: "Перевод" "InternetConnectA"
    IF
        TO hConnect
        0 0 NULL NULL NULL NULL Z" POST" hConnect
        HttpOpenRequestA ?DUP                                                                    BALLOON: "Перевод" "HttpOpenRequestA"
        IF
            TO hRequest
                             S" text=" TO iks str iks MOVE
                             CLIPBOARD >R str iks + R@ MOVE R> iks + TO iks
                             S" &sl=en&tl=ru" >R str iks + R@ MOVE R> iks + TO iks
                             str iks ANSI>UTF8
( ИМЯ ПОЛЬЗОВАТЕЛЯ ПРОКСИ )               S" lalala" SWAP 43 hRequest
                                          InternetSetOptionA
                                          NOT IF GetLastError
                                          MSG: "InternetSetOptionA_ProxyUser_ERROR:%0 esPICK%" THEN
( ПАРОЛЬ )                                 S" bububu" SWAP 44 hRequest
                                           InternetSetOptionA
                                           NOT IF GetLastError
                                           MSG: "InternetSetOptionA_ProxyPass_ERROR:%0 esPICK%" THEN
            SWAP S" Content-Type: application/x-www-form-urlencoded" SWAP hRequest
            HttpSendRequestA                                                                     BALLOON: "Перевод" "HttpSendRequestA"
            IF
                ПрочитаноБайт 102400 БуферДляЧтения hRequest
                InternetReadFile ( читаем страницу целиком - 100 КБ должно хватить )             BALLOON: "Перевод" "InternetReadFile"
                IF
                    ПрочитаноБайт @
                        IF
                       БуферДляЧтения ПрочитаноБайт @
                            RE-ALL: "%1 esPICKS%" "/(left;%QUOTE%>)?#7.+(<\/blockquote>)?=/s"
                            $0 UTF8>ANSI TO iks str iks MOVE
                            ;RE-ALL
                        THEN
                ELSE
                    GetLastError MSG: "InternetReadFile_ERROR:%0 esPICK%"
                THEN
            ELSE
                GetLastError MSG: "HttpSendRequestA_ERROR:%0 esPICK%"
            THEN
        ELSE
            GetLastError MSG: "HttpOpenRequestA_ERROR:%0 esPICK%"
        THEN
    ELSE
        GetLastError MSG: "InternetConnectA_ERROR:%0 esPICK%"
    THEN
ELSE
    GetLastError MSG: "InternetOpenA_ERROR:%0 esPICK%"
THEN
hRequest  InternetCloseHandle
hConnect  InternetCloseHandle
hInternet InternetCloseHandle DROP 2DROP
;
Action:
ПереводБуфера
QUERY: "%str iks%" IF CLIPBOARD: "%str iks%" THEN
BALLOON: "" ""
)#


Прокси-сервер, имя пользователя и пароль нужно указать в тексте задачи.
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus

Re: Перевод текста из буфера обмена

Postby Morituruz » Thu, 02 Sep 2010, 08:44

Спасибо, прекрасно работает!
Ещё такой небольшой вопрос: можно ли по нажатию сочетания клавиш (alt+ctrl+c например) выполнять операцию копирования в буфер и сразу перевод (имеется ввиду более правильным способом, чем PAUSE: 300 и SEND-KEYS: "^c")?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Перевод текста из буфера обмена

Postby Decomo » Thu, 02 Sep 2010, 10:58

>>Moriturus
Наверное, Windows это допускает.
Хотя, послать в окно Ctrl+C тоже можно.)
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus

Re: Перевод текста из буфера обмена

Postby Morituruz » Thu, 02 Sep 2010, 12:33

Я тоже думаю, что позволяет
http://www.cyberguru.ru/programming/win ... page3.html
но сам я это описать на nncron-е не могу :?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Перевод текста из буфера обмена

Postby VoidVolker » Thu, 09 Sep 2010, 00:32

О как, очень интересная штучка. Вот только бы декомпозицию сделать бы не помешало бы - а то код нечитаем.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Перевод текста из буфера обмена

Postby Morituruz » Tue, 24 Jan 2012, 00:57

Собирается ли автор обновить код? Или такой трюк сейчас уже не сработает?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Перевод текста из буфера обмена

Postby Decomo » Tue, 24 Jan 2012, 01:14

Moriturus wrote:Собирается ли автор обновить код? Или такой трюк сейчас уже не сработает?


Да, нужно будет переделать..)
<?xml version="1.0" encoding="UTF-8"?>
User avatar
Decomo
 
Posts: 86
Joined: Tue, 13 Jan 2009, 02:52
Location: Republic Of Belarus


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 1 guest

cron