paulsteigel > 27-08-15, 05:28 PM
(27-08-15, 01:43 PM)thucgia Đã viết: .....1. Bạn cần login bằng tài khoản gmail của bạn trước đã
Hình như giao diện đường link :
https://console.developers.google.com/project
bi giờ đã được thay đổi, nên mình không thể lấy được Client ID và Client secret như bạn hướng dẫn. Hay là Google thay đổi chính sách không?
maidinhdan > 27-08-15, 05:33 PM
thucgia > 27-08-15, 05:40 PM
(27-08-15, 02:05 PM)paulsteigel Đã viết:(27-08-15, 09:05 AM)paulsteigel Đã viết:(27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu
Vì tớ lười lười - thôi để đóng vào cái demo vậy...
Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.
thucgia > 27-08-15, 05:58 PM
(25-08-15, 01:38 PM)paulsteigel Đã viết:
Googdrive...tiếp nào
Sau thời gian nghiên cứu và mày mò, có vẻ công cụ tải file, upload file lên googdrive bằng VBA là hoàn toàn khả thi.
Hôm nay tôi xin phép giới thiệu với các bạn phần đầu của nỗ lực này nhé.
Trước hết, để tiện lợi cho việc viết bài, tôi sẽ lấy một ứng dụng mở của tôi sử dụng làm thí nghiệm.
A. Để làm việc được với Googdrive từ VBA hoặc bất cứ ứng dụng nào không phải là giao diện Web, bạn cần thỏa mãn được mấy điều kiện sau:
+ Có một Ứng dụng được tạo ra để truy cập vào các dịch vụ của Google
+ Ứng dụng này được tạo ra với các thông số tối thiểu sau
* AppID (Mã ứng dụng). Trong ví dụ của tôi là [openstore-1034]
* ClientID (Mã ứng dụng khách). Trong ví dụ của tôi là ["759747656687-rjkm22bit7ob5tufc5sbgg1gsuj48fme.apps.googleusercontent.com"]
* ClientSecret (mã bí mật của ứng dụng khách). Trong ví dụ của tôi là ["Jf5DqXlZ2G3cOtUtHIraaxvQ"]
+ Khi ứng dụng này truy cập vào bất cứ dịch vụ nào, người dùng cần phải truy cập vào tài khoản gmail sau đó phải chấp thuận cho ứng dụng sử dụng.
...
==============================================================
Do bài viết của tôi không thể đăng được, các bạn có thể đọc ở tài liệu sau đây nhé
Bài đọc chi tiết
==============================================================
Liên kết tải file ví dụ ở đây
http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
Chúng ta có thể thấy kết quả như trong sheet1 với việc dùng Json2table nhé.
Tiếp cận với tải file lên, tải xuống, xóa ... vv sẽ làm tương tự.
Đến đây xin tạm dừng bài viết đã nhé.
Chúc các bạn vui vẻ.
thucgia > 27-08-15, 08:18 PM
(27-08-15, 02:05 PM)paulsteigel Đã viết:(27-08-15, 09:05 AM)paulsteigel Đã viết:(27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu
Vì tớ lười lười - thôi để đóng vào cái demo vậy...
Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.
thucgia > 27-08-15, 11:13 PM
(27-08-15, 02:05 PM)paulsteigel Đã viết:(27-08-15, 09:05 AM)paulsteigel Đã viết:(27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu
Vì tớ lười lười - thôi để đóng vào cái demo vậy...
Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.
paulsteigel > 27-08-15, 11:17 PM
(27-08-15, 08:18 PM)thucgia Đã viết: ...
hix mình tìm thấy các thông số ấy rồi, cám ơn.
Bạn có thể demo một ví dụ đơn giản như view tên các tập tin trong google drive vào trong một cái textbox(chẳng hạn) để anh em tham khảo được không, cái nén file này rắc rỗi quá. thank you for share
paulsteigel > 27-08-15, 11:29 PM
(27-08-15, 11:13 PM)thucgia Đã viết:Quản lý với Google Site là một vấn đề hoàn toàn khác và nó có thể coi là vượt quá năng lực và nguồn lực hiện tại của mình.(27-08-15, 02:05 PM)paulsteigel Đã viết: .......
Vì tớ lười lười - thôi để đóng vào cái demo vậy...
Bạn có nghiên cứu upload lên google site chưa? nếu up được thì tiện dụng hơn.
paulsteigel > 28-08-15, 11:37 AM
Function UploadResumable(filename As String, Token As String, Optional FileID As String = "") As Boolean
'============================
'Tham số chính
'FileName : Tên file cần tải lên
'Token : Mã xác thực
'FileID : Chưa cần dùng (đây là mã file cần update)
'Nếu tải lên thành công, hàm sẽ trả về giá trị true
'============================
Dim params As String, xhr As Object, res As String, urls As String, method As String, mimeType As String
' thiết lập các tham số tải lên
'params = "alt=json"
params = params + "&uploadType=resumable"
' Đường dẫn để tải
urls = "https://www.googleapis.com/upload/drive/v2/files"
' Kiểm tra nếu có mã file thì thay phương thức
If FileID <> "" Then
params = params + "&setModifiedDate=true"
urls = urls + FileID
method = "P+U+T"
Else
method = "P+O+S+T"
End If
'Bước 1: Tải thẻ file để đăng ký khu vực lưu trữ trên GoogleDrive
urls = urls + "?" + params
' lấy kiểu nội dung ứng dụng ví dụ application/ms word ....
mimeType = GetMimeType(filename)
' tạo đối tượng kết nối với Internet, sử dụng phương thức Latebound, không cần tham chiếu thư viện
Set xhr = CreateObject("MSXML2.XMLHTTP")
' Thiết lập thông điệp tải lên
With xhr
' Tôi phải dùng hàm replace để giúp đăng được bài lên diễn đàn vì có lẽ họ cấm không cho đăng tải các nội dung có chữ GET...
.Open Replace(method,"+",""), urls, False
.Setrequestheader "Content-Type", "application/json; charset=UTF-8"
.Setrequestheader "Authorization:", Token
.Setrequestheader "X-Upload-Content-Type", mimeType
.Setrequestheader "User-Agent", Application.name
' lưu ý thông tin gửi lên phải ở dạng mảng byte
.send (Utf8BytesFromString("{'title': '" + GetFileName(filename) + "'}"))
' Kiểm tra lỗi
If .Status <> 200 Then
' check for error type and response to user
GoTo ExitFunction
End If
' lấy về vị trí file đã được Google thiết lập
urls = xhr.getResponseHeader("Location")
End With
' Thực hiện xong bước 1, giờ tải tiếp nội dung
'Bước 2: Tải nội dung
' Giờ đã có khu vực lưu trữ, dùng phương thức PUT
method = "+P+U+T+"
With xhr
.Open Replace(method,"+",""), urls, False
' Tiếp tục các khai báo thông thường
.Setrequestheader "Authorization:", Token
.Setrequestheader "Content-Type", mimeType
.Setrequestheader "Content-Length", GetFileSize(filename)
.Setrequestheader "User-Agent", Application.name
' Gửi dữ liệu của file dưới dạng mảng nhị phân
.send (pvToByteArray(GetFileBinary(filename)))
If .Status <> 200 Then
' check for error type and response to user
GoTo ExitFunction
End If
End With
' Tải thành công
UploadResumable = True
ExitFunction:
End Function
paulsteigel > 02-09-15, 05:30 PM
Option Explicit
''' WinApi function that maps a UTF-16 (wide character) string to a new character string
Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As Long
' CodePage constant for UTF-8
Private Const CP_UTF8 = 65001
''' Return byte array with VBA "Unicode" string encoded in UTF-8
Public Function Utf8BytesFromString(strInput As String) As Byte()
Dim nBytes As Long
Dim abBuffer() As Byte
' Get length in bytes *including* terminating null
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, vbNull, 0&, 0&, 0&)
' We don't want the terminating null in our byte array, so ask for `nBytes-1` bytes
ReDim abBuffer(nBytes - 2) ' NB ReDim with one less byte than you need
nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, ByVal VarPtr(abBuffer(0)), nBytes - 1, 0&, 0&)
Utf8BytesFromString = abBuffer
End Function
Function LoginGoogle(gAccountName As String, gPassword As String) As Boolean
Dim oHttp As Object, sHTML As String
Dim google_accounts_url As String, authentication_url As String, gmailUrl As String, i As Long
Dim d As String
google_accounts_url = "http://accounts.google.com"
authentication_url = "https://accounts.google.com/ServiceLoginAuth"
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
Dim htmlDoc As Object, Galx As Object
Set htmlDoc = CreateObject("HtmlFile")
Dim Cookie As Variant, UserDetails As String
With oHttp
' First release a get request
.Open replace("G+E+T","+",""), google_accounts_url, False
.Send
While .readyState <> 4
DoEvents
Wend
Cookie = Split(.getResponseHeader("Set-Cookie"), ";")
htmlDoc.body.innerHTML = .ResponseText
Set Galx = htmlDoc.getElementsByName("GALX")
d = "&GALX=" + Galx(0).Value
d = d + "&continue=https://www.google.com/?gws_rd=ssl&hl=en&_utf8=?"
d = d + "&bgresponse=js_disabled&pstMsg=1&dnConn=&checkConnection=youtube:206:1"
d = d + "&checkedDomains=youtube"
d = d + "&Email=" + gAccountName + "&Passwd=" + gPassword
d = d + "&PersistentCookie=yes&signIn=Sign in"
.Open replace("P+O+S+T","+",""), authentication_url, False
.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
.setRequestHeader "User-Agent", Application.name
.setRequestHeader "Host", "accounts.google.com"
.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
.setRequestHeader "Accept-Language", "en-US,en;q=0.5"
For i = 0 To UBound(Cookie)
.setRequestHeader "Cookie", Cookie(i)
Next
.setRequestHeader "Connection", "keep-alive"
.setRequestHeader "Referer", "https://accounts.google.com/ServiceLoginAuth"
.setRequestHeader "Content-Length", Len(d)
.Send (Utf8BytesFromString(d))
While .readyState <> 4
DoEvents
Wend
If InStr(.ResponseText, "Google Accounts") <> 0 Then LoginGoogle = True
End With
Exit_Sub:
Set htmlDoc = Nothing
Set oHttp = Nothing
End Function