Google Drive File Picker and Download the file

This articles should how to use picker on google drive and then download the picked files(limit to photos) use the javascript

Setup on google drive.

Go to the google developers console:  https://console.developers.google.com/
Create a new project or select a exist project,

and enable two libraries:  “Google Picker API” and “Google Drive API”
there are no special setup on “Google Picker API”, but for “Drive API”, it need go setup “Drive UI Integration”:

Client ID should same as the “OAuth 2.0 client IDs” in this project.
Open URL should same as the url of your web site domain, or a specific URL where you try to download the files.

Go back to Crediential of Oauth,

the same domain setup on previous steps is also list on “Authorized JavaScript origins”,

the open url we input on previous steps is list on “Authorized redirect URIs. it best list all your related URL into redirect URI.

prepare the keys we need on code step:

 //Google Client Id
var googleClientID='954222223338828-f21pukla0g67531760s0ed1575qaivth.apps.googleusercontent.com'
//Google App Id
var googleAppId='954222223338828'
//google drive picker
var googleDrivePickerDevelopKey='AIzaBHzK0WWvRj5DF9jgV6sTJpGwxzSyDfGcj0s'

That’s all in Google Console.

Let’s start write code for it.

First of all, insert the google js file into the html

<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
<script type="text/javascript" src="https://apis.google.com/js/client.js"></script>

The second js code is google client libriry,  it’s quickly and easy to use, but on this article, I’ll not use this one.

build the picker, remember we have 3 variables get from google console before, we need use on the code files.

First of all, let’s build the Picker.

/**Google drive ***/
var pickerApiLoaded = false;
var oauthToken;
var fileId;
//Photos Scope can't get the data we wanted, the solution, is use Drive only scope,
//And view.setMimeTypes("image/png,image/jpeg,image/jpg"); to only view the images
//  var googleScope = ['https://www.googleapis.com/auth/photos'];
var googleScope='https://www.googleapis.com/auth/drive.readonly'
// Use the Google API Loader script to load the google.picker script.

function loadPicker() {
    gapi.load('auth', {'callback': onAuthApiLoad});
    gapi.load('picker', {'callback': onPickerApiLoad});
}

function onAuthApiLoad() {
    window.gapi.auth.authorize(
        {
            'client_id': googleClientID,
            scope: googleScope,
            'immediate': false
        },
        handleAuthResult);
}

function onPickerApiLoad() {
    pickerApiLoaded = true;
    createPicker();
}

function handleAuthResult(authResult) {
    if (authResult &amp;&amp; !authResult.error) {
        oauthToken = authResult.access_token;
        createPicker();
    }
}

// Create and render a Picker object for searching images.
function createPicker() {
    if (pickerApiLoaded &amp;&amp; oauthToken) {
        var view = new google.picker.View(google.picker.ViewId.DOCS);
        view.setMimeTypes("image/png,image/jpeg,image/jpg");
        var picker= new google.picker.PickerBuilder()
            .enableFeature(google.picker.Feature.NAV_HIDDEN)
            .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
            .setAppId(googleAppId)
            .setDeveloperKey(googleDrivePickerDevelopKey)
            .setOAuthToken(oauthToken)
            .addView(view)
            .setCallback(pickerCallback)
            .build()
            .setVisible(true);

    }
}
// A simple callback implementation.
function pickerCallback(data) {
}<

We need download image after Picker, the photo scope on Picker can’t get the right file ID,  to solute this,  Use  drive scope and limit the mimeTypes.

Handle the data from File Picker and download it

function pickerCallback(data) {
 if (data.action == google.picker.Action.PICKED) {
 fileId = data.docs[0].id;
 $http.get('https://www.googleapis.com/drive/v2/files/' +fileId+ '?alt=media',
 {
   headers: {'Authorization': 'Bearer '+oauthToken}
 }).success(function(file){
   //file is the image object
 })
 }
}

$http is from angularJs, you can replace this with the js framework you used, or use the google client js library.

?alt=media

which will return the image, otherwise it will return json code with image name, image downloadUrl(that Url still need oauth token) etc.

headers: {'Authorization': 'Bearer '+oauthToken}

We need setup Authorization token on the hear, otherwise we can’t visit the file.

It’s simple, we can handle the image in the js code now,  but it’s not end for me, I need directly download the files on remote server, not download on the js code to user browser.

Let’s change the code to download the file on remote server

function pickerCallback(data) {
 if (data.action == google.picker.Action.PICKED) { 
   $http({
     method: 'POST',
     url: 'theUrlWhichDownloadImage.php',
     dataType: 'json',
     crossDomain: true,
     data: {
       oAuthToken:oauthToken,
       fileId: data.docs[0].id,
       name: data.docs[0].name,
       mimeType:data.docs[0].mimeType
     },
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}
   })
   .success(function (data2) {

   })
   .error(function (data2) {

   });
 }
}

replace with get the files from google drive api, we send the file id, the oauth token to remote server, which used to download the file.

and on the remote server, a php file was created and recevied the data, try to download the file from google drive.

 

$request_body = file_get_contents('php://input');
$param = (array)json_decode($request_body);
$oAuthToken = $param['oAuthToken'];
$fileId = $param['fileId'];
$getUrl = 'https://www.googleapis.com/drive/v2/files/' . $fileId . '?alt=media'; //
$authHeader = 'Authorization: Bearer ' . $oAuthToken;
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $getUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($authHeader));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

The image was on $data. save it and return the path to js code on fronend.

$path='examplepath/';
file_put_contents($path.$param['name'], $data)
//return the file URL to js code.

Compare to OneDrive, DropBox,  Google Drive File Picker and download files is much more complex. hope this Article can help you.

google adwords–google滚吧

在新的google adwords的优惠政策中有下列条款:

*本优惠只针对将广告展示在海外的进行出口贸易的新客户,其他行业用户暂不能享受。预存1000元获得350元; 预存3000元获得500元;预存5000元获得1000元;预存10000元,获得2000元。预存3000元以上获得账户建立,管理和优化服务。

注意这句:广告展示在海外的进行进出品贸易。而新消息说google在这周,最早在周一即今天会宣布与的政府的商谈结果。

Y的,两个都不是好鸟,即当婊子又立牌坊!

google离开的原因–google是因为中美关系而离开的

google离开的原因–google是因为中美关系而离开的

———-仅以能自己搜集到的信息做出有偏颇的判断

中美关系:我的认知中,美国也是不干净的,是被华尔街的家伙操纵着的

1:贸易战:自从去年开始爆发贸易战以来,随着G2的提议,中美之间的摩擦开始加剧

2:人民币汇率:我笃信《货币战争》的真实性,即使不相信,那么根据大学的西方经济学的理论也能得出一个理论:美元的霸主地位使其享有全世界货币的发行税,那么操纵汇率?很容易想清楚美国这么“关心”中国汇率的原因了。我不想一辈子打工,更不想一辈子替美国人打工。

3:气候会议:引用咸朗平的观点即气候会议是想让我们给美国人交呼吸税。中美在气候会议上爆发言词冲突的激烈的激烈程序是近年来国际会议上鲜见的。

4:台湾军售:中国的五天三次抗议,美国的一意孤行(我很想很中立的或者纯粹的经济利益的角度来说,但是在这个问题上每个中国人都免不了民族感情的)

5:反导导弹:是表面和平下面的反戈一击吗?!

为什么会说google是中美关系的一个棋子。google本身信奉don’t do evil,是一家以技术为主的公司,正如其界面的简单纯白。在中国拥有广大的拥蹩,也包括我。问题是控制google的却是西方财团,他们足有能够影响goog做出某些决定。

用一家清白的公司来实际一个阴暗不足为人道的阴谋。在中国的fans在痛惜google失去时,再向中国政府施压,往往能取得意想不到的效果。

即:google离开的原因–google是因为中美关系而离开的,我很可惜它的失去,但是不想看到它的离开也成为各方相互利用的工具来损害一个普通中国人的利益,因为我就是那个普通的中国人。

后google时代

大约在03第一次听同学介绍,使用了google。很奇怪自己竟然能够记住这个生涩的英语单词,喜欢上它的简洁。

记得04年暑假在网吧刷了两个月的uuzone(此网站已经倒下),仅仅为了一个gmail邀请。

进入大学后,因为学习和生活的原因,它成了我不可或缺的工具。

给我印象最深的是:离开大学前的毕业论文,老师判断是否抄袭的依据就是随机选取几句话在google中搜索。

至今,google reader、gmail、calendar、docs、analytics、adsense……

它已经成了我生活的一部分,甚至是赚钱的工具。

几年过去了,我依旧习惯称它为“狗狗”,当初的创业者也并没有 改变他们的冲动,。在google的官方上直接抨击中国政府,高调退出中国市场。

事件已经无可挽回。

悲观的我认为google面临的结局只有完全被阻止访问(因为某些因素存在,我只能用这么拗口的语言)。

我们进入了后google时代……
继续阅读后google时代

fuck google documents

自从去年开始使用google文档后,便喜欢上了它。

只需要一个google帐户,便可以满世界乱跑,随时随地使用。

甚至于习惯在上面书写文档,再保存为word。

悲剧总是不经意间发生的:昨晚将一份方案保存后。今天上午在公司竟然打不开了。郁闷至极!

查看google套件的状态,曾发生过一次服务器错误,但是已经修复。为什么偏偏我的那份文档发生问题了呢?!是硬盘IO吗?还是什么问题,无解。fuck google documents.

错误据说已修复:

google文档
留下的后遗症:
google文档错误报告.jpg

人真他妈的贱,我竟然又开始在上面敲敲打打了,打的内容偏偏还是出错的那份文档。fuck! google!

google translate改版

google tranlsate改版了!

我应该大声地喊,用力地喊,还是声嘶力竭地喊。

变动了,

1:输入内容后自动翻译,感觉上使用axaj。

2:upload a document,(记不清楚以前有没有上传文件翻译功能了)

3:翻译好的文字有阅读功能

4:UI设计方面的改变,布局以及明显地用一个图标来表示改变语种

下面是截图时间,点击放大查看

google translate
google translate

http://blog.dengruo.com/200911/700

小结

每天七点四十起床,八点上班,然后喝上几杯咖啡,这样一天就过去了。早上睡醒时才发现已是周五,光阴似箭……

是的,光阴似箭——这个在小学时写日记经常出现的词语,又一次笨拙地把它搬了上来。对此,却无可耐何,但是终究时间不是白白流逝的。

至少整整一周的时间,面对着一台极其垃圾的CRT,我敲了N多的键盘,尝试着用drupal去做一个网站,这个我曾经想过对其上下其手N次的CMS,终于可以暴力组织起一个界面给他了。业务电话几乎是本能性地去拒绝接听,我无法忍受在我思考着如何组织一行代码表现的所要的效果时,思路被人打段。

关于企业邮箱的思考

当然偶偶接听一下网络公司的电话,听着甜美的女声在我面前班前弄斧也是不错的,开她们个无伤大雅的玩笑,可以让自己也让她们放松下。奇怪的是:最近这段时间邮箱的的销售的电话很多,是因为网络推广做烂了、做的人多了,新的所谓网络公司创业公司无处下手只能选择了邮箱?
个人还是喜欢google的企业套件或者是微软的自定义域名邮箱,本人现在在用的就是google的企业套件,或者这只是一个google fans对其的狂热。当然,老板的出发点和我们是不同,对于他们而言,一个邮箱可以让他们看到下面所有公司职员的信件记录是一个很重要的功能。可惜接了从头到尾不下三十来个邮箱的电话,提及这一功能的只有一家公司,对于大部分邮箱的推广公司来说,他们并没有抓住这点需求,他们的卖点还是集中安全性这些他们根本形成不了竞争力和并没有说服力的地方。
至于为什么老板会想要看职员的信件呢?是因为信件也是企业资源的一部分,员工走了,客户得留下这些原因?我想不是,归根结底在于:老板的控制欲以及中国并不明析的公权和私权界线,或者称之为没有隐私权的意识两点相结合。

不知道自己在卖什么的销售人员

当然,也有一个例外,公司准备开通263的邮箱(应该是一个垃圾公司注意了类似于**263.cc的域名,然后和网易的263混淆来扰乱视听的公司),域名的mx记录更改只能由来我做,当我告诉对方客户叫她把邮件发到我的邮箱([email protected])时,她竟然很幼稚地反问:怎么会有这种邮箱的?老大,拜托,你们是做企业邮箱的,那一刻,我真的想抓狂。

刷投票

在看了一天的代码后,老姐告诉我她公司要在一个网络上投票,说那个网站只能投一次,接一下就是IP地址绑定了,不能再投了。
我只能帮她解决这个问题,而现在回头想下,这个问题的解决过程是一个很有趣的过程。
1:路由重新拨号:众说周知,整个中国的IP地址的数量还不如美国一个大学的多,因为资源有限,除非你花很多钱装光纤,不然我们在上网的时候路由拨号都是随机获取一个IP的。所以我们只能重启下猫或者就可以得到一个新的IP。这是第一个解决方法。
ac:一台电脑也可以多次投票。麻烦,只能应用于投几十票的级别
2:改网页:原理是由本地生成表单并将这个值传给服务器的,我们只要能够发送出这个表单的值就可以,很可惜,刚开始我并不熟悉表单的传递的方式。我只能将网页保持到本地,而本地的网页是他服务器所不能控制的。测试,这种方式可以成功,也就是说这个网站在数据入库的时候并没有排查这个IP是否存在,它阻止的原理在于它的流程是,检查这个IP是否在数据库中存在,如果IP不存在则进入流程A:表单页-提交-入库-返回表单页:如果IP存在则进入流程B:生成一个页面你无法投票的。
ac:不用重启,只需要在浏览器上按几下就可以操作。投上百票的级别
3:仔细研究了下他的表单结构和input元素的值,直接用了提交页的地址+input函数的格式,测试成功。
ac:输入这个地址,不停地刷新就可以了。再搞个批处理直接投成千上万票了。
4:直接找了一个购买IP流量的网站,购买了500Ip流量,输入第三步取得的网址,直接将投票数拉升了2000.
ac:购买IP是一个很好的选择,第二三种方式的成功是基本他对数据入库时并没有进入IP检查的,如果有IP检查的话,通过购买IP流量就可以规避这点。

ps:用相同的思路,应该可以去投什么超女之类选秀的票了,只要弄到它们的表单传递值就可以了,只是表单有两种传递值的方式,这两种会不会对其产生影响。

科技是第一生产力。忘了是谁说的了,权当是我说的是。浪费了两个小时搞了上面这些东西就可以让老姐失去无数次按鼠标、键盘的机会的。
只是,据她说替她们公司做网站的公司说如果要刷票数的话只能用黑客手法攻入网站。这群白痴,也难怪有些土老板说网络公司是骗子,是个葱就可以开网络公司了。

音响的声音开到最大,我以为这样就可放松自己,忘了你,就让风飘落,水东流去……

以视频作结尾

猪狗不如,这句话是形容人之差劲的。那么猪和狗里面到底哪个更不如呢?至少狗还可以给我一个比猪智力高点的印象,用这个思维来描述,下面这个人就是将猪当狗训练的了。

西天也许有;空想前往,又有何用

西天也许有;空想前往,又有何用
苏东坡临死时说的
不想自己死的时候重复这句话。
努力了,放弃幻想,脚踏实地。

垃圾站50M的数据库,计划在昨天转移完成的,却因为地震导致了光缆中断无法进行操作,今天却马上恢复了正常,有人说是将路由进行转移过的原因。用上帝国备份王,顺利地转移了数据。下一步就是将采集的关键词恢复正常的,等等google adsense的帐号到达$100试下会不会被K号。

垃圾站采用新页面主题的优化和采集关键词的恢复大致需要两天时间,两天后就可以和老姐搞国内的东西了。谁让我是一个被穷疯的人呢。

高手的后续:很庆幸,我没有丧失思考的能力与思考的空间。他说的和我平常了解的也没有什么区别,区别在于有没有用心去做。当然,周日在茶馆里面的交流和这两天在网上的沟通以及看了他写的seo方案,触到还是挺大的,至少我一直所想要的系统性思维我就没做好。当然最重要的一点,他毕竟现在在做浙江在线的seo工作,所以整个思维的高度也和我的不一样。