V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lpisces
V2EX  ›  分享创造

刚学了下rails,写了个淘宝客网站玩玩

  •  
  •   lpisces · 2013-03-18 16:16:11 +08:00 · 5547 次点击
    这是一个创建于 4054 天前的主题,其中的信息可能已经有所发展或是发生改变。
    25 条回复    1970-01-01 08:00:00 +08:00
    iYu
        1
    iYu  
       2013-03-18 16:43:30 +08:00
    请问 这些信息是人工编辑还是爬虫自己爬的阿。
    lpisces
        2
    lpisces  
    OP
       2013-03-18 16:45:06 +08:00
    用ruby调用淘宝rest api
    acpp
        3
    acpp  
       2013-03-18 23:29:58 +08:00
    @lpisces 我能问下 刚学是学了多久吗? 难道是刚刚看了点内容,就开始做这个了吗,还是之前有搞过
    huyipeng
        4
    huyipeng  
       2013-03-18 23:38:10 +08:00
    你好,能请教一下你是如何用ruby处理淘宝API的?
    lyhapple
        5
    lyhapple  
       2013-03-19 11:00:23 +08:00
    问一下,前期准备工作有哪些,要怎么才能申请到淘宝API, 比哪网站域名或空间是否需要备案等等.
    再讲讲API的处理方式吧。
    lpisces
        6
    lpisces  
    OP
       2013-03-19 12:08:15 +08:00
    @acpp 之前搞过php,python之类的
    花了两个礼拜把ror guide看了一遍

    @lyhapple 这个是实验性质的,很多地方很粗糙,打算重构。 vps是香港的

    api调用

    def sign(app_secret, params)
    str = []
    str << app_secret
    str << params.sort.join
    str << app_secret
    Digest::MD5.hexdigest(str.join).upcase
    end

    def api_url
    api_url = 'http://gw.api.taobao.com/router/rest'
    end

    def url(params)
    url = []
    params.sort.each {|k, v| url << (k.to_s << '=' << URI.encode(v.to_s).to_s)}
    api_url << '?' << (url.join '&')
    end

    def get(url)
    res = Net::HTTP.get_response(URI.parse(url))
    res.body
    end

    def product_params(app_key, app_secret, cid)
    params = {}
    params[:format] = 'json'
    params[:timestamp] = (Time.now).strftime("%Y-%m-%d %H:%M:%S")
    params[:sign_method] = 'md5'
    params[:v] = '2.0'
    params[:method] = 'taobao.taobaoke.items.coupon.get'
    params[:fields] = ['item_imgs', 'num_iid', 'seller_id', 'nick', 'title', 'price', 'item_location', 'seller_credit_score', 'click_url', 'shop_click_url', 'pic_url', 'taobaoke_cat_click_url', 'keyword_click_url', 'coupon_rate', 'coupon_price', 'coupon_start_time', 'coupon_end_time', 'commission_rate', 'commission', 'commission_num', 'commission_volume', 'volume', 'shop_type'].join ','
    params[:cid] = cid
    params[:keyword] = ''
    params[:sort] = 'volume_desc'
    params[:app_key] = app_key
    params[:page_no] = 1
    params[:page_size] = 100
    params[:shop_type] = 'b'
    params[:sign] = sign(app_secret, params)
    params
    end

    task :product => :environment do
    app_key = Setting.g 'app_key', 'taobao'
    app_secret = Setting.g 'app_secret', 'taobao'
    categories = Category.where("level = ? or id = ?", 2, 50008055).all
    categories.each do |c|
    next if TaobaoCategory.where(:cid => c.id).first.nil?
    params = product_params app_key, app_secret, c.id
    json = get(url(params))
    p json
    products = ActiveSupport::JSON.decode(json)
    next if products.nil? || products['taobaoke_items_coupon_get_response'].nil? || products['taobaoke_items_coupon_get_response']['taobaoke_items'].nil?
    items = products['taobaoke_items_coupon_get_response']['taobaoke_items']['taobaoke_item']
    next unless items.respond_to? :each
    items.each do |p|
    img_json = get(url(img_params app_key, app_secret, p['num_iid']))
    imgs = ActiveSupport::JSON.decode(img_json)
    imgs = imgs['items_list_get_response']['items']['item']
    unless imgs[0]['item_imgs'].empty?
    p['imgs'] = []
    imgs[0]['item_imgs']["item_img"].each do |i|
    p['imgs'] << i['url']
    end
    end
    save_product p, c.id, Product
    end
    end
    end

    代码凑活看吧
    insub
        7
    insub  
       2013-03-19 12:37:46 +08:00
    麻烦问下,从动手到上线花了多长时间呢?同为railser.
    lpisces
        8
    lpisces  
    OP
       2013-03-19 13:27:50 +08:00
    @insub 这个不算上线吧,很多想写的没有写,现在你看到的这些业余时间一个礼拜左右吧
    xgdy
        9
    xgdy  
       2013-03-19 13:32:22 +08:00
    @lpisces 挺不错..
    不会写,眼馋
    lpisces
        10
    lpisces  
    OP
       2013-03-19 13:37:17 +08:00
    @xgdy

    不会写没关系啊,写代码的都是码农,有点子就行

    不想做满大街的美丽说那种

    不知道你有啥好点子
    xgdy
        11
    xgdy  
       2013-03-19 13:44:52 +08:00
    @lpisces 一直致力于成为码农,可惜进展太慢.

    你现在这个点子就不错啊

    目标精准,只要有IP,就会有提成拿了
    lpisces
        12
    lpisces  
    OP
       2013-03-19 15:29:04 +08:00
    @xgdy 那有那么简单,做得不好,重新推到
    xgdy
        13
    xgdy  
       2013-03-20 08:33:36 +08:00
    @lpisces 别推到啊.挺好的..求分享
    da_a
        14
    da_a  
       2013-03-20 13:00:34 +08:00
    @lpisces 淘宝客怎么玩?
    lpisces
        15
    lpisces  
    OP
       2013-03-20 14:16:53 +08:00
    insub
        16
    insub  
       2013-03-20 16:44:09 +08:00
    @lpisces

    thk!
    不过其实我是一直为自己的不够敏捷所困扰,所以有那么一问....往往预估工作量也就一周,打算一个月上线的项目,常常要两个甚至三个月上线。目前虽有改善但还是比较苦恼。
    有什么经验可以传授么?
    da_a
        17
    da_a  
       2013-03-20 18:15:19 +08:00
    @lpisces 谢谢 我其实是在问淘宝客模式
    Mac
        18
    Mac  
       2013-03-20 18:48:38 +08:00
    淘宝客现在不反现金了吧?反的是积分?
    xgdy
        19
    xgdy  
       2013-03-21 09:31:19 +08:00
    @lpisces 谢谢~ 我去看看
    lpisces
        20
    lpisces  
    OP
       2013-03-21 16:46:43 +08:00   ❤️ 1
    @insub 其实我跟你的问题一样,总是寻求一个敏捷的方式,但是总被各种因素干扰。

    我现在觉得就是快速实现原型,然后推到重构。这样最少可以有一个直观的东西让人看到,自己也可以在实现原型的过程中发现问题,便于在重构时避免跳进重复的坑。这就是传说中的快速迭代。

    关于rails,我觉得快速开发是其最大的特点之一,但是其与众不同之处是bdd这种模式,很可惜,我对unit test,RSpec这样的东西不是很了解,但觉得是很好的东西,应该用起来提高代码质量。不能总是用smoking ping模式来调试代码。然后用bdd模式写代码可以让自己目标性更加强一点。

    现在这个demo完全没有test代码,可见一斑。

    粗浅见解,见笑了~
    lpisces
        21
    lpisces  
    OP
       2013-03-21 16:48:11 +08:00
    @xgdy 你想的太美好了,全都是只看不买的
    insub
        22
    insub  
       2013-03-21 16:57:51 +08:00
    @lpisces

    至今基本上还是 原型 -》 代码 -》 ps稿 -》上线的流程,现在感觉这流程没法快速迭代。。。

    一直没胆做推倒重构的准备,主要是觉得成本太高,怕做着做着发现业务上走不通,觉得粗粒度原型还是有必要的,不管在纸上还是axure

    我也不写test,主要是觉得不必担心bug,但会担心安全问题怕有遗漏
    原型的话会用纸张或axure,但常常画到一半就不画了,因为设计也是我自己做,经常就会ps稿当原型琢磨,现在几个项目下来感觉这样还是不靠谱,常常因为设计导致原型拖延

    现在是设计上卡的比较多,有点强迫症,太难看实在接受不了就这么上线,苦求设计师而不得啊
    lpisces
        23
    lpisces  
    OP
       2013-03-21 17:16:08 +08:00
    @insub 我觉得还有一条纠结的原因就是 “造轮子” 的问题,不知道你怎么看这个。

    打个比方说,基本上每个项目都要写后台,于是rails有了rails_admin,active_admin这种东西。每个项目都要有认证,于是有了divise这种东西。ruby china上的观点说rails_admin这种东西都是玩具,都得自己写。不然遇到不满足需求然后自己搞不定或者搞定成本大于自己搞就完蛋了。

    但是我觉得rails之所以敏捷,是因为它把很多开发中要用到东西都集成进框架了。

    我说的重构不是每一行代码都重写。我觉得在原型设计阶段要定义好数据结构的大方向,这部分在后面的重构是不应该动大刀子的,除非应用的负载上涨到了质变。

    重构的是vc层面的东西。
    insub
        24
    insub  
       2013-03-21 18:08:05 +08:00
    @lpisces

    造轮子的错误现在犯得少了
    rails的话,标准化需求,比如用户系统,比如分页,比如搜索,都是直接用gem包的
    但是rails_admin之类确实...很不实用,我是自己写一个scaffold_controller_admin方法,然后自己维护一个templates。比较好的解决了我后台管理系统的问题。

    我仔细分析了一下,大部分其实是卡在了设计上面。目前这个项目有点特殊,核心业务没有现成的参考,技术选型反复了四五次那么多,浪费了两周时间,但也还算值得。
    lpisces
        25
    lpisces  
    OP
       2013-03-22 08:57:44 +08:00
    @insub 这么说的话跟技术关系不大,只是你不知道你要做什么,所以耽误了很多时间
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4745 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:00 · PVG 12:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.