以下内容为原创,转载请注明出处!   

     在项目中用到了多说评论系统,由于之前没有用到过,只有自己摸索了。项目网站是有自己的一套用户系统的,而我们要做的就是和多说网站用户系统建立关联:


    它依赖jwt第三方库,安装:pip install pyjwt(刚开始傻不啦叽的装jwt,后来发现错了!请注意是PyJWT)


一:首先注册多说并且配置好项目(此处默认配置好了):

        在【工具】-->>【获取代码】中可以拿到通用代码,放在html里面即可显示如下效果:

<div class="ds-thread" data-thread-key="{{product_info.id}}" data-title="{{product_info.name}}" data-url="/authzn/content/{{product_info.id}}.html"></div>
                    <!-- 多说评论框 end -->
                    <!-- 多说公共JS代码 start (一个网页只需插入一次) -->
                   <script type="text/javascript">
                   url = window.location.href
                   var duoshuoQuery = {
                   short_name:"****",//此处为配置的二级域名,不需要修改
                   sso: { 
                        login: url,//替换为你自己的回调地址
                        logout: "http://180.186.38.154:9003/authzn/logout/"//替换为你自己的回调地址
                        }
                    };
                    (function() {
                     var ds = document.createElement('script');
                     ds.type = 'text/javascript';ds.async = true;
                     ds.src = 'http://static.duoshuo.com/embed.js';
                     ds.charset = 'UTF-8';
                     (document.getElementsByTagName('head')[0] 
                      || document.getElementsByTagName('body')[0]).appendChild(ds);
                    })();
                                            
                </script>
                <!-- 多说公共JS代码 end -->
                </div>

        

此处ds.src有个坑,我发现用通用代码配置这个src的话就加载不了这个js,然后导致拿不到code,所以我直接写成上述这样

1.png

二:使用多说第三方登入时我们需要同时登入自己的网站,也就是说第三方登入的时候同时用该信息注册本网站并且登入:

        将https://github.com/duoshuo/duoshuo-python-sdk  此代码下载,将duoshuo文件夹放在自己的项目中,

        1:第三方登入的时候我们会获取到一个参数code,将code以POST的方式提交到多说API,交换token。

        2:得到返回值:{u'access_token': u*****************************', u'user_id': u'***************', u'remind_in': 7775966, u'code': 0, u'expires_in': 7776000},我们就是靠user_id来建立连接。将信息保存到我们的数据库中,注:保存user_id是一定要用BigIntegerField类型

        3:代码如下

models.py:

    from django.contrib.auth.models import User

    class UserZn(User):
        phone = models.CharField(max_length = 20, verbose_name = u'手机号码', null = True, blank = True)
        auth_pwd = models.CharField(max_length = 16, verbose_name=u"用户密码", null = True, blank = True)
        duoshuoid = models.BigIntegerField(verbose_name=u'多说id', null=True, blank=True)
        access_token = models.CharField(max_length = 128, verbose_name = u'多说token', null=True, blank=True)


views.py:

    # 多说:将code以POST的方式提交到多说API,交换token.
    duoshuo_code = request.GET.get('code','')
    
    if duoshuo_code:
        api = DuoshuoAPI(short_name='******', secret='******')
        response = api.get_token(code=duoshuo_code)
        # 判断是否存在相同user_id,存在直接登入
        if UserZn.objects.filter(duoshuoid = response['user_id']).count() > 0:
            userzn = UserZn.objects.get(duoshuoid=int(response['user_id']))
            user = authenticate(username=userzn.username, password=userzn.auth_pwd)
            user_login(request, user)

        elif response.has_key('user_key'): #此多说账号在本站已经注册过了,直接登录
            user = User.objects.get(pk=int(response['user_key']))
            user_login(request, user)

        else: #此多说账号在本站未注册,添加一个用户
            response = api.users.profile(user_id=response['user_id'])['response']
            username = response['name']
            tmp_password = ''.join([random.choice('abcdefg&#%^*f') for i in range(8)]) #随机长度8字符做密码
            new_user = UserZn.objects.create_user(username=username, email='user@example.com', password=tmp_password) #默认密码和邮箱,之后让用户修改
            # new_user = UserZn.objects.get(user=new_user)
            new_user.duoshuoid = response['user_id'] #把返回的多说ID存到profile
            new_user.auth_pwd  = tmp_password
            new_user.save()
            user = authenticate(username=username, password=tmp_password)
            user_login(request, user)

三:当自己网站有一套自己的用户系统的时候,我们希望也能在多说上面评论,此时需要用到jwt方式处理了:

        一个已经有用户系统的网站使用多说评论框,可以通过cookie,告知多说用户在站点中的身份,让站点用户可以直接评论。对于之前已经登录过的多说用户,如果两个身份没有产生关联关系,也会优先显示站点中的身份。

        1:将当前站点用户信息以JWT( JSON Web Token ) 的方式处理,生成token,把token设置成的cookies,评论框加载时会从cookies中获取token,得到当前站点用户信息。及把本站用户导入多说,注册的同时注册多说,请看代码:

        api = DuoshuoAPI(short_name='***********', secret=‘*********’)
        response = api.users.imports(data={
            'users[0][user_key]' : user.id,
            'users[0][name]': user.username,
        })['response']
        user.duoshuoid = int(response[str(user.id)])
        user.save()

        通过实例化多说,然后api.users.imports即可得到返回信息,['response']里面的user_id:该用户在多说里面对应的duoshuo_id。保存在本地数据库。

        2:设置cookie来获取当前用户信息,请看代码:

    from django.template.response import TemplateResponse
    
    response = ''
    ctx = {}
    duoshuo_jwt_token = None
    if (request.user.id):
        token = {
            'short_name': '******',
            'user_key': request.user.id,
            'name': request.user.username,
        }
        ctx['profile'] = UserZn.objects.get(pk=request.user.id)
        ctx['duoshuo_jwt_token'] = duoshuo_jwt_token = jwt.encode(token, DUOSHUO_SECRET)

    ctx['product_info'] = Product.objects.get(pk = id)
    response = TemplateResponse(request, 'content.html', ctx)
    response.set_cookie('duoshuo_token', duoshuo_jwt_token)
    return response

            效果如下:

                2.png


四:当自己网站和移动端评论结合的时候,就需要吧移动端的评论同步到多说上去:

post_url = 'http://api.duoshuo.com/posts/import.json'
	posts=[{}]
	data = {
		'short_name':settings.DUOSHUO_SHORT_NAME,
		'secret':settings.DUOSHUO_SECRET,
		'posts[0][post_key]':'124',
		'posts[0][thread_key]':'subject_4',
		'posts[0][message]':'测试负极评论',
		'posts[0][parent_key]':'123'

	}
	info = requests.post(post_url, data = data)
	print info.json(),22222222222222

返回效果如下:blob.png