Jump to content
Sign in to follow this  
TheSaint

Simple Dropbox For URL's

Recommended Posts

I've finally come up with a simple solution for dragging & dropping a URL.
It's not perfect, but it does the job. Mostly just a tweak of some Help file examples.

Thanks also to AutoBert, for his StringRegExp and example that set me on the right path.

I have seen this requested for many times, so enjoy!

It goes without saying, that any improvements are welcome. :D

Dropbox For URLs.au3

#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Global $hGui, $g_hRichEdit

Example()

Func Example()
   Local $cnt, $URL, $val, $text
   Local $iMsg, $state = $WS_CAPTION + $WS_POPUP + $WS_CLIPSIBLINGS + $WS_SYSMENU
   $hGui = GUICreate(StringTrimRight(@ScriptName, 4), 160, 100, -1, -1, $state, $WS_EX_TOPMOST)
   $g_hRichEdit = _GUICtrlRichEdit_Create($hGui, "", 10, 10, 140, 80, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
   GUISetState(@SW_SHOW)

   _GUICtrlRichEdit_SetEventMask($g_hRichEdit, $ENM_LINK)

   _GUICtrlRichEdit_AutoDetectURL($g_hRichEdit, True)

   $cnt = 0

   While True
        $iMsg = GUIGetMsg()
        Select
            Case $iMsg = $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($g_hRichEdit)
                ExitLoop
             Case Else
               If $cnt = 20 Then
                  $text = _GUICtrlRichEdit_GetText($g_hRichEdit)
                  If $text <> "" Then
                     $val = StringRegExp($text, "(?s)((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)", 2)
                     If UBound($val) > 0 Then
                        $URL = $text
                        ClipPut($URL)
                        ;MsgBox(0, "URL", $URL, 0, $hGui)
                     Else
                        _GUICtrlRichEdit_SetText($g_hRichEdit, "Only URL's are supported!")
                        ;MsgBox(0, "Not URL", "Only URL's are supported!", 0, $hGui)
                     EndIf
                     Sleep(600)
                     _GUICtrlRichEdit_SetText($g_hRichEdit, "")
                  EndIf
                  $cnt = 0
               Else
                  $cnt = $cnt + 1
               EndIf
        EndSelect
    WEnd
EndFunc   ;==>Example

GUIDelete($hGui)

Exit

I also wanted a version that would work with an earlier version of AutoIt (v3.3.0.0), to use with updates for some older scripts (programs).

The following works fine on my Win XP laptop, but fails (also when compiled) on my Win 7 Netbook.

I found a RichEdit example in the GUICtrlCreateEdit function (Example 2) in the AutoIt v3.3.0.0 Help file, and modified that to suit my script.
Failure is no doubt due to 'MSCOMCT2.OCX' missing from the System32 folder, at the very least.

Any solution to getting the following to work on Win 7 would be greatly appreciated. Perhaps a different '.OCX' file etc.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Global $oMyError

RichEditExample()

Exit

; Rich edit control EXAMPLE using GUICtrlCreateObj
; Author: Kåre Johansson
; AutoIt Version: 3.1.1.55
; Description: Very Simple example: Embedding RICHTEXT object
; Needs: MSCOMCT2.OCX in system32 but it's probably already there
; Date: 3 jul 2005
Func RichEditExample()
    Local $cnt, $DropBoxGUI, $GUIActiveX, $msg, $oRP, $state, $text, $URL, $val

    $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

    $oRP = ObjCreate("RICHTEXT.RichtextCtrl.1")
    If @error Then Return

    $state = $WS_CAPTION + $WS_POPUP + $WS_CLIPSIBLINGS + $WS_SYSMENU
    $DropBoxGUI = GUICreate(StringTrimRight(@ScriptName, 4), 160, 100, -1, -1, $state, $WS_EX_TOPMOST)

    $GUIActiveX = GUICtrlCreateObj($oRP, 0, 0, 140, 80)
    GUICtrlSetPos($GUIActiveX, 5, 5, 150, 90)

    $cnt = 0

    With $oRP; Object tag pool
        .OLEDrag()
        .Font = 'Arial'
        .Text = @CRLF & @CRLF & "     Drag & Drop a URL here."
        .SelBold = True
        .BackColor = 0xff00
        ;.FileName = @ScriptDir & '\RichText.rtf'
        ;$oRP.AboutBox()
        ;$oRP.SelBold = False
        ;$oRP.SelItalic = False
        ;$oRP.SelUnderline = False
        ;$oRP.SelFontSize = 8
        ;$oRP.SaveFile(@ScriptDir & "\RichText.rtf", 0)
    EndWith

    GUISetState(@SW_SHOW)

    While 1
        $msg = GUIGetMsg()

        Select
            Case $msg = $GUI_EVENT_CLOSE
                GUIDelete($DropBoxGUI)
                ExitLoop
            Case Else
                If $cnt = 20 Then
                    $text = $oRP.Text
                    If $text <> "" Then
                        If $text = @CRLF & @CRLF & "     Drag & Drop a URL here." Then
                            Sleep(2000)
                        Else
                            $val = StringRegExp($text, "(?s)((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)", 2)
                            If UBound($val) > 0 Then
                                $URL = $text
                                ClipPut($URL)
                                ;MsgBox(0, "URL", $URL, 0, $hGui)
                                Sleep(600)
                            Else
                                With $oRP
                                    .Text = "Only URL's are supported!"
                                EndWith
                                ;MsgBox(0, "Not URL", "Only URL's are supported!", 0, $hGui)
                                Sleep(1500)
                            EndIf
                        EndIf
                        With $oRP
                            .Text = ""
                            .SelBold = False
                        EndWith
                    EndIf
                    $cnt = 0
                Else
                    $cnt = $cnt + 1
                EndIf
        EndSelect
    WEnd
EndFunc   ;==>RichEditExample

Func MyErrFunc()
    MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
            "err.description is: " & @TAB & $oMyError.description & @CRLF & _
            "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
            "err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
            "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
            "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
            "err.source is: " & @TAB & $oMyError.source & @CRLF & _
            "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
            "err.helpcontext is: " & @TAB & $oMyError.helpcontext , 5)
    ; Will automatically continue after 5 seconds

    Local $err = $oMyError.number
    If $err = 0 Then $err = -1

    SetError($err)  ; to check for after this function returns
EndFunc   ;==>MyErrFunc

And a slower embedded IE based version. This has an error in latest AutoIt, but works fine in v3.3.0.0.

#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>

Local $DropboxGUI, $GUIActiveX, $loaded, $loops, $oBody, $oIE, $sHTML, $timeout, $urlpage

_IEErrorHandlerRegister()

$oIE = _IECreateEmbedded()
$DropboxGUI = GUICreate("URL Dropbox", 140, 140, -1, -1, _
    $WS_OVERLAPPED + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_SYSMENU, $WS_EX_TOPMOST)
$GUIActiveX = GUICtrlCreateObj($oIE, 5, 5, 125, 100)

$oBody = _IETagNameGetCollection($oIE, "body", 0)
_IEDocInsertHTML($oBody, "", "afterbegin")

$loaded = _IEPropertyGet($oIE, "locationurl")

$urlpage = $loaded
$loops = 0

$sHTML = ""
$sHTML &= "<HTML>" & @CR
$sHTML &= "<HEAD>" & @CR
$sHTML &= "<TITLE>Drag And Drop Example</TITLE>" & @CR
$sHTML &= "</HEAD>" & @CR
$sHTML &= "<BODY>" & @CR
$sHTML &= "</BODY>" & @CR
$sHTML &= "</HTML>"

_IELoadWaitTimeout(1)

While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ; Quit, Close or Exit window
        GUIDelete($DropboxGUI)
        ExitLoop
    Case Else
        ;;;
        If $loops = 10 Then
            $loops = 0
            $loaded = _IEPropertyGet($oIE, "locationurl")
            If $loaded <> $urlpage Then
                _IEAction($oIE, "stop")
                _IEDocWriteHTML($oIE, $sHTML)
                If $loaded = "res://ieframe.dll/navcancl.htm" Then $loaded = ""
                $urlpage = $loaded
                _IEBodyWriteHTML($oIE, '<p style="WORD-WRAP: normal; WORD-BREAK: break-all; FONT-SIZE: 8px">' & $loaded & '</p>')
            EndIf
        Else
            $loops = $loops + 1
        EndIf
    EndSelect
WEnd

Exit

 

Edited by TheSaint

AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Share this post


Link to post
Share on other sites

Added another method for earlier versions of AutoIt, that were before the inclusion of the RichEdit UDF.

NOTE - It works fine for me on Win XP, but fails on Win 7. Any solution to that would be greatly appreciated. :D


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Share this post


Link to post
Share on other sites

Well, I came up with a solution of sorts ... which works for me anyway, but not so great for sharing with an older AutoIt program of mine, that I hope to use it with, and I really do not want to recreate the program again in latest AutoIt, so I am still in need of a better solution.

I did quite a bit of research a few days ago, then went away for three days, so are just now attempting to recall the important bits, for those interested.

1. I installed the Visual Basic Runtime from here. That supposedly gave me the required library elements. This wasn't enough though.

2. Then doing some research both at the AutoIt Forum and online elsewhere, for the error message (Class is not licensed for use) that I was still getting, I came across Embedded activeX component - RichText. A post there mentions an ActiveX Fix, which I downloaded from here. The included reg file did the trick. I also came across what appears to be a similar thing, called vbctrls.reg, which is said to be located on the vb6 install CD, under \Common\tools\vb\controls. If that last had been at hand, I would have tried that first instead, but I have it buried away somewhere, and couldn't spare the time to find it ... and couldn't be bothered either. :P

P.S. I am not sure about the legality of that ActiveX Fix, so I have no intentions of recommending it. Users though, are free to do as they wish. It does seem odd to me though, that Microsoft have such a painful arrangement with these old controls, especially as the web is full of people struggling with a similar issue to mine. It is very much like VB .Net made VB6 programs redundant, which should not have been the case. According to what I have read, if the control was provided in a specific manner (attached to a form or something), then the licensing issue doesn't occur ... but I have no clue how to implement such in AutoIt ... if you even can.

Edited by TheSaint

AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Share this post


Link to post
Share on other sites

Added a slower embedded IE based version. This has an error in latest AutoIt so doesn't run, but runs fine in v3.3.0.0. Tested on Win XP and Win 7 (32 bit).

Quite slow on my Win 7 Netbook, but I imagine it would be much faster on most PC's, so quite usable. It could however, be much slower with some links/URLs.

The slowness, it seems to me, is due to a minimum web page load time that cannot be avoided, that I know of. Would be great if we could avoid the web page for the URL from loading at all.

Edited by TheSaint

AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By rudi
      Hello,
      the following script is running quite nicely for a friend of mine doing a year of work and travel to have a backup at home for all the pics and movies taken with her mobile phone,
       
      The facts:
       
      At home: a VMWARE virtual machine with dropbox installed for her DB account
      On-the-Road: One mobile phone, Camera Uploads are activated for her dropbox account, one Laptop.
       
       
      The idea is to have a copy of *ALL* pictures and movies taken with the mobile phone *OUTSIDE* the dropbox folder, so that the DB Max Size is never exceeded.
      The script is running at home and doing this:
      Copy all content from the "Camera Upload Folder" within the dropbox folder to some folder *OUTSIDE* the DB folder Move all content from the "Camera Upload Folder" do some other folder *INSIDE* the DB folder to indicate, that the backup copies at home were done successfully  
      Dropbox is also installed on the Laptop she has with her. So on the Laptop she checks from time to time the destination folder inside the dropbox folder and moves the pics / movies on the laptop to some other folder outside the dropbox as well. By that final step the images are moved out of the dropbox on the mobile phone as well, so that there is always space left to sync more pics / movies.
       
      As moving pics / movies out of the dropbox folder on the laptop doesn't touch the copies in the mobile phone's "Gallery", she has all the pics / movies at all three locations:
      Mobile Phone Laptop VM at home  
      The folder names propably are different for non-German localized Windows and Dropbox, just modify them to meet your localization.
      DBox-Sync.au3
    • By Rocker
      I apologize for my poor coding skills, but only on occasion do I have a need to automate a repetitious task to save time.  In a nutshell the following code is supposed to go to a website, save the site using Scrapbook (a plugin used by an older version of Firefox), rename the folder in Windows Explorer that Scrapbook assigns a random name for and then moves on to the next website, of which there are hundreds.  Everything works, except after the address bar gets populated with the URL, it's like the ENTER key never gets pushed.  The weird thing is, this worked yesterday before I left to go home and when I came in this morning it didn't work.  The next thing I'll be trying to learn is to loop this with a the list of the websites.  Thank you for your help!
      WinActivate( "[CLASS:MozillaWindowClass]" ) ;Apply focus to the open Mozilla firefox window Sleep(500) Send("^k") ;Apply focus to the address bar Sleep(500) Send("www.WEBSITE.com {ENTER}") ;Send the website to the address bar Sleep(10000) ;Wait for the website to fully open Send("!c") ;Opens the drop down menu for Scrapbook Sleep(2000) Send("{ENTER}") ;Selects the default drop down selection of save Sleep(20000) WinActivate( "[CLASS:CabinetWClass]" ) ;Applies focus to the open Windows Explorer window where the websites are saved Sleep(1000) Send("{SPACE}") ; Selects a folder in the folders list Sleep(200) Send("{HOME}") ;Moves to the top folder Sleep(200) Send("{F2}") ;Keyboard shortcut to rename the folder Sleep(200) Send("www.WEBSITE.com {ENTER}") ;Applies the new name to the folder  
    • By nacerbaaziz
      Hello all
      I have a question please
      I have a link to an .exe file
      for example this link
      https://www.nvaccess.org/files/nvda/releases/2017.1/NVDA_2017.1.exe
      I want to check if the link is exists orno
      surely  Without downloading the file
      is there any  function or a way to  do this?
      Thanks in advance
    • By Seminko
      Hey fellas,
      I'm looking for an easy way to get an URL from an active browser.
      Now, I know about chrome and IE includes but the script I'm writing will be used by users with different browsers, obviously. I can imagine have both IE and Chrome includes in the script, identifying what browser the user uses etc but I was wondering if there is any other easier way.
      Thanks
      Seminko
    • By dgm5555
      I'd like to create a dropbox uploader (and downloader) to provide a simple file sync without using the dropbox app.
      The following is my current code (cadged and modified from other posts and websites), but I can't even figure out how to get initial authorization. Can anyone help?
      NB I would be quite happy to use the oauth2 Generated access token if it bypassed a lot of this, but I'm not sure how to do this.
      (If you can't guess, I know virtually nothing about http calls)
      Alternatively if there is a working autoit dropbox up/downloader, I'm more than happy not to write my own (but couldn't find one)
      Thanks
       
      #include "WinHttp.au3" ; set the dropbox tokens ;to get the dropbox app_key and app_secret tokens, browse to https://www.dropbox.com/developers/apply?cont=/developers/apps and create a new app If $App_Key = "" Then $File = "" $App_Key = "" $App_secret = "" $Oauth_access_token = "" $Oauth_access_token_secret = "" ; this could possibly the personal Oauth2 Generated access token $App_folder = "" ; this is the name of your app - it's not currently needed in this code ; the folder where the uploaded file will be stored is: Dropbox/Apps/$App_folder EndIf Local $sURL = "https://api.dropbox.com/1/oauth/request_token " & _ "Authorization: OAuth oauth_version=""1.0"", oauth_signature_method=""PLAINTEXT"", " & _ "oauth_consumer_key=""" & $App_Key & """, " & _ "oauth_signature=""" & $App_secret & "&""" $hOpen = _WinHttpOpen() $FileHandle = FileOpen($File) $hConnect = _WinHttpConnect($hOpen, $sURL) $hRequest = _WinHttpOpenRequest($hConnect, "POST") _WinHttpReceiveResponse($hRequest) $sResult = "" Do $sResult &= _WinHttpReadData($hRequest) Until @error ;MsgBox(0, "", $sResult) ConsoleWrite($sResult & @CRLF) _WinHttpCloseHandle($hRequest) _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) ; response should be: ;oauth_token=<request-token>&oauth_token_secret=<request-token-secret> ;user will have to browse to the following and authorise the app ;https://www.dropbox.com/1/oauth/authorize?oauth_token=<request-token> ; you now need to generate an access token ; POST https://api.dropbox.com/1/oauth/access_token ; Header will be: ;Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="<app-key>", oauth_token="<request-token>", oauth_signature="<app-secret>&<request-token-secret>" ;reponse will be: ;oauth_token=<access-token>&oauth_token_secret=<access-token-secret>&uid=<user-id> ;now you can access the account and undertake actions ;eg get account info: ;GET https://api.dropbox.com/1/account/info ;Header: ;Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="<app-key>", oauth_token="<access-token>", oauth_signature="<app-secret>&<access-token-secret>" ; this function doesn't work, it will need to be modified to allow upload func upload($App_Key, $App_secret, $Oauth_access_token, $Oauth_access_token_secret, $File="") trayseticon("C:\Program Files\AutoIt3\Icons\cute panda.ico", -1) ; Get the file to upload Local $sDrive = "", $sDir = "", $sFilename = "", $sExtension = "" local $time=@HOUR & ":" & @MIN & ":" & @SEC local $Random = Random(0,32767,1) ; if a filename isn't passed to the function, then ask the user for one If $File = "" Then $File = fileopendialog("Pick something to upload", @desktopdir, "All (*.*)|Text files (*.txt)" ) EndIf ;message($File) ; Now open the file and load the data into memory local $array = _PathSplit($File,$sDrive, $sDir, $sFilename, $sExtension) ; get the file name and extension Local $i = UBound($array) - 1 local $sFile = fileopen($File,16) Local $data = fileread($sFile) local $size = @extended FileClose($File) ;set up the dropbox upload URL ;to get the dropbox tokens, browse to https://www.dropbox.com/developers/apply?cont=/developers/apps and create a new app ;$array[$i-1] is the file name of the file the user wants to upload and $array[$i] is the extension Local $sUrl = ("https://api-content.dropbox.com/1/files_put/dropbox"&"/"& $array[$i-1] & $array[$i] & _ '?oauth_consumer_key=' & $App_Key & _ " & oauth_token=" & $Oauth_access_token & _ " & oauth_signature_method=PLAINTEXT & oauth_signature=" & $App_secret & "%26" & $Oauth_access_token_secret & _ " & oauth_timestamp=" & $time & _ " & oauth_nonce=" & $RANDOM) ;Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", ;oauth_consumer_key="<app-key>", oauth_token="<access-token>", ;oauth_signature="<app-secret>&<access-token-secret>" msgbox(1,"URL",$sUrl) ; now attempt to upload the file with the generated dropbox URL Local $obj = ObjCreate("WinHttp.WinHttpRequest.5.1") ;message("here") $obj.Open("PUT", $sURL, False) If @error Then MsgBox(1,"ERROR","@1unable to upload" & " " &$array[$i-1] & $array[$i]) else ; message("request opened") $obj.SetRequestHeader("User-Agent", "User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0") ;$obj.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded") $obj.SetRequestHeader("Content-Length", $size) ; if _FindNetwork() = "xavier" Then ; $obj.SetProxy(2, "number") ; endif ; message($sFile) $obj.Send($data) ; send the file to uploaded $oReceived = $obj.ResponseText $oStatusCode = $obj.Status If $obj.Status <> $HTTP_STATUS_OK Then ; local $FindError = FindError($oStatusCode) ; message($oReceived) msgbox(0 , "Error", "@2" & $oStatusCode & " :unable to upload " & $array[$i-1] & $array[$i]) else msgbox(0 , "success", "uploaded " & $array[$i-1] & $array[$i]) endif trayseticon("C:\Program Files\AutoIt3\Icons\panda.ico", -1) endif endfunc  
×
×
  • Create New...