aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 17950|回复: 11

简单的淘宝API库-修正版

[复制链接]

53

主题

216

回帖

1708

积分

四级会员

积分
1708
发表于 2013-11-8 16:29:32 | 显示全部楼层 |阅读模式
去年写的那个不能用了,稍微改了下又好用了,申请appkey到这里http://my.open.taobao.com/





  1. io.open();//打开控制台

  2. class TopClient{
  3.     ctor(default){
  4.         import string.md5;
  5.         import inet.whttp;
  6.         import inet.url;
  7.         
  8.         this.whttp = inet.whttp();
  9.     }
  10.    
  11.     appkey = "11111111";

  12.     secretKey = "222222222222";

  13.     gatewayUrl = "http://gw.api.taobao.com/router/rest";

  14.     format = "json";

  15.     signMethod = "md5";

  16.     apiVersion = "2.0";
  17.        
  18.         sdkVersion = "top-sdk-aardio-2013-11-08";
  19.     //sdkVersion = "top-sdk-aardio-2012-08-14";
  20.    
  21.    
  22.     //发送请求
  23.     exec = function(method,apiParams, session = false){
  24.         //组装系统参数
  25.         sysParams = {};
  26.         sysParams["app_key"] = this.appkey;
  27.         sysParams["v"] = this.apiVersion;
  28.         sysParams["format"] = this.format;
  29.         sysParams["sign_method"] = this.signMethod;
  30.         sysParams["method"] = method;
  31.         sysParams["timestamp"] =  tostring(..time(,"%Y-%m-%d %H:%M:%S"));
  32.         sysParams["partner_id"] = this.sdkVersion;
  33.         if (false != session){
  34.             sysParams["session"] = session;
  35.         }
  36.         //业务参数
  37.         apiParams= apiParams
  38.         //签名
  39.         sysParams["sign"] = this.generateSign(..table.concat(sysParams,apiParams))
  40.         //合并参数
  41.         params = ..table.concat(sysParams,apiParams);
  42.         //组装请求URL
  43.         requestUrl = this.gatewayUrl ++ "?"
  44.         for(k,v in  params ){
  45.             //..io.print(k,v)
  46.             requestUrl += k++ "=" ++ inet.url.encode(v,true) ++ "&"
  47.         }
  48.         requestUrl = ..string.trim(requestUrl,"&")
  49.         //发起请求
  50.         resp = this.whttp.get(requestUrl)
  51.         if(resp){
  52.             resp = ..string.fromto(resp)
  53.             return resp;
  54.         }else{
  55.             return false;
  56.         }
  57.     }
  58.    
  59.     //======================================
  60.     //生成签名
  61.     generateSign = function(params){
  62.         stringToBeSigned = "";
  63.         stringToBeSigned += this.secretKey;
  64.         for k,v in this.kpairs(params){
  65.             stringToBeSigned += k++v;
  66.         }
  67.         stringToBeSigned += this.secretKey;
  68.         stringToBeSigned = ..string.fromto(stringToBeSigned,0,65001)    //转为utf8编码
  69.         return ..string.md5(stringToBeSigned)
  70.     }
  71.    
  72.     //======================================
  73.     //键名排序
  74.     kpairs = function(tab,f){
  75.         //kpairs被调用时创建闭包
  76.         var tarr = {}
  77.         //字典中的数据复制到一个数组中然后进行排序
  78.         for k in tab
  79.             ..table.push(tarr, k);
  80.             ..table.sort(tarr, f);//调用默认的排序函数f对字典中的键进行排序
  81.         var i = 0 //迭代器计数器.(在闭包中保存值)
  82.         return function () { //迭代函数
  83.             i = i + 1
  84.             if(not tarr[ i ])
  85.                 return null
  86.             else
  87.                 return tarr[ i ], tab[tarr[ i ]]
  88.         }
  89.     }
  90. }






  91. tc = TopClient();
  92. tc.appkey = "你申请的appkey111111111111";                       //这个需要自己申请
  93. tc.secretKey = "你申请的secretKey222222222222222222";             //同上
  94. tc.format = "json";                         //返回数据格式,不设置的话,默认返回json

  95. //这个api  http://api.taobao.com/apidoc/api.htm?spm=0.0.0.0.vuLkMI&path=cid:9-apiId:68
  96. method = "taobao.shop.get"              //请求的API,
  97.                                                       
  98. parameter = {                                   //参数
  99.     ['fields'] = "sid,cid,title,nick,desc,bulletin,pic_path,created,modified";
  100.     ['nick'] = "柠檬绿茶";
  101. }
  102. session = "sfdshdgshdgliuengias..."       //这个是可选的,有的API需要,有的不需要

  103. var re = tc.exec(method,parameter)            //发送请求..

  104. io.print(re)
  105. execute("pause") //按任意键继续
  106. io.close();//关闭控制台

复制代码

5

主题

429

回帖

2420

积分

五级会员

积分
2420
发表于 2013-11-8 17:34:19 | 显示全部楼层
感谢楼主分享源码,一些小建议:

1、string.md5是扩展库函数,而 crypt.md5 是标准库函数,建议使用 crypt.md5。
2、标准库里有个函数 inet.url.stringifyParameters 可以直接将表格式化为URL参数格式.
3、aardio里普通变量名首字符最好小写,大家遵守相同的规范有利于增强代码的可读性。
4、exec里的参数拼接,我的理解是用户参数与系统参数的合并?这个是不是 table.assign( 用户参数,系统参数 ) 一句就可以搞定的事?! 没理解你为什么反复的 table.concat() ? 而且这个  table.concat() 主要用于拼接数组,例如你的表里面有个数值键,那他就会忽略所有非数值索引的值,所以混合表参数最好使用 table.assign()
5、tc这样的双字母变量应尽可能声明为局部变量

下面是小改后的代码,供参考:


  1. import crypt;
  2. import inet.whttp;
  3. import web.json;
  4.         
  5. class taobaoClient{
  6.     ctor(default){
  7.         this.whttp = ..inet.whttp();
  8.     }
  9.    
  10.     appkey = "";
  11.     secretKey = "";
  12.     gatewayUrl = "http://gw.api.taobao.com/router/rest";
  13.     apiVersion = "2.0";
  14.     sdkVersion = "top-sdk-aardio-2013-11-08";
  15.    
  16.     //生成签名
  17.     generateSign = function(params){
  18.         stringToBeSigned = "";
  19.         stringToBeSigned += this.secretKey;
  20.         for  k,v in ..table.eachName(params){
  21.             stringToBeSigned += k++v;
  22.         }
  23.         stringToBeSigned += this.secretKey;
  24.         stringToBeSigned = ..string.fromto(stringToBeSigned,0,65001)    //转为utf8编码
  25.         return ..crypt.md5(stringToBeSigned)
  26.     }
  27.      
  28.    
  29.     //发送请求
  30.     exec = function(method,apiParams,session){
  31.         var  params  = ..table.assign(   
  32.             apiParams,{
  33.                 app_key = this.appkey;
  34.                 v = this.apiVersion;
  35.                 format = "json";
  36.                 sign_method = "md5";
  37.                 method = method;
  38.                 timestamp =  tostring(..time(,"%Y-%m-%d %H:%M:%S"));
  39.                 partner_id =  this.sdkVersion;
  40.                 session = session;
  41.             }
  42.         );  
  43.         params["sign"] = this.generateSign(params);
  44.          
  45.         var requestUrl = this.gatewayUrl + "?" + ..inet.url.stringifyParameters(params,true);
  46.         var html = this.whttp.get(requestUrl)
  47.         if(html){
  48.             html = ..string.fromto(html);
  49.             return ..web.json.parse(html);
  50.         }
  51.     }
  52.    
  53.     @{
  54.         _get = function(method){
  55.             return function(apiParams,session){
  56.                 return this.exec(method,apiParams,session)
  57.             }
  58.         }
  59.     }
  60. }

  61. var taobao = taobaoClient();
  62. taobao.appkey = "你申请的appkey"; //这个需要自己申请
  63. taobao.secretKey = "你申请的secretKey"; //同上                                         

  64. //使用 taobao["taobao.shop.get"] 可直接返回REST接口函数
  65. var re = taobao["taobao.shop.get"]( {
  66.     ['fields'] = "sid,cid,title,nick,desc,bulletin,pic_path,created,modified";
  67.     ['nick'] = "柠檬绿茶";
  68. } )  

  69. import console;
  70. console.dump( web.json.stringify(re,true) )
复制代码

0

主题

4

回帖

48

积分

新手入门

积分
48
发表于 2013-11-8 17:07:55 | 显示全部楼层
做什么用的?

0

主题

14

回帖

202

积分

二级会员

积分
202
发表于 2013-11-9 09:55:15 | 显示全部楼层
谢谢分享~~~

0

主题

17

回帖

117

积分

一级会员

积分
117
发表于 2013-11-10 20:46:13 | 显示全部楼层
太好了,今天正好用到呢

9

主题

86

回帖

630

积分

三级会员

叫我何细尔

积分
630
QQ
发表于 2013-11-11 22:21:08 | 显示全部楼层
神马真强人。。。。多次看到,并在帖子中受益

0

主题

17

回帖

117

积分

一级会员

积分
117
发表于 2013-12-6 16:43:27 | 显示全部楼层
正式环境测试中appkey接口流量限制说明
【除 top商务支持,top技术支持,淘宝开放平台,服务平台2四个ID发的帖子外,其余帖子的链接可能会有钓鱼风险,请勿点击或复制打开】

亲爱的开发者:
为了加强对淘宝卖家数据的保护, 对正式环境测试的appkey,在5000次流量基础上,再对商品、交易等每个接口的调用次数再做了限制,只提供开发测试所需。需要大量开发测试的话,建议使用以沙箱(沙箱使用说明),是没有流控限制的
12月3号发布的,今天测试,很快就不能使用了

0

主题

17

回帖

117

积分

一级会员

积分
117
发表于 2013-12-6 16:44:14 | 显示全部楼层
有什么办法可以解决吗?

0

主题

17

回帖

117

积分

一级会员

积分
117
发表于 2013-12-6 16:45:59 | 显示全部楼层

53

主题

216

回帖

1708

积分

四级会员

积分
1708
 楼主| 发表于 2013-12-6 18:46:57 | 显示全部楼层
丁丁折扣商城 发表于 2013-12-6 16:45
http://dev.open.taobao.com/bbs/read.php?tid=24648

mei'ban'fa,隔天再测或者换appkey

53

主题

216

回帖

1708

积分

四级会员

积分
1708
 楼主| 发表于 2014-8-21 10:37:45 | 显示全部楼层
刚用了一下,还可以使用  

2

主题

34

回帖

307

积分

二级会员

积分
307
发表于 2014-9-7 09:07:00 | 显示全部楼层
Good
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-4-16 22:18 , Processed in 0.090200 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表